matplotlib---4.布局
1. 简单布局add_subplot/subplot/subplots
1.1 Figure.add_subplot(*args,**kwargs)
简单布局通过方法来完成,它返回的是Axes
实例。当然你也可以通过pyplot.subplot(*args,**kwargs)
函数来完成,他返回的也是Axes
实例,该函数只是一个便利函数。
SubPlot
类是Axes
类的子类。因此SubPlot
对象也是Axes
对象。
参数:
axisbg
关键字参数:指定subplot
的背景色polar
关键字参数:指定subplot
是否是极坐标。默认为False
projection
:指定坐标方式,可以为:'aitoff'
、'hammer'
、'lambert'
、'mollweide'
、'polar'
、'rectilinear'
。当projection='polar'
等价于ploar=True
sharex
关键字参数:指定subplot
与其他Axes
(由该参数值指定)共享xaxis attribute
sharey
关键字参数:指定subplot
是否与其他Axes
(由该参数值指定)共享yaxis attribute
1.2 matplotlib.pyplot.subplot(nrows,ncols,plot_number)
nrows
和ncols
将图表划分成nrows*ncols
大小的网格区域,每一个区域都能存放一个SubPlot
;该函数创建plot_number
位置处的SubPlot-axes
。其中plot_number
起始于1,最大值为nrows*ncols
。
如果nrows
、ncols
、plot_number
都是个位数,则你可以指定一个三位数来简化函数调用matplotlib.pyplot.subplot(integer)
,其中百分位代表nrows
,十分位代表ncols
,各位代表plot_number
。
1.3 matplotlib.
pyplot.subplots()
一次性创建多个subPlot,而
pyplot.subplot()
每次只会创建一个SubPlot
。
参数:
nrows
:行数,默认为1;ncols
:列数,默认为1sharex
:- 如果为
True
,则所有SubPlot
的X axis
被共享。此时只有最后一行的X
轴可见。 - 如果为
False
,则SubPlot
的X axis
不共享,每一个SbuPlot
的X
轴可见。 - 如果为字符串
all
,则等效于True
- 如果为字符串
none
,则当小于False
- 如果为字符串
row
,则每一行的SubPlot
共享一个X
轴(与False
等效) - 如果为字符串
col
,则每一列的SubPlot
共享一个X
轴(与True
等效) sharey
:- 如果为
True
,则所有SubPlot
的Y axis
被共享。此时只有第一列的Y
轴可见。 - 如果为
False
,则SubPlot
的Y axis
不共享,每一个SbuPlot
的Y
轴可见。 - 如果为字符串
all
,则等效于True
- 如果为字符串
none
,则当小于False
- 如果为字符串
row
,则每一行的SubPlot
共享一个Y
轴(与True
等效) - 如果为字符串
col
,则每一列的SubPlot
共享一个Y
轴(与False
等效)
- 如果为
squeeze
:- 如果为
True
:- 如果只创建了一个
SubPlot
,则返回一个变量(创建的SubPlot对象) - 如果创建了
N*1
或者1*N
个SubPlot
,则返回一个1维向量 - 如果创建了
N*M
个SubPlot
(其中N>1
,M>1
),则返回一个2维向量
- 如果只创建了一个
- 如果为False则始终返回一个2维向量
- 如果为
subplot_kw
:一个字典参数,用于传递给Axes.add_subplot()
来创建SubPlot
gridspec_kw
:一个字典参数,用于传递给GridSpec
构造函数来创建SubPlot
存放的网格fig_kw
:一个字典参数,用于传递给pyplot.figure()
函数。所有前述未能识别的感激案子参数都会传到这里。
其返回值为figure,ax
。其中figure
是一个Figure
对象;ax
取决于squeeze
参数。
举例:
import matplotlib from matplotlib import pyplot as plt plt.subplots(3,3) plt.tight_layout() plt.show()
plt.subplots(3,3,sharex=True) # 等价于sharex='all' plt.tight_layout() plt.show()
plt.subplots(3,3,sharex='row') plt.tight_layout() plt.show()
2.pyplot.subplot2grid()
2.1 使用pyplot.subplot2grid()
函数时,你只需要提供网格形状以及SubPlot
位置即可。
ax=pyplot.subplot2grid((2,2),(0,0)) # 它等价于 ax=pyplot.subplot(2,2,1) # 其中subplot2grid()的位置坐标从0开始。
subplot2grid()
支持SubPlot
横跨或者纵跨多个单元格。colspan
关键字参数指定纵向的跨度;rowspan关键字
参数指定横向的跨度。
举例:
import matplotlib.pyplot as plt plt.subplot2grid((3,3),(0,0),colspan=3) plt.subplot2grid((3,3),(1,0),colspan=2) plt.subplot2grid((3,3),(1,2),colspan=2) plt.subplot2grid((3,3),(2,0)) plt.tight_layout() plt.show()
3. GridSpec 和 SubplotSpec
3.1 matplotlib.gridspec.GridSpec
你可以直接创建matplotlib.gridspec.GridSpec,
然后通过它来创建SubPlot
。如:
gs=matplotlib.gridspec.GridSpec(2,2) #网格2行2列 matplotlib.pyplot.subplot(gs[0,0])
等价于matplotlib.pyplot.subplot2grid((2,2),(0,0))
GridSpec
对象提供了类似array
的索引方法,其索引的结果是一个SubplotSpec
对象实例。如果你想创建横跨多个网格的SubplotSpec
,那么你需要对GridSpec
对象执行分片索引,如pyplot.subplot(gs[0,:-1])
。
举例:
import matplotlib.pyplot as plt from matplotlib import gridspec gs = gridspec.GridSpec(3,3) plt.subplot(gs[0,:]) # 添加SubplotSpec plt.subplot(gs[1,:-1]) plt.subplot(gs[1:,-1]) plt.subplot(gs[-1,0]) plt.tight_layout() plt.show()
3.2 matplotlib.gridspec.GridSpec.update
如果你使用GridSpec
,那么你可以调整由GridSpec
创建的SubplotSpec
的layout parameter
。如:
gs=gridspec.GridSpec(3,3) gs.update(left=0.05,right=0.48,wspace=0.05)
这种用法类似于subplots_adjust
,但是它仅仅影响由本GridSpec
创建的SubplotSpec
。其中gs.update()
的关键字参数有:
left
关键字参数:subplot
左侧宽度right
关键字参数:subplot
右侧宽度bottom
关键字参数:subplot
底部高度top
关键字参数:subplot
顶部高度wspace
关键字参数:subplot
之间的空白宽度hspace
关键字参数:subplot
之间的空白的高度
3.4 gridspec.GridSpecFromSubplotSpec
你可以从SubplotSpec
创建GridSpec
。此时layout parameter
由该SubplotSpec
指定。如:
gs0=gridspec.GridSpec(1,2) gs00=gridspec.GridSpecFromSubplotSpec(3,3,subplot_spec=gs0[0]) matplotlib.gridspec.GridSpecFromSubplotSpec(nrows, ncols, subplot_spec,wspace=None, hspace=None,height_ratios=None,width_ratios=None)
创建一个GridSpec
,它的subplot layout parameter
继承自指定的SubplotSpec
。 其中nrows
为网格行数,ncols
为网格列数,subplot_spec
为指定的SubplotSpec
。
3. 5 默认情况下,GridSpec
创建的网格都是相同大小的。当然你可以调整相对的高度和宽度。注意这里只有相对大小(即比例)是有意义的,绝对大小值是没有意义的。如:
gs=gridspec.GridSpec(2,2,width_ratios=[1,2],height_ratios=[4,1] plt.subplot(gs[0] ....
width_ratios
关键字参数:指定了一行中,各列的宽度比例(有多少列就有多少个数字);height_ratios
关键字参数:指定了一列中,各行的高度比例(有多少行就有多少个数字)。
举例:
import matplotlib.pyplot as plt from matplotlib import gridspec gs = gridspec.GridSpec(2,2,width_ratios=[1,2],height_ratios=[4,1]) # 调整相对宽高 plt.subplot(gs[0]) # 添加SubplotSpec plt.subplot(gs[1]) plt.subplot(gs[2]) plt.subplot(gs[3]) plt.tight_layout() plt.show()
3.6 GridSpec.tight_layout()
GridSpec.tight_layout(fig, renderer=None, pad=1.08, h_pad=None, w_pad=None,rect=None)
:tight_layout
能够自动调整subplot param
从而使得subplot
适应figure area
。 它仅仅检查ticklabel、axis label、title
等内容是否超出绘制区域。
参数:
fig
关键字参数:Figure
对象,图表。pad
关键字参数:一个浮点数,单位是fontsize
,表示figure edge
和edges of subplots
之间的 填充区域。h_pad
关键字参数:一个浮点数,单位是fontsize
,示subplots
之间的高度,默认为pad
。w_pad
关键字参数:一个浮点数,单位是fontsize
,示subplots
之间的宽度,默认为pad
。rect
关键字参数:如果给定了该参数为一个列表或元组(是一个矩形的四要素,分别代表左下角坐标,宽度,高度),则指定了网格的轮廓矩形,所有的subplots
都位于该矩形中。其坐标系是figure coordinate
,从[0...1]
,如果没有提供该参数,则默认为(0, 0, 1, 1)
。
当然你可以使用matplotlib.pyplot.tight_layout()
来达到同样的效果。
举例:
import matplotlib.pyplot as plt from matplotlib import gridspec fig = plt.figure() gs1 = gridspec.GridSpec(2,1) fig.add_subplot(gs1[0]) fig.add_subplot(gs1[1]) gs1.tight_layout(fig,rect=[0,0,0.5,1]) fig.show()
参考文献: