Matplotlib:多个子图共用一个轴标签¶
日期 | 2012-06-20(最后修改),2008-03-20(创建) |
---|
使用单个轴标签来注释多个子图轴¶
当使用多个具有相同轴单位的子图时,单独标记每个轴是多余的,并且会使图形过于复杂。您可以使用一个居中于绘图框架的单个轴标签来标记多个子图轴。以下是如何操作
在 [ ]
#!python
# note that this a code fragment...you will have to define your own data to plot
# Set up a whole-figure axes, with invisible axis, ticks, and ticklabels,
# which we use to get the xlabel and ylabel in the right place
bigAxes = pylab.axes(frameon=False) # hide frame
pylab.xticks([]) # don't want to see any ticks on this axis
pylab.yticks([])
# I'm using TeX for typesetting the labels--not necessary
pylab.ylabel(r'\textbf{Surface Concentration $(nmol/m^2)$}', size='medium')
pylab.xlabel(r'\textbf{Time (hours)}', size='medium')
# Create subplots and shift them up and to the right to keep tick labels
# from overlapping the axis labels defined above
topSubplot = pylab.subplot(2,1,1)
position = topSubplot.get_position()
position[0] = 0.15
position[1] = position[1] + 0.01
topSubplot.set_position(position)
pylab.errorbar(times150, average150)
bottomSubplot = pylab.subplot(2,1,2)
position = bottomSubplot.get_position()
position[0] = 0.15
position[1] = position[1] + 0.03
bottomSubplot.set_position(position)
pylab.errorbar(times300, average300)
或者,您可以使用以下代码片段在子图上共享 y 轴标签。另请参见附带的 图形输出。 )#
在 [ ]
#!python
import pylab
figprops = dict(figsize=(8., 8. / 1.618), dpi=128) # Figure properties
adjustprops = dict(left=0.1, bottom=0.1, right=0.97, top=0.93, wspace=0.2 hspace=0.2) # Subplot properties
fig = pylab.figure(**figprops) # New figure
fig.subplots_adjust(**adjustprops) # Tunes the subplot layout
ax = fig.add_subplot(3, 1, 1)
bx = fig.add_subplot(3, 1, 2, sharex=ax, sharey=ax)
cx = fig.add_subplot(3, 1, 3, sharex=ax, sharey=ax)
ax.plot([0,1,2], [2,3,4], 'k-')
bx.plot([0,1,2], [2,3,4], 'k-')
cx.plot([0,1,2], [2,3,4], 'k-')
pylab.setp(ax.get_xticklabels(), visible=False)
pylab.setp(bx.get_xticklabels(), visible=False)
bx.set_ylabel('This is a long label shared among more axes', fontsize=14)
cx.set_xlabel('And a shared x label', fontsize=14)
感谢 matplotlib-users 列表中的 Sebastian Krieger 提供了这个技巧。
一个简单的函数,可以消除多余的 x 轴刻度,但保留底部的刻度(在 pylab 中有效)。将其与上面的代码片段结合使用,可以获得一个没有太多冗余的漂亮图形
在 [ ]
#!python
def rem_x():
'''Removes superfluous x ticks when multiple subplots share
their axis works only in pylab mode but can easily be rewritten
for api use'''
nr_ax=len(gcf().get_axes())
count=0
for z in gcf().get_axes():
if count == nr_ax-1: break
setp(z.get_xticklabels(),visible=False)
count+=1
上面的第一个方法对我来说不起作用。subplot 命令会覆盖 bigaxes。但是,我发现了一个更简单的解决方案,可以为两个轴和一个 y 轴标签提供一个不错的效果
yyl=plt.ylabel(r'My longish label that I want vertically centred')
yyl.set_position((yyl.get_position()[0],1)) # 这表示使用底部轴的顶部作为参考点。
yyl.set_verticalalignment('center')
章节作者:未知[78],DavidLinke,未知[80],未知[109],未知[110]
附件