在matplotlib中将多个面板中的标签排列为一行
我现在正在用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)表示中间等等。