【具体例で説明】Pythonでなるべく簡単にプロットする方法

こんにちは、unogram管理人のうのちゅ〜です。

今回は、Python (matplotlib) を使ってなるべく簡単にプロットする方法について、具体例を挙げて解説します。

数値計算ライブラリnumpyなどを使ってPythonでプログラムを書いたあと、可視化のためにプロットすることが多いでしょう。プロットの仕方を検索すると、figやらax (Axes)、add_subplotなどいろいろな構文が現れます。「自分がプロットしたいグラフを簡単に書くには結局どうしたらいいのだろう?」と感じたことがある方も多いでしょう

今回は、重ねたり並べたり、複数のグラフをプロットする場合のできるだけ簡単な方法を中心に解説していきたいと思います。

numpyについては、【numpyの基礎】ベクトルの生成、逆順、転置(行と列の入れ替え)【numpyの基礎】行列の基本(単位行列、乱数行列、線形代数)で解説しているので、こちらもご覧ください。

それでは見ていきましょう!



【具体例で説明】Pythonでなるべく簡単にプロットする方法

Pythonでグラフをプロットする場合、外部ライブラリmatplotlibをインポートします。数値計算ライブラリnumpyもインポートしておきましょう。

import matplotlib.pyplot as plt
import numpy as np

細かい設定をせず、とにかくプロットする

「とにかくグラフとして可視化したい」場合は以下のようにplt.plot(x,y)→plt.show()のみでプロットできます。

x =np.linspace(0,4*np.pi,100)
y = np.sin(x)

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

タイトル、軸ラベル、凡例を設定する

ただプロットするだけでなく、タイトルや軸ラベル、凡例を設定したい場合は以下のように書きます。

x =np.linspace(0,4*np.pi,100)
y = np.sin(x)

plt.plot(x,y, label='sin') # labelで凡例に表記する内容を設定
plt.legend() #凡例
plt.xlabel('x') #x軸のラベルを設定
plt.ylabel('y') #y軸のラベルを設定
plt.title('plot') #グラフのタイトルを設定
plt.show()

同一グラフ上に重ねて複数プロットする

同一グラフ上に重ねてプロットしたい場合は、単純にplt.plotを続けて記述します。3つ以上重ねたい場合も同様です。

x =np.linspace(0,4*np.pi,100)
y1 = np.sin(x)
y2 = np.cos(x) # 重ねてプロットしたい
y3 = 0.5*np.sin(x) # 重ねてプロットしたい

plt.plot(x,y1, label='sin') 
plt.plot(x,y2, label='cos') # 重ねてプロットしたいグラフを続けて記述
plt.plot(x,y3, label='sin2') # 重ねてプロットしたいグラフを続けて記述
plt.legend() 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('plot') 
plt.show()



複数のグラフを並べて表示する

複数のグラフを並べてマトリクス状に表示したい場合、少し記述の仕方が変わります

まず、複数のグラフが配置される土台のようなものを作る必要があります。fig=plt.figureと記述している部分が該当します。figsizeでこの土台であるfigを適当なサイズに設定しています。

続いて、figにグラフを配置していきます。グラフの配置は、ax=fig.add_subplotでaxesを配置し、plotで描画するという流れです。これを全てのaxesに対して行います。(121)は、1行2列のマトリクスの1番目((1,1)位置)に配置することを意味します。

x =np.linspace(0,4*np.pi,100)
y1 = np.sin(x)
y2 = np.cos(x)

# グラフやテキストが配置されるfigureを用意
fig = plt.figure(figsize=(10,4)) # figureのサイズを調整
# figureにプロットを配置
ax1 = fig.add_subplot(121) # 1行2列のプロットの(1,1)位置に配置
ax1.plot(x, y1)
ax2=fig.add_subplot(122) # 1行2列のプロットの(1,2)位置に配置
ax2.plot(x, y2)
plt.show()

並べた複数のグラフにタイトルやラベルを設定する

タイトルやラベルを設定したい場合、配置したaxesに対して行う点に注意してください。

また、2つのプロットでy軸が共通する場合は、削除して表示するといったことも可能です。下のように、ax2.set_yticks([])とするとy軸の目盛りが消えます。

ただ、このままだと隙間が相手不格好なので、plt.tight_layout()で隙間を詰めています。

x =np.linspace(0,4*np.pi,100)
y1 = np.sin(x)
y2 = np.cos(x)

fig = plt.figure(figsize=(10,4)) 
ax1 = fig.add_subplot(121)
ax1.plot(x, y1, label='sin')
ax2=fig.add_subplot(122)
ax2.plot(x, y2, label='cos')


ax1.legend() # ax1に凡例を設定
ax2.legend() # ax2に凡例を設定

ax1.set_title('sin') # ax1にタイトルを設定
ax2.set_title('cos') # ax2にタイトルを設定

ax1.set_xlabel('x') # ax1にx軸ラベルを設定
ax2.set_xlabel('x') # ax2にx軸ラベルを設定
ax1.set_ylabel('y') # ax1にy軸ラベルを設定

ax2.set_yticks([]) # ax2のy軸は重複するので削除
plt.tight_layout() # ax2のy軸があった部分の隙間を詰める

plt.show()



まとめ

今回は、Python (matplotlib) を使ってなるべく簡単にプロットする方法について、具体例を挙げて解説しました。これまでなんとなくプロットしていた方も、特に複数のプロットを重ねたり並べたりする場合にどうしたら良いか、整理することができたのではないかと思います。

次回は少し複雑な場合のプロットについても解説していこうと思います。

参考書学習は…

matplotlibのみを扱った参考書は少ないですが、numpyやpandasを含めて、データサイエンスに必要なライブラリを詳しく解説する以下の書籍がおすすめです。

また、どんなグラフを作ると効果的なのかわからず、雰囲気でグラフを作っていた方は、以下の書籍で効果的なグラフの選択について学ぶのも良いでしょう。

参考

Matplotlib: Python plotting