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

Posted

技术标签:

【中文标题】使用 twiny 时 Python Matplotlib 图形标题与轴标签重叠【英文标题】:Python Matplotlib figure title overlaps axes label when using twiny 【发布时间】:2012-09-26 20:26:58 【问题描述】:

我正在尝试使用 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 轴上的轴标签重叠,因此几乎无法辨认(我想在此处发布图片示例,但我没有还没有足够高的代表)。

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

【问题讨论】:

欢迎来到 Stack Overflow!如果您链接到您的图片的 imgur 帖子,则更高代表的用户会为您将图片嵌入到您的帖子中。 @Magic -- 你会重新考虑接受这个问题的答案吗? Matplotlib 添加了一个内置机制来处理这种精确的需求(下面投票最多的答案) 【参考方案1】:

忘记使用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 似乎仍然不能很好地与非标准展示位置配合使用。也许你可以做一个错误报告? 我在使用tight_layout 时找到了一种解决方法,至少在您使用figure.savefig() 保存绘图时是这样。如果title = plt.title(...),那么您可以使用选项bbox_extra_artists 指定将情节紧紧围绕在标题周围:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')【参考方案2】:

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

plt.title(figure_title, y=1.08)

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

【讨论】:

标签可以设置参数labelpad,见here。 就其价值而言,这不是一个新功能。 title 使用 xy 参数已经很长时间了(只要我记得,无论如何)。 plt.set_title('title string', y = 1.08) 适合我。 如果有人解释 1.08 是什么单位以及默认值是什么,将会更有帮助。我的理解是默认为 1 @JohnCummings 好像默认值是y=1,单位是“轴分数”,即y=0.5表示标题在轴中间,y=0表示标题就在坐标区底部的上方。【参考方案3】:
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

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

【讨论】:

【参考方案4】:

我遇到了 x-label 与子图标题重叠的问题;这对我有用:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

之前

之后

参考:

https://matplotlib.org/users/tight_layout_guide.html

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

这种情况你可以使用pad:

ax.set_title("whatever", pad=20)

【讨论】:

【参考方案7】:

如果您不想进入标题的xy 位置,这是一个临时解决方案。

以下对我有用。

plt.title('Capital Expenditure\n') # Add a next line after your title

荣誉。

【讨论】:

以上是关于使用 twiny 时 Python Matplotlib 图形标题与轴标签重叠的主要内容,如果未能解决你的问题,请参考以下文章

Python Matplot中文显示完美解决方案

Python Matplot中文显示完美解决方案

python matplot怎么画箭头

pip/matplot/pandas的安装和使用

python matplot 3D

python Matplot的例子