しぷぜん

しぷぜん

素人プログラマなおいがStep Zero to Oneしていくブログ

Pythonでデータを可視化するmatplotlib入門(散布図編)

こんにちは、なおいです。

機械学習に欠かせないであろうデータの可視化が私にも必要になってきました。

一番有名なmatplotlibというライブラリをご多分にもれずやっていきたいと思います。

 

 

matplotlibとは?

f:id:ct-innovation01:20170927160405p:plain

プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。オブジェクト指向APIを提供しており、様々な種類のグラフを描画する能力を持つ。描画できるのは主に2次元のプロットだが、3次元プロットの機能も追加されてきている。描画したグラフを各種形式の画像(各種ベクトル画像形式も含む)として保存することもできるし、wxPython、Qt、GTKといった一般的なGUIツールキット製のアプリケーションにグラフの描画機能を組みこむこともできる。MATLABの対話環境のようなものを提供するpylabというインタフェースも持っている。Matplotlibは、BSDスタイルのライセンスの下で配布されている。(Wiki参照

 

ということで、2次元及び3次元のグラフをさくっとプロットできる非常にありがたいライブラリです。

 

インストール方法(Mac

pip install matplotlib

私はPython3.6.1を使用しており、上記のコマンドをターミナルで打てば問題なくインストールされました。(実際は、仮想環境を使ったりしているので仮想環境をActivateしたりはしていますが。。。)

 

import方法

import matplotlib.pyplot as plt

 一番よくいろんなサイトに載っている方法はこれだと思います。私もこの方法でやりたいと思います。matplotlibパッケージの中のpyplotモジュールをpltという名前で使うという宣言です。これによって、このあとpltで色々できるようになるという感じです。

 

散布図(ポイント)のプロット

1.基本
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [9, 8, 7, 6, 5]

plt.scatter(x,y)
plt.show()

 なんにも設定がいらなければ、これだけで散布図(ポイント)をプロットできます。

プロットした結果は以下の通りで、xとyは配列になっていて同じ数であれば、x[0]とy[0]の場所にプロットしてくれるため(1,9)となり、そのあとも同じインデックス同士の(2,8)、(3,7)、(4,6)、(5,5)とプロットされていくはずです。

 

f:id:ct-innovation01:20170927002653p:plain 

問題なくプロットされてますね。あとは見た目をカスタマイズしていきます。

 

2.プロットの見た目をいじる
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [9, 8, 7, 6, 5]

plt.scatter(x,y, marker='*',c='red',label='test')
plt.legend() #凡例
plt.show()

 赤文字部を追加することでプロットの見た目を変えて、凡例をつけられます。scatterに付けられる主要なカスタマイズキーワードは表形式でグラフの後に載せときます。

 

f:id:ct-innovation01:20170927004159p:plain

凡例つくだけでちょっとグラフっぽくなりますね。星になったのは少しいただけませんかね・・・ともかく、次は目盛線と補助目盛線をつけて、グラフタイトルとX軸Y軸のラベルを入れましょう。

 

Tips)プロットに付与できる主要なカスタマイズキーワード

主要と書いている通り、もっとたくさんキーワードはあります。より細かい指定で様々な散布図が描けますが、最低限これだけおさえてれいれば、普通のグラフは書けるかなという範囲のみ記載しておきます。

kywd 入力例 備考
x,y [1,2,3,4,5] または 事前に定義したlistなど array形式のもの
※必須
s s=5 または
x,yと同範囲のリスト(要素はサイズ)
マーカーの大きさ
指定しないと20
c c="red" または
c="#FFFF00" または
c=(1.0,0,1.0)
マーカーの色
色名や16進数、RGBでの指定が可能
marker marker="." マーカーの形
指定しないと○
*は星形など様々指定可
alpha alpha=0.3 マーカーの透明度
指定は0-1の間で行う
linewidths linewidths=2 マーカーの枠線の幅
label label="label1" 凡例名

色と形については、リファレンスを見ると以下のものが用意されているみたいです。

f:id:ct-innovation01:20170927115343p:plain

color example code: named_colors.py — Matplotlib 2.0.2 documentation

f:id:ct-innovation01:20170927115403p:plainf:id:ct-innovation01:20170927115416p:plain

lines_bars_and_markers example code: marker_reference.py — Matplotlib 2.0.2 documentation

 

3.グラフの見た目をいじる
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [9, 8, 7, 6, 5]

plt.scatter(x,y, marker='s',c='red',label='test')
plt.legend()
plt.grid(True) #グリッド線
plt.xlabel("X-label") #X軸ラベル
plt.ylabel("Y-label") #Y軸ラベル
plt.title("TEST GRAPH") #グラフタイトル
plt.show()

先ほど同様、赤文字部を追加することで見た目のカスタマイズを行いました。実際のグラフが以下のものです。ちなみに、さすがに星はやめて四角にしました。

 

f:id:ct-innovation01:20170928001147p:plain

 

かなりらしくなってきましたね。これを資料に貼るだけでもテクってる感出ますかね?

では、最後に複数データを同じグラフに入れてみましょう。

 

4.複数データを一つのグラフにプロットする
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [9, 8, 7, 6, 5]
y2 = [5, 6, 7, 8, 9]

plt.scatter(x,y, marker='s',c='red',label='test')
plt.scatter(x,y2, marker='p',c='blue',label='test2')
plt.legend()
plt.grid(True)
plt.xlabel("X-label")
plt.ylabel("Y-label")
plt.title("TEST GRAPH")
plt.show()

 同じグラフにプロットするだけなら、ただもう一行追加するだけでいいんですね。非常に簡単だし、ループを回す際もかなり楽に書けます。非常にありがたい。

 

f:id:ct-innovation01:20170928001402p:plain

 

いかがでしたか?これでとりあえず、散布図はいい感じにかけるようになりましたね。