FrontPage

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

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

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

コメント

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

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

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

(Input image string)


添付ファイル: filesample6.png 1327件 [詳細] filesample5.png 1294件 [詳細] filesample4.png 1294件 [詳細] filesample3.png 1343件 [詳細] filesample2.png 1275件 [詳細] filesample1.png 1266件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-13 (月) 14:51:44 (3484d)
SmartDoc