使用Twiny时,Python Matplotlib图形标题与轴标签重叠


139

我正在尝试使用twiny在同一张图上绘制两个单独的数量,如下所示:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

并且数据可以很好地显示,但是我遇到的问题是,图形标题与辅助x轴上的轴标签重叠,因此几乎看不清(我想在此处发布图片示例,但是我没有足够高的代表)。

我想知道是否存在一种直接将标题直接上移几十个像素的简单方法,以使图表看起来更漂亮。


1
欢迎使用Stack Overflow!如果您链接到图片的imgur帖子,则更高的代表用户将为您将图片嵌入到您的帖子中。

@Magic-您会重新考虑接受该问题的答案吗?Matplotlib添加了一个内置机制来满足这种精确的需求(以下是投票率最高的答案)
Amelio Vazquez-Reina 2014年

Answers:


243

我不确定在更高版本的matplotlib中它是否是一项新功能,但至少对于1.3.1,这很简单:

plt.title(figure_title, y=1.08)

这也适用于plt.suptitle(),但不适用于plt.xlabel(),等等。


6
对于标签,您可以设置参数labelpad,请参见此处
菲利克斯·霍夫曼

1
就其价值而言,它不是一个新功能。title已经采取xy争论了很长一段时间(只要我还记得,在任何速率)。
Joe Kington 2014年

3
plt.set_title('title string',y = 1.08)为我工作。
Yu Shen

3
如果有人解释什么是1.08以及什么是默认值,那会更有帮助。我的理解是,默认值为1
kon psych

3
@JohnCummings似乎默认值为y = 1,单位为“轴分数”,即y = 0.5表示标题位于轴的中间,而y = 0表示标题位于轴的底部正上方轴。
herrlich10

33

忘记使用plt.title并直接用放置文本plt.text。过度夸大的示例如下:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

在此处输入图片说明


@ user815423426是的,tight_layout在非标准展示位置上似乎仍然无法很好地发挥作用。也许您可以报告错误?

2
我在使用tight_layout时找到了解决方法,至少在使用Figure.savefig()保存图时。如果这样的title = plt.title(...)话,您可以使用以下选项指定在标题周围紧紧 bbox_extra_artistsfigure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
画图

10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

如果'\n'在标题字符串后面紧跟,则绘图将绘制在标题下方。那也可能是一个快速的解决方案。



4

只是使用plt.tight_layout()之前plt.show()。它运作良好。


4

您可以在这种情况下使用pad:

ax.set_title("whatever", pad=20)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.