Python 在matplotlib中将多个面板上的绘图的标签排列在一行中

Python 在matplotlib中将多个面板上的绘图的标签排列在一行中,python,matplotlib,label,axis-labels,Python,Matplotlib,Label,Axis Labels,我目前正在绘制(使用Python-x,y2.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)

我目前正在绘制(使用Python-x,y2.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)
没有任何效果。于是我对自己说:去问一位专家——我来了。有谁能告诉我如何改变标签,使它们彼此排成一行,看起来和预期的一样棒吗


我期待您的回答。

您可以用

P.ylabel("$\\sin{(x)}$", 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
标签的偏移量。更改此函数的
数千()
函数中返回的字符串不会让您满意

编辑 实现这一点的另一种方法是使用


我刚刚发现了这个方法,它可能对你有一些用处!(0,0)是(左,下),(0.5,0.5)是(中,中)等。

正如danodonovan所说,设置标签坐标是一种可能的方法。我可以补充一点,这个设置对我来说很好

ax7.yaxis.set_label_coords(-0.2, 0.5)

“诀窍”是使用负数将标签移到绘图之外

实际上,我在我的特定程序中是这样做的,x标签没有问题。我把这个放在这里是为了保持简单。出于某种原因,这张照片刚刚出现在我的帖子中(令人毛骨悚然,不是吗?)。因此,我想实现的是,y1和y2标签共享相同的左边框,而不是与右侧记号标签的距离相同。抱歉,我不知道如何说得更清楚,我不是母语人士。抱歉误解,我已经修改了我的回答。嘿,没问题@danodonovan。我很感激能得到的任何帮助!IMO
P.subplot()
的作用与图add\u subplot()的作用相同。正如您在上图中所看到的,y标签不在一条直线上,图形是。我在寻找一种方法,不仅可以对齐图形,还可以对齐y标签。在
添加子图
211
更改为
121
等。哦,我希望绘图按原样排列,但是的,这是解决问题的一种可能性(:我希望标签相对于左图像边框左对齐;但据我所知,它们有自己的bbox,它们会粘在上面,我无法让它们以一种讨人喜欢的方式移动……非常正确,matplotlib“howto”也是这样处理的:
ax.yaxis.set_label_coords(0.5, 0.5)
ax7.yaxis.set_label_coords(-0.2, 0.5)