[[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])
#vote(おもしろかった[5],そうでもない[0],わかりずらい[0])

皆様のご意見、ご希望をお待ちしております。
- ggplot in Sage <- ggplot in Python <- ggplot2 in R が分かりました。ありがとうございます。 -- [[ysato]] &new{2014-03-16 (日) 12:54:31};
- ysatoさま、コメントありがとうございます。RとSage間のデータフレームの変換関数を用意しました。[[sage/RとPandas(Sage)でのデータフレームの相互変換]]をご覧下さい -- [[竹本 浩]] &new{2014-03-16 (日) 17:10:15};
- ysatoさま、[[sage/データ解析のための統計モデリング入門勉強ノート第2章]]を追加しました。 -- [[竹本 浩]] &new{2014-03-17 (月) 12:30:29};
- コメントありがとうございます。ダウンロードしてsage サーバーで実行してみました。既に環境が整っているのでスムーズに確認しました。理解を深めるために ipython でも実行してみました。Sage/R と Pandas(Python) は 3つが関連しているので難しいです。  -- [[ysato]] &new{2014-03-20 (木) 12:16:11};
- このページをきっかけに Mathematicaで ggplot2(R) を実行することができました。ありがとうございます。http://mmays.hatenablog.com/entry/2014/03/24/155244 -- [[ysato ]] &new{2014-03-25 (火) 08:25:23};
- このページをきっかけに IPython で Sage関数を実行できました。すばらしい環境です。http://mmays.hatenablog.com/entry/2014/03/30/135552 -- [[ysato ]] &new{2014-03-30 (日) 14:13:42};
- 最初のmeat の例題の前に、 import pandas as pd が必要です。 -- [[ysato]] &new{2014-10-08 (水) 18:23:31};
- gg= ggplot(..); ggsave( gg, 'sample1.png' ) と思います。https://github.com/yhat/ggplot/issues/140 -- [[ysato]] &new{2014-10-13 (月) 08:57:07};
- ysatoさま、ご指摘ありがとうございます。確かに一端<ggplot: (32741753)>の画面がでてからでないとグラフがでないのは、ご指摘の箇所が原因なのかも知れません。(申し訳ありませんすぐに確認できません。しばらくお待ち下さい) -- [[竹本 浩]] &new{2014-10-13 (月) 10:09:10};
- ggplot(mtcars, aes('factor(cyl)')) がエラーになります。sage の factor とggplot の factor が競合しているのではないでしょうか。解決法がありましららよろしくお願いします。 -- [[ysato]] &new{2014-10-13 (月) 14:51:44};

#comment_kcaptcha


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