matplotlibでのグラフ描画まとめ

matplotlibとはpythonの描画ライブラリです。けっこう色んなオプションがついていて、大変便利です。研究室のmatlabは有料ライセンスで大学のネットワークに繋がないと動かず、自称ノマドワーカー(笑)としてはあまり使いたいものではない。そこでpythonでグラフの書き方とかマスターできると便利だなと思い、matplotlibについて調べてみました。

matplotlibの使い方は色々なところにまとまっているのですが、自分が使いたい部分が所々抜けていたりするので、自分なりにもまとめてみます。

準備
さて、まずインストールです。

はい簡単、と言いたいのですが、python2.7とかだとこれでは動かない場合があります。その場合は一回アンインストールして

とバージョン指定するとうまくいったりします。
以下、numpy,pandasも使うのでインストールしといてください。

簡単な使い方
・グラフの書き方(plot,show)
・ラベルのつけ方(xlabel,ylabel,title,legend)
・グラフの保存(savefig)

まずインポート

とりあえず描画してみましょう。基本的な使い方としては、x方向に刻み幅、y方向にxに対応する値をリストの形で入れることになります。

1

なんかカクカクしてますね。曲線とかはxの刻みを十分細くすることで滑らかになります。matlabを使ったことのある人は分かりやすいかと。
で、ただ滑らかにしてもしょうがないのでラベルをつけてみましょう。

test

だいぶ滑らかになりましたね。曲線の描画の場合はこんな感じで刻みを細くすると良いでしょう。
xlabel,ylabel,titleがそれぞれx軸、y軸、タイトルのラベルとなります。第二変数以降でフォントや大きさの設定ができます(なくても大丈夫です)。この時、「r”$\mu_0$”」のようにrをつけて$$で囲むことでTex形式で数式を書くことができます。
legendとしてリストかタプルを渡すことで、グラフのラベルを付けることができます。
また、savefigを使うことで画像としても保存できます。png,jpg,eps等色々な形式で保存できます。

複数グラフとオプション
・二つ以上のグラフの扱い(subplot)
・グラフのオプション(色や描き方)
・グラフ範囲の制限(xlim,ylim)
・グラフ内テキスト(text)

それではグラフが二つの場合について描画してみましょう

test2

こんな感じで行列を渡すと、各列が一つのグラフとして描画してくれます。
また、xlim,ylimでx軸、y軸の範囲を制限してくれています。

グラフを二つに分ける場合はsubplotを使います。

test3
これでグラフが見づらい場合は二つに分けることができます。ついでにプロットのオプションも設定していて、第二引数で”r-“とか”go”とか設定するとグラフの色やつなぎを変えることができます。
plt.textでテキストを入れることができます。subplotとかでグラフが小さくなった時に使うととても便利です。

ヒストグラム
・ヒストグラム(hist)
・ラベルの別の表記方法(legend)
今まで折れ線グラフでしたが、実際はもっと色々なグラフがあります。
よく使うものとしてヒストグラムがあります。

test4

plt.histでヒストグラムを表示できます。binsが中心軸、normedが表現方法(True:確率表記、False:頻度表記)、rangeが範囲、alphaが透過度、colorが色となります。
labelをhist内に指定した時はplt.legend()を行うことでラベルが表示されます。
ちなみに、この辺のhistの中のオプション(labelとかalphaとか)は他のplotとかにも使えたりするので、試してみると良いでしょう。




棒グラフ
・棒グラフ(bar,barh)
・軸の値の変更(xticks,yticks)
・画像サイズの変更(figsize)
棒グラフの書き方について説明します。棒といっても縦向き・横向き、並べて書く、積み上げ、色々とバリエーションがあります。

bar

面倒なので一気に載せてしまいました。たくさん画像を載せると、もっと画像を大きくしたい場合があります。その時は最初にfigsizeを指定すると良いでしょう。
barについては色々と書いてみましたが、全部説明するのは大変なので詳細はプログラム内の各コメントを見てください。
xticks,yticksを使って軸の値を書き換えることができます。

エラーバー付きグラフ
・エラーバー付きグラフ(errorbar)
・barのエラーバー
実験等でデータをとっていると、そのグラフの誤差はどれくらいなのかという話が必要になります。そういう時のエラーバー付きグラフ。
今までnumpyでしたが、行列の扱いが面倒になってきたので、おもむろにpandasを使います。

error

こんな感じ。legendのlocオプションでグラフラベルを左上に移動しました。

オブジェクト指向なグラフ描画
・add関連(add_subplot,add_axes)
・set関連(set_xlim,set_ylim,set_xlabel,set_ylabel,set_title)
・位置調整(sharey)
さて、さっきまではグラフを描画してからそのグラフに対してタイトルつけたりラベルつけたりしてましたが、そうすると、今どのグラフをいじっているんだっけっていうことが分かりにくくなります。そこで、オブジェクト指向。図をオブジェクトとして扱うことで、設定が明示的で分かりやすくなります。

add

てな感じですね。これは参考のサイトが詳しく説明しているので、分からなかったらそちらと見比べて見ると良いでしょう。

これでレポートやプレゼン資料でグラフの描画する時も困りませんね!

<参考>
ttp://d.hatena.ne.jp/y_n_c/20091122/1258842406
ttp://bicycle1885.hatenablog.com/entry/2014/02/14/023734
ttp://stat.biopapyrus.net/python/barplot.html




青空文庫の作品URLをとってくる

はい、それでは今回はクローリングということで、青空文庫の作者id入れると、作品のURLをとってくるプログラムでも書こうかと。

urllib2ってやつがホームページにアクセスするやつですね。で、BeautifulSoupっていうライブラリでホームページのコードから特定のタグを引っこ抜くという話になります。

てな感じですかね。今は標準出力にしてますけど、コメントアウトの部分をとればリストに入れることもできます。

後は、これから青空文庫の本文をクローリングすればいいわけですね!それはまたおいおい。

print文とzip,enumerate関数

python便利だけど、色々使い方忘れるので覚えてる細かいテクニックをメモっときたい。

・print文

・zip関数
複数のリストをまとめてくれる便利なやつ

いくつかのリストをまとめて処理するときに便利だったり

・enumate関数
for文で使ってインデックスつけて返してくれます。

眠くなったので、とりあえずこのくらいで。続きはまた今度

<参考>
http://python.civic-apps.com/zip-enumerate/