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
参数。
举例:
1 2 3 4 5 | import matplotlib from matplotlib import pyplot as plt plt.subplots( 3 , 3 ) plt.tight_layout() plt.show() |
1 2 3 | plt.subplots( 3 , 3 ,sharex = True ) # 等价于sharex='all' plt.tight_layout() plt.show() |
1 2 3 | plt.subplots( 3 , 3 ,sharex = 'row' ) plt.tight_layout() plt.show() |
2.pyplot.subplot2grid()
2.1 使用pyplot.subplot2grid()
函数时,你只需要提供网格形状以及SubPlot
位置即可。
1 2 3 | ax = pyplot.subplot2grid(( 2 , 2 ),( 0 , 0 )) # 它等价于 ax = pyplot.subplot( 2 , 2 , 1 ) # 其中subplot2grid()的位置坐标从0开始。 |
subplot2grid()
支持SubPlot
横跨或者纵跨多个单元格。colspan
关键字参数指定纵向的跨度;rowspan关键字
参数指定横向的跨度。
举例:
1 2 3 4 5 6 7 | 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
。如:
1 2 | 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])
。
举例:
1 2 3 4 5 6 7 8 9 | 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
。如:
1 2 | 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
指定。如:
1 2 3 | 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
创建的网格都是相同大小的。当然你可以调整相对的高度和宽度。注意这里只有相对大小(即比例)是有意义的,绝对大小值是没有意义的。如:
1 2 3 | gs = gridspec.GridSpec( 2 , 2 ,width_ratios = [ 1 , 2 ],height_ratios = [ 4 , 1 ] plt.subplot(gs[ 0 ] .... |
width_ratios
关键字参数:指定了一行中,各列的宽度比例(有多少列就有多少个数字);height_ratios
关键字参数:指定了一列中,各行的高度比例(有多少行就有多少个数字)。
举例:
1 2 3 4 5 6 7 8 9 | 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()
来达到同样的效果。
举例:
1 2 3 4 5 6 7 8 | 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() |
参考文献:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步