在matplotlib中将多个面板中的标签排列为一行

4 投票
2 回答
1656 浏览
提问于 2025-04-17 17:18

我现在正在用Python(版本x,y 2.7.2.1)绘制多个子图,并且我希望所有的y轴标签能够在同一条线上。目前它们并没有对齐,因为刻度标签的大小不同。为了演示这个问题,我添加了以下脚本:

    import pylab as P
    import numpy as N

    x = N.linspace(0,2*N.pi,10000)
    y1 = N.sin(x)
    y2 = N.cos(x)*10000

    P.figure()
    ax1 = P.subplot(211)
    P.plot(x,y1,"k-")
    y1 = P.ylabel("$\\sin{(x)}$")
    P.xlim((0,2*N.pi))
    ax2 = P.subplot(212)
    P.plot(x,y2,"k--")
    y2 = P.ylabel("$\\cos{(x)}\\cdot{}10^4$")
    P.xlim((0,2*N.pi))
    P.show()

结果看起来是这样的,请注意这些标签相互之间的偏移:

两个图表的标签相互偏移

我尝试通过设置标签位置来解决这个问题,使用了:

    (x,y) = y2.get_position()
    ax1.yaxis.set_label_coords(x,y)

但显然它们使用了不同的坐标系统,因为set_label_coords需要相对坐标,而get_position()似乎返回的是像素值或其他东西。我绝望地尝试了:

    y1.set_x(x); y1.set_y(y)

但没有任何效果。所以我对自己说:问问专家吧——于是我来了。有没有人能告诉我如何调整这些标签的位置,让它们在同一条线上,并且看起来像我期待的那样棒?

期待你们的回答。

2 个回答

1

正如danodonovan所说,set_label_coords是一个可行的方法。我想补充一下,这个设置对我来说效果很好。

ax7.yaxis.set_label_coords(-0.2, 0.5)

这里的“窍门”就是使用一个负数,把标签移动到图表的外面。

2

你可以通过以下方式来调整标签的位置:

P.ylabel("$\\sin{(x)}$", labelpad=20)

还有

P.ylabel("$\\cos{(x)}\cdot{}10^4$", labelpad=20)

稍微调整一下,这样就能达到你想要的效果。你甚至可以在绘图后再设置它:

ax.yaxis.labelpad = 20

由于y轴上的数字长度会变化,所以y标签的位置没有对齐。你可以通过以下方式固定y轴上数字的大小:

from matplotlib.ticker import FuncFormatter

def thousands(x, pos):
    'The two args are the value and tick position'
    return '%4.1f' % (x*1e-3)

formatter = FuncFormatter(thousands)

ax = fig.add_subplot(211)
ax.yaxis.set_major_formatter(formatter)

这样可以确保y轴上的数字长度始终为4个字符,因此你可以为所有值固定y标签的偏移。如果这个结果不满意,可以在thousands()函数中修改返回的字符串!

编辑

还有另一种方法可以实现这个效果,就是使用set_label_coords来硬编码标签的位置。

ax.yaxis.set_label_coords(0.5, 0.5)

我刚发现这个方法,可能对你有帮助!(0,0)表示左下角,(0.5, 0.5)表示中间等等。

撰写回答