FrontPage

2014/01/26からのアクセス回数 3856

ここで紹介した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

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

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

Sageへのggplotのインストール

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

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を以下の様にローディングします。

sageへの入力:

from ggplot import *

meatの例題

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

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

sageへの入力:

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からの出力:

<ggplot: (31845893)>

Sageで図の表示

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

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

sageへの入力:

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

sageからの出力:

sample1.png

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

sageへの入力:

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

sageからの出力:

Saving 11.0 x 8.0 in image.

sample1.png

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

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

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

sageへの入力:

# geom_pointの例
ggplot(diamonds, aes('carat', 'price')) + \
    geom_point(alpha=1/20.) + \
    ylim(0, 20000)

sageからの出力:

<ggplot: (32227289)>

sageへの入力:

ggsave("sample2.png", dpi=50)

sageからの出力:

Saving 11.0 x 8.0 in image.

sample2.png

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

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

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

sageへの入力:

# geom_histogramの例
p = ggplot(aes(x='carat'), data=diamonds)
p + geom_histogram() + ggtitle("Histogram of Diamond Carats") + labs("Carats", "Freq")

sageからの出力:

binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
<ggplot: (31854697)>

sageへの入力:

ggsave("sample3.png", dpi=50)

sageからの出力:

Saving 11.0 x 8.0 in image.

sample3.png

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

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

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

sageへの入力:

# geom_densityの例
ggplot(diamonds, aes(x='price', color='cut')) + \
    geom_density()

sageからの出力:

<ggplot: (33161229)>

sageへの入力:

ggsave("sample4.png", dpi=50)

sageからの出力:

Saving 11.0 x 8.0 in image.

sample4.png

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

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

sageへの入力:

# pandasのデータを使用する
import pandas as pd
meat_lng = pd.melt(meat[['date', 'beef', 'broilers', 'pork']], id_vars=['date'])

#pre{{
}}

sageへの入力:

# geom_densityのグラフを塗る例 (alpha=0.3を付けるとエラーとなる)
p = ggplot(aes(x='value', colour='variable', fill=True), data=meat_lng)
p + geom_density()

sageからの出力:

<ggplot: (33316793)>

sageへの入力:

ggsave("sample5.png", dpi=50)

sageからの出力:

Saving 11.0 x 8.0 in image.

sample5.png

棒グラフ

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

sageへの入力:

# geom_barの例
p = ggplot(mtcars, aes('factor(cyl)'))
p + geom_bar()

sageからの出力:

<ggplot: (32741753)>

sageへの入力:

ggsave("sample6.png", dpi=50)

sageからの出力:

Saving 11.0 x 8.0 in image.

sample6.png

コメント

選択肢 投票
おもしろかった 2  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc