pythonplt.subplot_PythonMatplotlibsubplot函数详解。。。使⽤ Matplotlib 除可以⽣成包含多条折线的复式折线图之外,它还允许在⼀张数据图上包含多个⼦图。
调⽤ subplot() 函数可以创建⼀个⼦图,然后程序就可以在⼦图上进⾏绘制。subplot(nrows, ncols, index, **kwargs) 函数的 nrows 参数指定将数据图区域分成多少⾏;ncols 参数指定将数据图区域分成多少列;index 参数指定获取第⼏个区域。
subplot() 函数也⽀持直接传⼊⼀个三位数的参数,其中第⼀位数将作为 nrows 参数;第⼆位数将作为 ncols 参数;第三位数将作为index 参数。用subplot函数
下⾯程序⽰范了⽣成多个⼦图:
import matplotlib.pyplot as plt import numpy as np plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data =
np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将整个figure分成两⾏两列,第三个参数表⽰该图形放在第1个⽹格
plt.subplot(2, 2, 1) # 绘制正弦曲线 plt.plot(x_data, np.sin(x_data)) a().spines['right'].set_color('none')
plt.subplot(222) # 绘制余弦曲线 plt.plot(x_data, np.cos(x_data)) a().spines['right'].set_color('none')
plt.subplot(223) # 绘制正切曲线 plt.plot(x_data, np.tan(x_data)) a().spines['right'].set_color('none')
上⾯程序多次调⽤ subplot() 函数来⽣成⼦图,每次调⽤ subplot() 函数之后的代码表⽰在该⼦图区域绘图。上⾯程序将整个数据图区域分成 2×2 的⽹格,程序分别在第 1 个⽹格中绘制正弦曲线,在第 2 个⽹格中绘制余弦曲线,在第 3 个⽹格中绘制正切曲线。
可能有读者感到疑问,plot() 函数不是⽤于绘制折线图的吗?怎么此处还可⽤于绘制正弦曲线、余弦曲线呢?
其实此处绘制的依然是折线图。看程序中的 ① 号代码调⽤ numpy 的 linspace() 函数⽣成了⼀个包含多个数值的列表,该数值列表的范围是从 -pi 到 pi,平均分成 64 个数据点,程序中⽤到的 numpy.sin()、s()、numpy.tan() 等函数也返回⼀个列表:传⼊这些函数的列表包含多少个值,这些函数返问的列表也包含多少个值。
这意味着上⾯程序所给制的折线图会包含 64 个转折点,由于这些转折点⾮常密集,看上去显得⽐较光滑,因此就变成了曲线。
如果读者将程序中x_data=np.linespace(-np.pi,np.pi,64,endpoint = True)代码的 64 改为4、6等较⼩的数,将会看到程序绘制的依然是折线图。
运⾏上⾯程序,可以看到如图 1 所⽰的效果。
图 1 ⽣成多个⼦图
如图 1 所⽰的显⽰效果⽐较差,程序明明只要显⽰ 3 个⼦图,但第 4 个位置被空出来了,能不能让某个⼦图占多个⽹格昵?答案是肯定的,程序做好控制即可。例如,将上⾯程序改为如下形式:
import matplotlib.pyplot as plt import numpy as np plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data =
np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将整个figure分成两⾏⼀列,第三个参数表⽰该图形放在第1个⽹格
plt.subplot(2, 1, 1) # 省略绘制正弦曲线 ... # 将整个figure分成两⾏两列,并将该图形放在第4个⽹格 plt.subplot(223) # 省略绘制余弦曲线 ... # 将整个figure分成两⾏两列,并该图形放在第4个⽹格 plt.subplot(224) #省略绘制正切曲线 ... plt.show()
上⾯程序中第 8 ⾏代码将整个区域分成两⾏⼀列,并指定⼦图占⽤第 1 个⽹格,也就是整个区域的第⼀⾏:第 13 ⾏代码将整个区域分成两⾏两列,并指定⼦图占⽤第 3 个⽹格(注意不是第 2 个⽹络,因为第⼀个⼦图已经占⽤了第⼀⾏,对于两⾏两列的⽹格来说,第⼀个⼦图已经占⽤了两个⽹格,因此此处指定⼦图占⽤第 3 个⽹格,这意味着该⼦图在第⼆⾏第⼀格);第 18 ⾏代码将整个区域分成两⾏两列,并指定⼦图占⽤第 4 个⽹格,这意味着该⼦图会在第⼆⾏第⼆格。
运⾏上⾯程序,可以看到如图 2 所⽰的效果。
图 2 控制多个⼦图的分布
如果读者不想这么费劲来计算⾏、列,将上⾯程序改为如下形式:
import matplotlib.pyplot as plt import numpy as np idspec as gridspec plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将绘图区域分成2⾏3列 gs =
gridspec.GridSpec(2, 3) # 指定ax1占⽤第⼀⾏(0)整⾏ ax1 = plt.subplot(gs[0, :]) # 指定ax1占⽤第⼆⾏(1)的第⼀格(第⼆个参数0代表) ax2 = plt.subplot(gs[1, 0]) # 指定ax1占⽤第⼆⾏(1)的第⼆、三格(第⼆个参数0代表) ax3 = plt.subplot(gs[1, 1:3]) # 绘制正弦曲线 ax1.plot(x_data, np.sin(x_data)) ax1.spines['right'].set_color('none') ax1.spines['top'].set_color('none')
ax1.spines['top'].set_color('none') ax1.spines['bottom'].set_position(('data', 0)) ax1.spines['left'].set_position(('data', 0))
ax1.set_title('正弦曲线') # 绘制余弦曲线 ax2.plot(x_data, np.cos(x_data)) ax2.spines['right'].set_color('none')
ax2.spines['top'].set_color('none') ax2.spines['bottom'].set_position(('data', 0)) ax2.spines['left'].set_position(('data', 0))
ax2.set_title('余弦曲线') # 绘制正切曲线 ax3.plot(x_data, np.tan(x_data)) ax3.spines['right'].set_color('none')
ax3.spines['top'].set_color('none') ax3.spines['bottom'].set_position(('data', 0)) ax3.spines['left'].set_position(('data', 0))
ax3.set_title('正切曲线') plt.show()
上⾯程序中的第 10 ⾏代码将绘图区域分成两⾏三列;第 12 ⾏代码调⽤ subplot(gs[0,:]),指定 ax1⼦图区域占⽤第⼀⾏整⾏,其中第⼀个参数 0 代表⾏号,没有指定列范围,因此该⼦图在整个第⼀⾏;第 14 ⾏代码调⽤ subplot(gs[1, 0]),指定 ax2 ⼦图区域占⽤第⼆⾏的第⼀格,其中第⼀个参数 1 代表第⼆⾏,第⼆个参数 0 代表第⼀格,因此该⼦图在第⼆⾏的第⼀格;第 16 ⾏代码调⽤ subplot(gs [1 , 1 : 3]),指定 ax3 ⼦图区域占⽤第⼆⾏的第⼆格到第三格,其中第⼀个参数 1 代表第⼆⾏,第⼆个参数 1:3 代表第⼆格到第三格,因此该⼦图在第⼆⾏的第⼆格到第三格。
定义完 ax1、ax2、ax3 这 3 个⼦图所占⽤的区域之后,接下来程序就可以通过 ax1、ax2、ax3 的⽅法在各⾃的⼦图区域绘图了。运⾏上⾯程序,可以看到如图 3 所⽰的效果。
图 3 使⽤ GridSpec 管理⼦图的分布

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。