matplotlib之subplot()详解

plt.subplot()函数是我们平时绘图的时候最常用的一个函数之一,先放一下官网上的介绍,该函数的关键字参数不多,下面通过例子详细说一下。

matplotlib.pyplot.subplot(*args, **kwargs)

#调用格式说明
subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(**kwargs)
subplot(ax)

1. 常用的调用方式

最常用的就是传入关键字三个数字,可以省略逗号,当省略逗号的时候figure中最多只能显示9个坐标轴(多于9个缩写就不能区分了,比如3412,不知道是要创建一个3行4列第12个还是3行41列第2个),而有逗号分隔则没有数量限制。

还有一点在jupyter notebook中,当你调用plt.subplot(3, 4, 6)的时候,由于最后一个图的右边和下面都没有坐标系显示了,所以直接没画,实际仍然是3*4的一块figure。

fig = plt.figure()
fig.suptitle('Figure1')

plt.subplot(3,4,1)    #plt.subplot(3, 4, 1)
plt.plot([1,2,3,4])

plt.subplot(3,4,12)    #plt.subplot(3, 4, 12)
plt.plot([1,2,3,4])

plt.show()

                                            

2. 创建不同大小的坐标系

plt.subplot()方法产生的坐标系都是按照网格方式划分的,不能随意划分位置和尺寸大小。上面的调用方式产生的坐标系就都是一样大小的,不过该方法也提供了一种合并网格的方式来提供不同尺寸大小的坐标系,其调用方式如图下。

在subplot()函数的第三个参数可以放一个元组,元组内只能放两个整数,分别表示开始位置和结束位置,对于(6,11)就表示该坐标系的左上角是第六个网格,右下角是第11个网格,实际占有6,7,10,11四个网格大小的区域(因为坐标轴还要保持正方形)

fig = plt.figure()
fig.suptitle('Figure')

plt.subplot(4,4,1)    
plt.plot([1,2,3,4])

plt.subplot(4,4,(6,11)) 
plt.plot([1,2,3,4])

plt.subplot(4,4,16)   
plt.plot([1,2,3,4])
plt.show()

还有一种方式,稍微有点奇怪,代码如下,一共绘制了三个坐标轴,其中第一个很正常,(3,3,1)表示网格3*3的第一个位置,显示的也没有问题,但是第二个和第三个应该怎么理解,为什么前两个数字还能变化(我第一次见的时候有点懵)?这里可以这样理解,figure还是一个figure,并没有改变,三个坐标轴都是在同一个figure上面绘制的。第一个(3,3,1)是将figure理解为3*3的网格,而第二个(3,2,3)是将figure理解为3*2的网格,然后在第三个位置放置一个坐标系,所以可以看到第二个坐标系的x轴长度是第一个的1.5倍,同理第三个就是将figure理解为3*1的网格,所以显示的x轴长度是第一个的三倍,将最后一行全部占满。

fig = plt.figure()
fig.suptitle('Figure')

plt.subplot(3,3,1)  
plt.plot([1,2,3,4])

plt.subplot(3,2,3)   
plt.plot([1,2,3,4])

plt.subplot(3,1,3)
plt.plot([1,2,3,4])
plt.show()

3. 关键字参数projection

该关键字是可选的,合法值为{None,  'aitoff',  'hammer',  'lambert',  'mollweide',  'polar',  'rectilinear',  str}

选择不同的坐标系,如polar表示极坐标系。

 

4. 关键字参数polar

该关键字是可选的,合法值为bool类型, default: False

如果该参数是True, 等价于projection='polar'

 

5. 关键字参数sharex, sharey

该关键字是可选的,合法值axes类型

sharex设置为True,则所有的子区axes都会共享一个x轴。

 

6. 返回值return

返回值是axes.SubplotBase, 或者Axes的其他子类,如 projections.polar.PolarAxes

关键字**kwargs

这个属性就相当之多了,先来官网一句话:This method also takes the keyword arguments for the returned axes base class; 大致就是这个关键字参数和坐标系axes子类的关键词差不多,看几个例子来了解一下:

第一个是title,表示该子区的标题
fig = plt.figure()
fig.suptitle('Figure: example for title')
axis1 = plt.subplot(121, title='axis 121')
axis1.plot([1,2,3,4])
axis2 = plt.subplot(122, title='axis 122')
axis2.plot([4,3,2,1])
plt.show()

第二个是xlabel、ylabel,表示xy轴的标签
axis1 = plt.subplot(121, xlabel='xlabel')
axis2 = plt.subplot(122, ylabel='ylabel')

第三个是xlim、ylim,表示xy坐标轴上显示的限制范围
axis1 = plt.subplot(121, xlim=(1,2), ylim=(2,3))
axis2 = plt.subplot(122)

第四个是frame_on,表示是否显示该坐标系的框
axis1 = plt.subplot(121, frame_on=True)
axis2 = plt.subplot(122, frame_on=False)

第五个是xticks,
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
fig = plt.figure()
fig.suptitle('Figure: example for xticks')
plt.plot(x, y, 'r-*')    
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], ['$-\pi$', '$-\pi/2$', '$0$', '$\pi/2$', '$\pi$'])
plt.show()

 

 

顺便再介绍一下subplots()和subplot2grid()

1. subplots()

该方法的完整调用如下,返回值有两个,分别是figure和axes

matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

这里axes是一个列表,尺寸为2*2,即使我们只画了三个坐标系,但是实际还是存在4个,并且也都画出来了,对比一个上一幅图中subplot()方法画了两个坐标系,实际就存在两个坐标系,最后显示的也是两个。例子如下:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7,7))
fig.suptitle('Figure')
 
axes[0][0].plot([1,2,3,4])
axes[0][1].plot([1,2,3,4])
 
axes[1][1].plot([1,2,3,4])
axes[1][1].set_title('axes[1][1]')
plt.show()

 

2. subplot2grid()

该方法的完整调用如下,返回值和subplot方法一样,都会返回一个Axes的其他子类

matplotlib.pyplot.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)

 代码如下,其中(3,3)表示形状shape,即将figure看成是一个3*3划分的网格,(0,0)是网格的二维坐标,下标从0开始,表示该坐标系的左上角起始坐标,colspan表示坐标系占用多少列。

fig = plt.figure()
fig.suptitle('Figure')
axes1 = plt.subplot2grid((3,3), (0,0), colspan=3)
axes2 = plt.subplot2grid((3,3), (1,0), colspan=2)
axes3 = plt.subplot2grid((3,3), (1,2))
axes4 = plt.subplot2grid((3,3), (2,0))
axes5 = plt.subplot2grid((3,3), (2,1), colspan=2)
plt.show()

 

 

 

  • 16
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值