[[FrontPage]] #contents 2014/01/26からのアクセス回数 &counter; ここで紹介したSageワークシートは、以下のURLからダウンロードできます。 http://www15191ue.sakura.ne.jp:8000/home/pub/34/ また、Sageのサーバを公開しているサイト(http://www.sagenb.org/, http://www15191ue.sakura.ne.jp:8000/)にユーザIDを作成することで、ダウンロードしたワークシートを アップロードし、実行したり、変更していろいろ動きを試すことができます。 * ggplot in Sage [#od587f67] pythonでRのggplot2と同様のグラフを出力するライブラリggplotをsageにインストールしてみました。 ggplot2で使用するnumpyとバージョンを合わせるために、SageもVersion 6.0にアップグレードしました。 ** Sageへのggplotのインストール [#l6db042c] ggplotをインストールするために、以下のライブラリをインストールします。 - patsy - statsmodels *** patsyのインストール [#vcb66d03] Sageの環境でpythonパッケージをインストールするためにsageを-shオプション付きで起動します。 #pre{{ $ /usr/local/sage-6.0/sage -sh (sage-sh) $ easy_install patsy }} *** statsmodelsのインストール [#hfde45db] statsmodelsはeasy_installが使えなかったので、ソースからインストールしました。 #pre{{ (sage-sh) $ git clone git://github.com/statsmodels/statsmodels.git (sage-sh) $ cd statsmodels (sage-sh) $ python setup.py build 正常に終了したのを確認してから (sage-sh) $ python setup.py install }} 準備ができたので、最後にggplotをインストールします。 #pre{{ (sage-sh) $ easy_install ggplot }} ** ggplotの例題 [#de3f55cc] [[yhat氏のggplotのサイト>https://github.com/yhat/ggplot/]] にあるExamplesをSageで実行してみます。 *** ggplotのローディング [#g987754b] 最初に、ggplotを以下の様にローディングします。 sageへの入力: #pre{{ from ggplot import * }} *** meatの例題 [#q17ae79d] アメリカの肉のデータ(meatデータフレーム)からbeef, pork, broilersの値の 散布図とスムーズ化した曲線を一緒にプロットする例題です。 ggplotで使用するデータとaesで軸や色の情報を渡して、geom_poinで散布図、stat_smoothで スムーズ曲線を追加するだけで、簡単に図化できるのがRのggplot2の特徴ですが、yhat氏が pythonで作られたggplotは、バージョン0.4.5ではありますが、かなりRのggplot2に近づいています。 sageへの入力: #pre{{ meat_lng = pd.melt(meat[['date', 'beef', 'pork', 'broilers']], id_vars='date') ggplot(aes(x='date', y='value', colour='variable'), data=meat_lng) + \ geom_point() + \ stat_smooth(color='red') }} sageからの出力: #pre{{ <ggplot: (31845893)> }} *** Sageで図の表示 [#b44a9895] pythonではそのままグラフが表示されますが、Sageではそのままでは図が表示されません。 調べたところ、pylabのsavefigを使うことでSageでも表示できることが分かりました。 そのままでは、図が大きく表示されるため、dpiオプションでサイズを調整しています。 sageへの入力: #pre{{ # そのままでは出力されないので、pylabのsavefigを使って保存するとSageで表示される # そのままでは、画像が大きいのでdpi指定でサイズを小さくしている import pylab as pl pl.savefig("sample1.png", dpi=50) }} sageからの出力: &ref(sample1.png); pylabのsavefigと同様の機能がggplotにも用意されており、ggsaveを呼び出すことで sageで図が表示されます。 sageへの入力: #pre{{ # 同様の処理がggsaveを使ってできます。 ggsave("sample1.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample1.png); *** ダイヤモンドのカラットと価格の関係 [#p7184bdc] 散布図の軸の設定もylim, xlimを使って調整することができます。 以下の例は、ダイヤモンドのカラットと価格の関係を散布図で表示した結果です。 sageへの入力: #pre{{ # geom_pointの例 ggplot(diamonds, aes('carat', 'price')) + \ geom_point(alpha=1/20.) + \ ylim(0, 20000) }} sageからの出力: #pre{{ <ggplot: (32227289)> }} sageへの入力: #pre{{ ggsave("sample2.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample2.png); *** ダイヤモンドの大きさ(カラット)と発掘頻度の関係 [#e0a0e69c] ヒストグラム(度数分布図)は、geom_histogramを使って表示します。グラフのタイトルは、ggtitleで指定し、 軸名称はlabsで指定します。 以下の例は、ダイヤモンドの大きさ(カラット)と発掘頻度の関係をヒストグラムで表示した結果です。 sageへの入力: #pre{{ # geom_histogramの例 p = ggplot(aes(x='carat'), data=diamonds) p + geom_histogram() + ggtitle("Histogram of Diamond Carats") + labs("Carats", "Freq") }} sageからの出力: #pre{{ binwidth defaulted to range/30. Use 'binwidth = x' to adjust this. <ggplot: (31854697)> }} sageへの入力: #pre{{ ggsave("sample3.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample3.png); *** カット別の価格別の密度分布の表示 [#q153274f] aesのcolor指定に変数cutを指定することによってcutの種類毎に別々の密度分布をプロットすることができます。 以下の例は、ダイヤモンドの価格の密度分布をカット別に表示して結果です。 sageへの入力: #pre{{ # geom_densityの例 ggplot(diamonds, aes(x='price', color='cut')) + \ geom_density() }} sageからの出力: #pre{{ <ggplot: (33161229)> }} sageへの入力: #pre{{ ggsave("sample4.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample4.png); *** 肉の種類別の出荷数の密度分布 [#l8f406ad] pandasライブラリのmelt関数を使ってカラム別に集計してある結果をvariableカラムにまとめて、 その結果をcolour(colorの別名)にvariableを指定することで種類別のプロットを表示しています。 (とてもすごくて何がどうなっているのかすぐには分かりませんでした) sageへの入力: #pre{{ # pandasのデータを使用する import pandas as pd meat_lng = pd.melt(meat[['date', 'beef', 'broilers', 'pork']], id_vars=['date']) }} #pre{{ }} sageへの入力: #pre{{ # geom_densityのグラフを塗る例 (alpha=0.3を付けるとエラーとなる) p = ggplot(aes(x='value', colour='variable', fill=True), data=meat_lng) p + geom_density() }} sageからの出力: #pre{{ <ggplot: (33316793)> }} sageへの入力: #pre{{ ggsave("sample5.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample5.png); *** 棒グラフ [#z32c7fe9] 最後に棒グラフをgeom_barを使って表示しています。 この時、シリンダーのfactorを指定しています。(この使い方がイマイチ分かっていません) sageへの入力: #pre{{ # geom_barの例 p = ggplot(mtcars, aes('factor(cyl)')) p + geom_bar() }} sageからの出力: #pre{{ <ggplot: (32741753)> }} sageへの入力: #pre{{ ggsave("sample6.png", dpi=50) }} sageからの出力: #pre{{ Saving 11.0 x 8.0 in image. }} &ref(sample6.png); ** コメント [#qd3d1f45] #vote(おもしろかった[2],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha