在matplotlib中,如何直接调整图例框的大小?

r1zhe5dt  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(111)

我使用matplotlib将绘图保存为我的LaTeX文档的svg文件。我正在禁用"text.parse_math"设置,让文本排版,而构建我的文档(见注解)。
下面是我的Python代码的一个例子(matplotlib 3.6.2):

import matplotlib.pyplot as plt

plt.rcParams["svg.fonttype"] = "none"
plt.rcParams["text.parse_math"] = False
plt.rcParams["axes.unicode_minus"] = False

plt.bar([1, 2, 3], [1, 2, 3], label=r"$\tilde{H}\left(t_\infty\right)$")
plt.legend()
plt.show()

字符串
matplotlib显示了这样的图


的数据
而LaTeX则是这样显示的



图例中的标签按预期由LaTeX转换为数学模式。但是,由于图例框的大小是由原始标签文本决定的,所以它的宽度比我希望它在LaTeX模式下的宽度要大得多。
我搜索了解决方案,但文档和其他stackoverflow问题都是关于修改图例艺术家或控制填充的。如何直接减小图例框的大小?具体来说,我想知道这些是否可行,哪一种是最好的:
1.使用类似“代理标签”的东西,即,将盒子大小调整为“H(t_oo)”,但真实的的标签具有更长的LaTeX语法。
1.从plt.legend()直接调整图例大小
1.直接创建大小合适的Legend()示例
1.子类Legend类来定义我自己的图例。
(edit:增强代码并指定matplotlib版本)

btqmn9zl

btqmn9zl1#

如果你的目标是创建一个使用LaTeX字体(计算机现代)的图形,并且可以在PDF中搜索,那么你可以直接在Matplotlib中创建。

import matplotlib.pyplot as plt
from matplotlib import rc

plt.close("all")
rc("font", **{"family":"serif","serif":["Computer Modern Roman"], "size":12})
rc("text", usetex=True)

plt.bar([1, 2, 3], [1, 2, 3], label=r"$\tilde{H}\left(t_\infty\right)$")
plt.legend()
plt.savefig("temp.pdf")
plt.show()

字符串
以下是PNG格式的结果:


的数据

u5rb5r59

u5rb5r592#

您可以通过将新值设置为plt.legend()._legend_box.width来调整图例框宽度:

import matplotlib.pyplot as plt

plt.rcParams["svg.fonttype"] = "none"
plt.rcParams["text.parse_math"] = True
plt.rcParams["axes.unicode_minus"] = False

plt.bar([1, 2, 3], [1, 2, 3], label=r"$\tilde{H}\left(t_\infty\right)$")
legend = plt.legend()
legend._legend_box.width = 85  # <-- Setting new width
plt.show()

字符串

输出:


的数据

选项二:删除图例框线

另一个不需要手动覆盖图例框宽度的解决方案是完全删除它。您可以像这样删除图例框行:

import matplotlib.pyplot as plt

plt.rcParams["svg.fonttype"] = "none"
plt.rcParams["text.parse_math"] = True
plt.rcParams["axes.unicode_minus"] = False

plt.bar([1, 2, 3], [1, 2, 3], label=r"$\tilde{H}\left(t_\infty\right)$")
legend = plt.legend()
legend.get_frame().set_linewidth(0.0)
plt.show()

输出:


相关问题