建立多个子图表
使用 matplotlib 建立 figure 后,能透过 subplot() 和 subplots() 的方法,在同一张图片里建立多个子图表,这篇教学将会介绍如何建立多个子图表。
快速导览
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
子图表的位置
使用 subplot() 或 subplots() 的方法建立子图表时,会按照 row ( 垂直 )、column ( 水平 ) 的矩阵方式,将子图表放入对应的位置,下图表示拥有 3x3 和 3x2 个子图表的画布,各个子图表的 index ( 位置 ) 和排列顺序。
subplot 和 subplots 的差异
subplot(row, column, index)
建立单一个子图表,可以透过设定 nrows ( 垂直 )、ncols ( 水平 ) 和 index ( 位置 ) 参数,将子图表放在画布中指定的位置,使用时必须注意,同一张画布里 subplot() 方法的 row 和 column 设定必须相同,下方的例子会画出两个子图表 ( 221 可以写成 2,2,1,表示 nrows 2、ncols 2、index 1 )。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig = plt.figure() plt.subplot(221) plt.plot(x) plt.subplot(224) plt.plot(y) plt.show()如果不设定参数,默认画出“一张”子图表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig = plt.figure() plt.subplot() plt.plot(x) plt.show()subplots()
建立多个子图表,可以透过设定 nrows 和 ncols 参数建立子图表的二维数组,接着就能在指定的位置绘制子图表,下方的例子会画出两个子图表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0][0].plot(x) ax[1][1].plot(y) plt.show()如果不设定参数,默认画出“一张”子图表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots() ax.plot(x) plt.show()
使用 add_subplot
如果建立了一个空白的 figure,也可以透过 add_subplot() 的方法,将子图表添加到画布里指定的位置,add_subplot() 的用法和 subplot() 类似,添加时需要设定 nrows、ncols 和 index 参数,下方的例子会画出两个子图表。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [5,4,3,2,1]
fig = plt.figure()
fig.add_subplot(221)
plt.plot(x)
fig.add_subplot(224)
plt.plot(y)
plt.show()
设定子图表的间距
建立子图表后,默认会按照规划的位置排列,但如果子图表里包含了 title 或客制化的轴线格式,可能会发生位置重叠的状况,为了避免这些情况,matplotlib 提供下列几种调整子图表的方法:
tight_layout()
使用 tight_layout() 方法后,子图表会自动保持合适的间距。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.tight_layout() plt.show()subplots_adjust()
使用 tight_layout() 方法后,可以根据用户的设定,调整子图表的间距,tight_layout() 具有 left、right、bottom、top 四个比例参数,wspace 和 hspace 两个子图表空间参数。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.subplots_adjust(hspace=1, wspace=0.5, left=0.2) plt.show()subplot_tool()
subplot_tool() 会打开一个可调整的视窗 ( 需要 GPU 支援,Colab 会打开静态图片 ),可从上方看到目前子图表的间距设定。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.subplot_tool() plt.show()建立子图表时,加入 constrained_layout=True
在建立子图表时,加入 constrained_layout=True 参数,就会在产生子图表前,调整到最合适的位置。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2,constrained_layout = True) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.show()
跨栏或跨列的图表
使用 subplot2grid() 方法,可以建立“跨栏”或“跨列”的图表,subplot2grid() 有下列几个常用的参数:
|参数|说明| |shape|图表的大小,以 (int, int) 表示。| |loc|图表的起始位置,以 (int, int) 表示。| |rowspan|图表的跨列数值,默认 1。| |colspan|图表的跨栏数值,默认 1。|
下方的程序码执行后,除了两个 1x1 的图表,还会有一个 2x2 的图表出现在画布里。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [5,4,3,2,1]
fig = plt.figure()
plt.subplot2grid((3,3), (0, 1), rowspan=2, colspan=2)
# (3,3), (0, 1) 等同 (332)
plt.plot(x)
plt.subplot(331)
plt.plot(x)
plt.subplot(339)
plt.plot(y)
plt.show()
微信扫码关注
抖音扫码关注