python - 在 Python 中读取图例的高度

标签 python matplotlib

我有一些包含大量信息和线条的图,所以有时我倾向于将图例放在图本身之外使用 bbox_to_anchor。我也更喜欢有一个情节的标题,但在那种情况下,这将在位置上与传说重合。以下示例只是问题的说明。

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
r = 1 + np.sin(4 * np.pi * t)
q = 1 + np.sin(6 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s, label='S')
ax.plot(t, r, label='R')
ax.plot(t, q, label='Q')
leg = ax.legend(loc=3, ncol=3, bbox_to_anchor=(.0, 1.02, 1., .102), borderaxespad=0., mode='expand')
ax.set_title('SIMPLE PLOT', y=1.1)
plt.show()

为了避免这种情况,我设置了某种 y 值(例如 y=1.1)。我想自动化这个过程,因为我不断用新数据更新同一个图,所以图例变大了,我需要相应地调整标题的位置。

  • 有没有办法使这个过程自动化?
  • Python 中有没有函数可以读取图例的高度来调整标题位置?

最佳答案

图例的高度在绘制时确定。通过legend.get_window_extent()绘制图形后即可获取。生成的边界框以像素为单位。为了找到标题的偏移量,您需要从轴的上限中减去图例的上限。因此,您还需要以像素为单位获取轴位置。

标题可以在图形坐标 (y=1.1) 或点 (pad=20) 中偏移。我建议在这里使用点,使其独立于轴的大小。所以你可以计算上部位置的差异,从像素转换为点(即 distance [pixels] * ppi/dpi)并添加一些以点为单位的常量偏移(因为通常你不希望标题恰好位于图例的边界上)。然后将该数字用作 pad

import numpy as np
import matplotlib.pyplot as plt


fig, ax = plt.subplots(constrained_layout=True)

ax.plot([1,2,3], np.random.rand(3,5), label='Label')

leg = ax.legend(loc="lower center", ncol=3, bbox_to_anchor=(.0, 1.02, 1., 1.02),
                borderaxespad=0, mode='expand')

fig.canvas.draw()
leg_box = leg.get_window_extent()
ax_box = ax.get_position().transformed(fig.transFigure)
pad = (leg_box.y1 - ax_box.y1)*72./fig.dpi + 6
ax.set_title('SIMPLE PLOT', pad=pad)

plt.show()

enter image description here

请注意,这里我还使用了 constrained_layout 来让标题不被图形边界裁剪。

关于python - 在 Python 中读取图例的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55258363/

相关文章:

python - 如何将具有相同索引的多行组合在一起,并且每一行在pandas中只有一个真实值?

python - 将发散颜色居中至零

python - python 中的高效内存使用

python - 根据信号所在位置调整 xrange

python - Matplotlib:如何用等面积的箱子制作直方图?

python - 从 Cython 代码生成 SIMD 指令

python - 使用 python-docx 将 HTML 转换为 Word 文档?

Python 3 [类型错误 : 'str' object cannot be interpreted as an integer] when working with sockets

python - 使用 Flask 将 JSON 数据从服务器传递到客户端

python - 在python中创建具有不同颜色的不同组的条形图