pythonでのグラフ作成
pythonでの描画・グラフ作成は、文法のようにシンプルかと思いきや、実は結構ややこしく、データ分析初学者の混乱するポイントが何か所か存在します。まあグラフ作成のやり方自体はシンプルなのですが、体系付けられていない感じです。
Matplotlibとseabornの存在
まずpythonで描画やグラフ作成をするにあたってややこしいのが、Matplotlibとseabornという2種類のライブラリが存在する点です。最初のうちはどっちを使えばいいのか分かりません。
まあ現在はMatplotlibがよく使われているので、詳しい使い方を取り上げている参考書も結構ありますし、個人的には最初はMatplotlibを使うのが、オススメです。
ちなみにMatplotlibと対をなすseabornという作画ライブラリは、Matplotlibの進化系でMatplotlibよりもグラフが綺麗に書けます。ただ新しいので日本語の資料や情報がMatplotlibよりも少ないです。
まあ個人的な話をすると最近seabornを勉強中なんですけどディープラーニング系のライブラリみたいな絶対覚えておかないと困るというほどのものでもないので、あまりモチベが上がりません。
とりあえず今回は現在主流であるMatplotlibについて取り上げていきます。seabornについてはまた学習した暁には記事にしようと思います。
Matplotlibはちょっとややこしい
そしてMatplotlibの話に戻るわけですがこのMatplotlib、超便利なのは間違いないのですが、少しややこしい点があります。それは何かというとコードの書き方が2通りあるという点です。
というのも、ネットや参考書でMatplotlibのコードをいくつか見た人ならわかると思うのですが、Matplotlibには描画したいデータをplt.plot()を使って描画する方法とax.plot()を使って描画する2通りの書き方が存在します。
これが最初はごっちゃになって、単にデータを表示するだけなら問題ありませんが、軸や色の定義など細かい微調整をしたいときにハマるポイントになります。
というわけで今日は自分用にも改めてMatplotlibの使い方について、分かりやすく説明していきたいと思います。
基本はplt.plot()で問題なし
JupyterNotebookとかを使ってインタラクティブに描画する際はmatplotlib.pyplotモジュールの関数を利用するのが便利です。なぜかというと、plt.plot()だけで細かい設定をしなくても図が描画できるからです。
ですが、matplotlib.pyplotの関数を直接呼び出す方法は便利なのですが、その分弄れる箇所も少なく、描画した図の細かい設定を行うことが難しいです。
とりあえずデータの概要を把握するために視覚化したいというときはこっちでいいです。僕はブログに乗せているグラフとかはpltの方でパパっと作りますし、ぶっちゃけpltでも結構いいグラフが描けるので、公式ドキュメント推奨の書式もplt.plot()です。
ただ別仕事で人に見せたりプレゼンの資料に使うガチなグラフの場合は本当に細部まで細かく設定したいのでax.plot()を使いたいですね。
なので、簡単だけどカスタム範囲が限られてるplt.plot()、難しいけど極めれば凝ったグラフが作れるax.plot()といったようなイメージで押さえておけば問題ないと思います。まあどちらが優れているとかいう話ではなく単に一長一短の話です。
とりあえずまずは実際にpyplotの方でグラフを書いてみましょう。まず必要なライブラリをインポートして、プロットに使用するデータとして乱数を生成します。
#ライブラリのインポート import matplotlib.pyplot as plt import numpy as np from numpy.random import * #0~100までの乱数を100個作成する x = rand(100) * 100 + 0 print(x)
結果、以下のような0から100までの乱数が100個作れます。numpyの乱数を生成する関数であるrand()の仕様はrand(作る乱数の個数)*範囲+基準点です。この場合だと0~100の範囲で乱数を100個作れと指示しています。
同じように変数yの方も乱数を生成して、プロットします。
#乱数yを生成 y = rand(100) * 50 + 0 #x yに使用する変数を指定してプロット作成 plt.plot(x, y) #プロットしたグラフを表示する plt.show()
まあこれがMatplotlibでの基本の描画ですね。plot()にはx・yの2つの引数を用意する必要があります。そして、両者のデータをもとにグラフを作成するわけですが、この処理だけではまだ視覚化はできません。
plot()関数で作ったグラフをコンソールに表示させるためにはshow()関数を使う必要があります。.plot()でグラフを作成して、.show()で視覚化するのがMatplotlibの基本です。これはax.plot()の方でも変わりません。
次はここにラベルと判例・グリッド(縦横の線)を付けていきたいと思います。使うデータは前の変数x・yみたいな乱数データでも問題ないですが、こういうときは大体、三角関数のsinΘ・cosΘの関数曲線を使うのが、参考書とか読んでも一般的みたいなのでこのブログでも踏襲していきます。
numpyではsin・cosを計算するにあたってそれぞれ、np.sin(x)・np.cos(x) という便利な関数があり、この関数で簡単にデータを作れます。なお、ここでのxはラジアンで指定する必要があるため、度はラジアンに変換する必要があります。
# xの範囲を指定 x = np.linspace(-np.pi, np.pi, 360) # yになるsin・cosの数値配列を作成する ysin = np.sin(x) ycos = np.cos(x) # プロット plt.plot(x, ysin) plt.plot(x, ycos) #表示 plt.show()
<結果>
plt.plot()では、1つのデータしかグラフ化できないわけではなく.plot()した分だけデータを加えることも可能です(データの長さが違うとエラーが返ってくるので注意!)。
グラフの線の色は何も指定しない場合、pyplotが勝手に指定してくれてます(2つなら基本青とオレンジ)。ここも後述していますが、引数を設定すると色や線の形を変更できます。
そして、ここにx軸・y軸にラベルを付けて判例と縦横の線を加えることで、いかにも分析しました的な感じのクオリティのグラフをプロットしていきたいと思います。グラフを作るときは大体↓のような設定をすれば、見栄えのするグラフが作成できます。
# グラフのタイトルを指定する plt.title('sample') # データ(x.y)にそれぞれ凡例と色を指定する plt.plot(x, ysin,'m:', label='sinΘ') plt.plot(x, ycos,'g', label='cosΘ') #X軸とy軸のラベルを指定する plt.xlabel('samplex') plt.ylabel('sampley') #グラフに縦横線を入れる plt.grid(which='both') #凡例を反映させる plt.legend() #グラフを表示させる plt.show()
<結果>
コードの解説をしていくとまず、>plt.title(‘タイトル名’)でグラフの上部に表示するタイトルを指定できます。今回はsmapleとしています。作業環境によってはここを日本語にすると文字化けすることがあります。
次の>plt.plot(x, ysin,’m’,label=’sinΘ’)は、最初のx,ysinの部分でさっきと同じように曲線のプロットをしています。
さっきと違うのがそこから後に引数が追加されている点ですね。まず’m’は色の指定をしています。mはマジェンタを意味しています。もちろん他の色も指定できます。
・pltplotで使える色を指定する引数一覧
赤 | r |
青 | b |
黄 | y |
緑 | g |
シアン | c |
マジェンタ | m |
黒 | k |
そして色の後ろにさらに引数を追加することでグラフの形状も指定できます。今回の場合だとm:になっていますが、これはマジェンタの点線を指定しています。
・グラフの形状指定に使える引数まとめ
点線 | : |
実線 | – |
破線 | — |
破線2 | -. |
三角形 | ^ |
四角形 | s |
丸 | o |
上の例のようにこれらは2つ別々に指定するのではなく1つに繋げて指定します。片方だけの場合もう片方は自動で指定されます。最後の’label=~’は凡例を表示させるときに出てくるテキストです。
次のplt.xlabel(‘samplex’)・plt.ylabel(‘sampley’)はグラフのx軸.y軸それぞれにつけるラベルの指定しています。
そして、plt.grid(which=’both’)でグラフに縦横の線を入れることができます。このplt.grid()はドキュメントを読むと分かりますが非常に細かい引数があります。とりあえずグラフの背景に適当な縦線と横線を入れたい場合は(which=’both’)としておけば大丈夫です。
縦の線と横の線を同じ色や形状でいい場合はこれで問題ありませんが、縦は実線、横は点線とかにしたい場合にはpyplot()と時と同じ容量で、縦横別々に定義して指定する必要があります。
例えば、こんな感じです↓
plt.grid(which='both', axis='x', color='black', alpha=1, linestyle='--', linewidth=2) plt.grid(which='both', axis='y', color='red', alpha=0.5, linestyle=':', linewidth=1)
<結果>
最初のwhich=~の引数はなんかよく分かりませんが、とりあえずbothで問題ないと思います。(知ってる方はコメントで教えてくださると幸いです)
次のaxis=~はx軸(横線)かy軸(縦線)かの指定です。color=~は色の指定で、##0000みたいな色コードでもredみたいな文字でも指定できます。そして、alpha~は透明度を設定する引数で数値が小さいほど線が薄くなります。
linestyle~は線の形状で、先ほどの’:’と同じように設定します。最後のlinewidth~は線の太さで数値を大きくすると線は太くなります。ちなみに出力する画像サイズの変更と画像の保存は以下のような記述で可能です。
# 出力する画像のサイズを拡大する from pylab import rcParams rcParams['figure.figsize'] = 10,10 # 出力した画像を保存する plt.savefig('sample.png')
※プロットした画像の保存はplt.show()のあとに実行しようとすると失敗するので注意してください。
終わり
以上がMatplotlibについての基本的な使い方です。これさえわかれば分析結果の報告に使う最低限のクオリティはあるグラフが作れると思います。ここに別のグラフを重ねたり、隣に並べたりしたいとなるとax.plot()を使う必要があります。
まあ一応plt.subplot()とかで整えるというやり方も無きにしも非ずですが、そういうときはax.plot()使うかなーって感じです。そして、グラフの色彩などをもっときれいにしたい場合はseabornというライブラリを使うことで可能になります。
初歩のことだけまとめてサクッと行くつもりだったのですが、実際に書き始めるとpyplotだけで結構な長さになってしまったので、ax.plot()・seabornについては別の記事に書こうと思います。
最後にデータ分析にJupyterNotebookを使い始めた人で、numpyやMatplotlibの使い方がイマイチ分からないという人には「データ分析ツールJupyter入門」という本がすごく参考になったので紹介しておきます。
この参考書は僕がJupyter初学者だったときにPandasやnumpy、Matplotlibでハマった点を全部取り上げていたので、pythonでデータ分析をしたいという人は絶対に持っておくべき一冊です。
他にもSeabornなどで基本的なグラフ作成だけではなくグラフをより綺麗に書きたいという人には「Matplotlib&Seaborn実装ハンドブック (Pythonライブラリ定番セレクション)」という本なら、Seabornでグラフをより鮮やかに描く方法が書いてあるのでオススメです。
コメント
[…] ・Matplotlibでのグラフ作成の方法をわかりやすく解説してみた […]
[…] 関連記事:【Python】Matplotlibでのグラフ作成の基本をわかりやすく解説する […]
[…] 参照:【Python】Matplotlibでのグラフ作成の基本をわかりやすく解説する […]