python - 在 Python 中读取图例的高度
问题描述
我有一些带有大量信息和线条的情节,所以有时我倾向于将图例放在情节本身之外using 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()
请注意,这里我也曾经constrained_layout
让标题没有被图形边界裁剪。
推荐阅读
- html - 嗨,当我的网页加载了我保存的登录凭据时,有什么办法可以摆脱自动完成背景?
- css - 在 ReactJS 中,一个简单的内联样式没有给出想要的输出
- visual-studio - Visual Studio Professional 已开始在选项卡切换时自动保存。我该如何关闭它?
- python - 尝试从字符串中打印偶数索引字符
- python - python列表理解元组解包
- node.js - 如何更新节点js中嵌套数组的文档
- java - RecyclerView 内的可缩放视图
- sql - Select Stateemt 中动态 SQL 变量的 XQuery [value()] 问题
- javascript - 如何通过发送 fetch 在烧瓶中获取文件
- javascript - 如何获取在 Firebase Authentication for Web 中对当前用户进行身份验证的身份验证提供程序?