ggplot_in_sage

3177 days ago by takepwave

Hiroshi TAKEMOTO (take@pwv.co.jp)

ggplot in Sage

pythonでRのggplot2と同様のグラフを出力するライブラリggplotをsageにインストールしてみました。

ggplot2で使用するnumpyとバージョンを合わせるために、SageもVersion 6.0にアップグレードしました。

Sageへのggplotのインストール

ggplotをインストールするために、以下のライブラリをインストールします。

  • patsy
  • statsmodels

patsyのインストール

Sageの環境でpythonパッケージをインストールするためにsageを-shオプション付きで起動します。

$ /usr/local/sage-6.0/sage -sh
(sage-sh) $ easy_install patsy	

statsmodelsのインストール

statsmodelsはeasy_installが使えなかったので、ソースからインストールしました。

(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をインストールします。

(sage-sh) $ easy_install ggplot

ggplotの例題

yhat氏のggplotのサイト にあるExamplesをSageで実行してみます。

ggplotのローディング

最初に、ggplotを以下の様にローディングします。

import pandas as pd from ggplot import * 
       

meatの例題

アメリカの肉のデータ(meatデータフレーム)からbeef, pork, broilersの値の 散布図とスムーズ化した曲線を一緒にプロットする例題です。

ggplotで使用するデータとaesで軸や色の情報を渡して、geom_poinで散布図、stat_smoothで スムーズ曲線を追加するだけで、簡単に図化できるのがRのggplot2の特徴ですが、yhat氏が pythonで作られたggplotは、バージョン0.4.5ではありますが、かなりRのggplot2に近づいています。

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(span=0.05) # stat_smooth(color='red')から変更 
       
<ggplot: (8740555478573)>
<ggplot: (8740555478573)>

Sageで図の表示

pythonではそのままグラフが表示されますが、Sageではそのままでは図が表示されません。

調べたところ、pylabのsavefigを使うことでSageでも表示できることが分かりました。 そのままでは、図が大きく表示されるため、dpiオプションでサイズを調整しています。

# そのままでは出力されないので、pylabのsavefigを使って保存するとSageで表示される # そのままでは、画像が大きいのでdpi指定でサイズを小さくしている import pylab as pl pl.savefig("sample1.png", dpi=50) 
       

pylabのsavefigと同様の機能がggplotにも用意されており、ggsaveを呼び出すことで sageで図が表示されます。

# 同様の処理がggsaveを使ってできます。 ggsave("sample1.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.

ダイヤモンドのカラットと価格の関係

散布図の軸の設定もylim, xlimを使って調整することができます。

以下の例は、ダイヤモンドのカラットと価格の関係を散布図で表示した結果です。

# geom_pointの例 ggplot(diamonds, aes('carat', 'price')) + \ geom_point(alpha=1/20.) + \ ylim(0, 20000) 
       
<ggplot: (8740556629177)>
<ggplot: (8740556629177)>
ggsave("sample2.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.

ダイヤモンドの大きさ(カラット)と発掘頻度の関係

ヒストグラム(度数分布図)は、geom_histogramを使って表示します。グラフのタイトルは、ggtitleで指定し、 軸名称はlabsで指定します。

以下の例は、ダイヤモンドの大きさ(カラット)と発掘頻度の関係をヒストグラムで表示した結果です。

# geom_histogramの例 p = ggplot(aes(x='carat'), data=diamonds) p + geom_histogram() + ggtitle("Histogram of Diamond Carats") + labs("Carats", "Freq") 
       
<ggplot: (8740556534189)>
<ggplot: (8740556534189)>
ggsave("sample3.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.

カット別の価格別の密度分布の表示

aesのcolor指定に変数cutを指定することによってcutの種類毎に別々の密度分布をプロットすることができます。

以下の例は、ダイヤモンドの価格の密度分布をカット別に表示して結果です。

# geom_densityの例 ggplot(diamonds, aes(x='price', color='cut')) + \ geom_density() 
       
<ggplot: (8740556130545)>
<ggplot: (8740556130545)>
ggsave("sample4.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.

肉の種類別の出荷数の密度分布

pandasライブラリのmelt関数を使ってカラム別に集計してある結果をvariableカラムにまとめて、 その結果をcolour(colorの別名)にvariableを指定することで種類別のプロットを表示しています。 (とてもすごくて何がどうなっているのかすぐには分かりませんでした)

# pandasのデータを使用する import pandas as pd meat_lng = pd.melt(meat[['date', 'beef', 'broilers', 'pork']], id_vars=['date']) 
       
# geom_densityのグラフを塗る例 (fill=variable) Y.Satoさんの報告でalpha=0.3を復活 p = ggplot(aes(x='value', color='variable', fill='variable'), data=meat_lng) p + geom_density(alpha=0.3) 
       
<ggplot: (8740556534053)>
<ggplot: (8740556534053)>
ggsave("sample5.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.

棒グラフ

最後に棒グラフをgeom_barを使って表示しています。 この時、シリンダーのfactorを指定しています。(この使い方がイマイチ分かっていません)

# geom_barの例 # factor(cyl)は、cylに変更しました。 p = ggplot(mtcars, aes(x='cyl')) p + geom_bar() 
       
<ggplot: (8789227526537)>
<ggplot: (8789227526537)>
ggsave("sample6.png", dpi=50) 
       
Saving 11.0 x 8.0 in image.
Saving 11.0 x 8.0 in image.