subplot

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()
subplot を利用してデバイスを上下 2 つのサブ領域に分けてグラフを描く。

上下 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()
subplot を利用してデバイスを左右 2 つのサブ領域に分けてグラフを描く。

上下左右 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()
subplot を利用してデバイスを上下左右 4 つのサブ領域に分けてグラフを描く。