matplotlib ライブラリーの subplot
メソッドを使うことで、一つの描画キャンパスを複数の領域に分割して、それぞれのサブ領域でグラフを作成することができるようになる。また、subplot
を使う場合、tight_layout
も合わせて利用することで、余白部分が自動的に調整されて、よりきれいなグラフが仕上がる。ただ、subplot
による領域分割は、等分割しかできない。等分割でないような分割を行いたいときは、subplot2grid を使用する。
subplot
を使うには、3 つの引数を渡す必要があり、subplot(2, 2, 1)
のように利用する(省略して subplot(221)
としても可)。最初の 2 つの引数は、分割数を表す。描画キャンパスを何行に分割するのかを 1 番目の引数で指定し、何列に分割するのかを 2 番目の引数で指定する。3 番目の引数に、これからグラフを描くのに利用するサブ領域の番号を入れる。例えば、描画キャンパスを 4 分割してあれば、サブ領域の番号は 1, 2, 3, 4 と決められている。基本的に、上から下、左から右の順位で、領域の番号がつけられる。
左右 2 分割
描画キャンパスを 1 行 2 列に分割するので、subplot(2, 1, i)
のよう指定する。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
sns.set_style('whitegrid')
sns.set_palette('gray')
np.random.seed(2018)
fig = plt.figure()
# top
x1 = np.random.uniform(0, 100, 20)
y1 = x1 * np.random.uniform(1, 2, 20)
ax1 = fig.add_subplot(1, 2, 1)
ax1.scatter(x1, y1)
ax1.set_xlabel("weight [g]")
ax1.set_ylabel("length [cm]")
ax1.set_xlim(0, 110)
ax1.set_ylim(0, 190)
# bottom
x2 = np.array(['ERS1', 'ERS2', 'ETR1', 'ETR2', 'EIN4'])
y2 = np.array([12.0, 3.1, 11.8, 2.9, 6.2])
x2_position = np.arange(len(x2))
ax2 = fig.add_subplot(1, 2, 2)
ax2.bar(x2_position, y2, tick_label=x2)
ax2.set_xlabel("gene")
ax2.set_ylabel("expression [log(TPM)]")
# show plots
fig.tight_layout()
fig.show()
上下 2 分割
描画キャンパスを 2 行 1 列に分割するので、subplot(1, 2, i)
のよう指定する。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
sns.set_style('whitegrid')
sns.set_palette('gray')
np.random.seed(2018)
fig = plt.figure()
# top
x1 = np.random.uniform(0, 100, 20)
y1 = x1 * np.random.uniform(1, 2, 20)
ax1 = fig.add_subplot(2, 1, 1)
ax1.scatter(x1, y1)
ax1.set_xlabel("weight [g]")
ax1.set_ylabel("length [cm]")
ax1.set_xlim(0, 110)
ax1.set_ylim(0, 190)
# bottom
x2 = np.array(['ERS1', 'ERS2', 'ETR1', 'ETR2', 'EIN4'])
y2 = np.array([12.0, 3.1, 11.8, 2.9, 6.2])
x2_position = np.arange(len(x2))
ax2 = fig.add_subplot(2, 1, 2)
ax2.bar(x2_position, y2, tick_label=x2)
ax2.set_xlabel("gene")
ax2.set_ylabel("expression [log(TPM)]")
# show plots
fig.tight_layout()
fig.show()
上下左右 4 分割
描画キャンパスを 2 行 2 列に分割するので、subplot(2, 2, i)
のよう指定する。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
plt.style.use('default')
sns.set()
sns.set_style('whitegrid')
sns.set_palette('gray')
np.random.seed(2018)
fig = plt.figure()
# top left
x1 = np.random.uniform(0, 100, 20)
y1 = x1 * np.random.uniform(1, 2, 20)
ax1 = fig.add_subplot(2, 2, 1)
ax1.scatter(x1, y1)
ax1.set_xlabel("weight [g]")
ax1.set_ylabel("length [cm]")
ax1.set_xlim(0, 110)
ax1.set_ylim(0, 190)
# top right
x2 = np.array(['ERS1', 'ERS2', 'ETR1', 'ETR2', 'EIN4'])
y2 = np.array([12.0, 3.1, 11.8, 2.9, 6.2])
x2_position = np.arange(len(x2))
ax2 = fig.add_subplot(2, 2, 2)
ax2.bar(x2_position, y2, tick_label=x2)
ax2.set_xlabel("gene")
ax2.set_ylabel("expression [log(TPM)]")
# bottom left
x3 = np.random.normal(0, 1, 100)
ax3 = fig.add_subplot(2, 2, 3)
ax3.hist(x3)
ax3.set_xlabel("length [cm]")
ax3.set_ylabel("frequency")
# bottom right
x4 = [0, 1, 2, 3, 4, 5]
y4 = np.array([11, 23, 27, 32, 18, 5])
ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(x4, y4)
ax4.set_xlabel("time [hour]")
ax4.set_ylabel("gene expression [log(TPM)]")
# show plots
fig.tight_layout()
fig.show()