gpt4 book ai didi

python - 在 matplotlib 中对齐图例行

转载 作者:行者123 更新时间:2023-12-01 05:03:04 24 4
gpt4 key购买 nike

我正在使用 matplotlib 绘制图并为此创建图例(请参见下面的代码)。我希望图例行水平对齐,以便关系 ><对齐。努力适应thisthis类似问题的代码,我被卡住了。

我理解基本思想:使用\makebox[width][alignment]{math expression before aligment}<math expression after alignment作为标签,这样 epsilon 表达式使用的空间始终使用相同的空间并向右对齐,因此左侧有可用空间。

但是\hfill - 仅当填充之前有文本,或者对齐方式为标准(左)时,链接中使用的方法才有效。解决方案必须非常接近,任何帮助将不胜感激。图例的文本应该是这样的 enter image description here

import numpy
from matplotlib import pyplot as plt

plt.rc('text', usetex=True) # needed for interpeting tex strings, but changes appearence of axis-tick labels also
fig = plt.figure(1,figsize=(12.0, 8.0))
plt.ion()

# does not align the '<', '<' and '>' in the legend
# plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{$\varepsilon_i$}$< -\xi$')
# plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{$|\varepsilon_i|$}$< \xi$')
# plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{$\varepsilon_i$}$ > \xi$')

# \hfill doesnt change anything
# plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{\hfill$\varepsilon_i$}$< -\xi$')
# plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{\hfill$|\varepsilon_i|$}$< \xi$')
# plt.plot(numpy.random.rand(10), label=r'\makebox[24cm][r]{\hfill$\varepsilon_i$}$ > \xi$')

# the relations are aligned, but i do not want to plot the 'bla' for this
plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{bla\hfill$\varepsilon_i$}$< -\xi$')
plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{bla\hfill$|\varepsilon_i|$}$< \xi$')
plt.plot(numpy.random.rand(10), label=r'\makebox[2cm][r]{bla\hfill$\varepsilon_i$}$ > \xi$')
plt.legend(loc='upper right')
plt.show()

最佳答案

这是一个 LaTeX 完美对齐数学的解决方案,但用户必须费尽心思将其放置在图例中。这个想法是

  • 使用占位符在给定位置绘制图例框
  • 输入 amsmath 的 array手动进入

代码如下:

#!/usr/bin/python3

from numpy import arange

import matplotlib
from matplotlib import pyplot as plt
custom_preamble = {
"text.usetex": True,
"text.latex.preamble": [
r"\usepackage{amsmath}", # for the array macros
],
}
matplotlib.rcParams.update(custom_preamble)

x = arange(5)
y = arange(5)

fig = plt.figure()
ax = fig.add_subplot(111)

l1, = ax.plot(x, y)
l2, = ax.plot(x * 2, y)
l3, = ax.plot(x * 3, y)

leg = ax.legend(
[l1, l2, l3],
["", "", ""],
bbox_to_anchor = (0.98, 0.25),
handletextpad = 4, # space between lines and text -- used here as a placeholder
labelspacing = 0.1, # space between lines in a legend
)
leg.set_zorder(1)

ax.text(0.955, 0.21,

r"\begin{array}{rcl}"
r" \varepsilon_i & < & -\xi"
r"\\ |\varepsilon_i| & < & \xi"
r"\\ \varepsilon_i & > & \xi"
r"\end{array}",

transform = ax.transAxes,
horizontalalignment = 'right',
verticalalignment = 'top',
zorder = 5,
)

fig.savefig("mwe.png")

结果:

enter image description here

您可能需要编译两次:第一次编译时可能会出现错误,但所有其他尝试都会顺利。

至于 < 之间的空格登录图例 - 可以通过以下方式减少:

ax.text(0.94, 0.21,

r"\begin{array}{r@{}c@{}l}"
r" \varepsilon_i \,\,& < &\,\, -\xi"
r"\\ |\varepsilon_i| \,\,& < &\,\, \xi"
r"\\ \varepsilon_i \,\,& > &\,\, \xi"
r"\end{array}",

(其他一切都一样)。这给出:

enter image description here

关于python - 在 matplotlib 中对齐图例行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25627257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com