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]

附件