2024.6.25 複数グラフのプロット【matplotlib】
matplotlib.pyplotのsubplotを用いると一枚の図に複数グラフを記載することができる。主な使い方は以下の通り。
plt.subplot(x, y, n)
一枚の画像を縦x個、横y個に分割し、これ以降実行するplot命令を、そのうちのn番目の区画にプロットする
code:subplot1.py
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 10, 1024)
f1 = np.sin(t)
f2 = np.cos(2*t) + np.cos(3*t)
f3 = abs(np.sin(t))
plt.subplot(2, 2, 1)
plt.title('area1')
plt.plot(t, f1)
plt.subplot(2, 2, 2)
plt.title('area2')
plt.plot(t, f2)
plt.subplot(2, 2, 3)
plt.title('area3')
plt.plot(t, f3)
plt.show()
https://scrapbox.io/files/667a0081b1add9001d8fd248.png
領域分割を途中で変更することも可能であり、次のようにぶち抜きレイアウトを実現することができる。
code:subplot2.py
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 10, 1024)
f1 = np.sin(t)
f2 = np.cos(2*t) + np.cos(3*t)
f3 = abs(np.sin(t))
plt.subplot(2, 2, 1)
plt.title('area1')
plt.plot(t, f1)
plt.subplot(2, 2, 2)
plt.title('area2')
plt.grid()
plt.plot(t, f2)
plt.subplot(2, 1, 2) # 2x1の領域2にプロット
plt.title('area3')
plt.plot(t, f3)
plt.subplots_adjust(wspace=0.2, hspace=0.4) # 余白設定
plt.show()
https://scrapbox.io/files/667a02f969d1c0001d3711b9.png
個別のグラフに対してより詳細な設定を施すには、figureオブジェクトを利用する。
code:subplot3.py
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 10, 1024)
f1 = np.sin(t)
f2 = np.cos(2*t) + np.cos(3*t)
f3 = abs(np.sin(t))
fig1 = plt.figure()
ax1 = fig1.add_subplot(2, 2, 1)
ax1.set_title('area1')
ax1.plot(t, f1)
ax2 = fig1.add_subplot(2, 2, 2)
ax2.set_title('area2')
ax2.plot(t, f2)
ax3 = fig1.add_subplot(2, 1, 2)
ax3.set_title('area3')
ax3.plot(t, f3)
plt.subplots_adjust(wspace=0.2, hspace=0.4)
plt.show()
急いでいる人は次のように ax を上書きする形で記述しても構わない。但し、上書きされたaxオブジェクトに後から設定を追加することはできない。
code:subplot4.py
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 10, 1024)
f1 = np.sin(t)
f2 = np.cos(2*t) + np.cos(3*t)
f3 = abs(np.sin(t))
fig = plt.figure()
ax = fig.add_subplot(2, 2, 1)
ax.set_title('area1')
ax.plot(t, f1)
ax = fig.add_subplot(2, 2, 2)
ax.set_title('area2')
ax.plot(t, f2)
ax = fig.add_subplot(2, 1, 2)
ax.set_title('area3')
ax.plot(t, f3)
plt.subplots_adjust(wspace=0.2, hspace=0.4)
plt.show()