機械学習などの多くのデータを扱う際に避けては通れないデータビジュアライズですが、Pythonで行うにはどうすればいいのか。ということで、matplotlibというライブラリを用いて散布図の描き方について解説していきます。
3次元での散布図の描き方はこちら
Contents
matplotlibとは
プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。オブジェクト指向のAPIを提供しており、様々な種類のグラフを描画する能力を持つ。描画できるのは主に2次元のプロットだが、3次元プロットの機能も追加されてきている。描画したグラフを各種形式の画像(各種ベクトル画像形式も含む)として保存することもできる(Wiki参照)
ということで、2次元及び3次元のグラフをさくっとプロットできる非常にありがたいライブラリです。ちなみに、このロゴもmatplotlibで描いているものです。
インストール方法(Mac)
自分のPCにmatplotlibをインストールしなければ使う事ができません。まずはインストール方法から書いていきます。
ターミナルを立ち上げて、下記のコマンドを打てば問題なくインストールされました。ここでは、Pythonを立ち上げたりする必要はありません。(実際は、仮想環境を使ったりしているので仮想環境をActivateしたりはしていますが。。。)ちなみに、私はPython3.6.6を使用しています。
pip install matplotlib
import方法
ここからは、インストールしたmatplotlibをPythonプログラムで使うという宣言をしなければなりません。宣言方法が以下の記述です。
import matplotlib.pyplot as plt
これは、日本語訳するとmatplotlibパッケージの中のpyplotモジュールをpltという名前で使いますよという宣言です。これによって、グラフの表現をできるようになります。
基本ソース
まずは、最低これだけあればグラフが書けるというコードを示します。
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)とプロットされていきます。
問題なくプロットされてますね。では、次項以降で見た目をカスタマイズしていきます。
プロットの見た目をいじる
マーカーの色と形の変更し、凡例を付けるためにプログラムを修正します。
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()
元のソースから以下の選択部分を追加することで、プロットの見た目を変えて凡例をつけている部分です。
その他の見た目などを変更する主要なカスタマイズキーワードはTipsとして載せておきます。
凡例つくと少し「らしく」なりますね。ただ、星になったのは少しいただけませんね。ともかく、グラフの自体の見た目を変えていきましょう。目盛線と補助目盛線をつけて、グラフタイトルと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″ | 凡例名 |
色と形については、リファレンスを見ると以下のものが用意されています。
色見本
color example code: named_colors.py — Matplotlib 2.0.2 documentation
マーカー見本
lines_bars_and_markers example code: marker_reference.py — Matplotlib 2.0.2 documentation
グラフの見た目をいじる
目盛線と補助目盛線をつけ、さらにX軸に「X」、Y軸に「Y」などそれぞれの軸にラベルを付けるためにプログラムを修正します。
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()
コメントを入れている部分を追加することで見た目のカスタマイズを行います。実際のグラフが以下のものです。ちなみに、さすがに星はやめて四角にしました。
かなりらしくなってきましたね。これを資料に貼るだけでもテクってる感出ますかね?
では、最後に複数データを同じグラフに入れてみましょう。
【応用】複数データを一つのグラフで表現する
一つのグラフに複数のプロットを記述するのは難しくありません。実際にやってみます。ただ表示を行う前に、もう一つscatterを追加するだけです。
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()
で、実際にプログラムを実行したら以下のプロットが表示されます。
いかがでしたか?これで、散布図の基礎を押さえることはできたかと思います。