如何更改 pyplot 中单个图例条目的字体大小?

How to change fontsize of individual legend entries in pyplot?

我想做的是控制 pyplot 中图例中各个条目的字体大小。也就是说,我希望第一个条目是一个大小,第二个条目是另一个大小。这是我尝试的解决方案,但没有用。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1,5,0.5)
plt.figure(1)
plt.plot(x,x,label='Curve 1')
plt.plot(x,2*x,label='Curve 2')
leg = plt.legend(loc = 0, fontsize = 'small')
leg.get_texts()[0].set_fontsize('medium')
plt.show()

我的预期是所有图例条目的默认大小为 'small'。然后我得到一个 Text 对象的列表,并将仅单个 Text 对象的字体大小更改为中等。但是,出于某种原因,这会将所有文本对象的字体大小更改为中等,而不仅仅是我实际更改的单个字体。我觉得这很奇怪,因为我可以通过这种方式单独设置其他属性,例如文本颜色。

最终,我只需要一些方法来更改图例的单个条目的字体大小。

似乎每个图例条目的字体都由 matplotlib.font_manager.FontProperties 的实例管理。问题是:每个条目都没有自己的 FontProperties...它们都共享同一个条目。这是通过写作来验证的:

>>> t1, t2 = leg.get_texts()
>>> t1.get_fontproperties() is t2.get_fontproperties()
True

因此,如果您更改第一个条目的大小,第二个条目的大小也会随之自动更改。

解决此问题的 "hack" 是简单地为每个图例条目创建一个不同的 FontProperties 实例:

x = np.arange(1,5,0.5)
plt.figure(1)
plt.plot(x,x,label='Curve 1')
plt.plot(x,2*x,label='Curve 2')
leg = plt.legend(loc = 0, fontsize = 'small')

t1, t2 = leg.get_texts()
# here we create the distinct instance
t1._fontproperties = t2._fontproperties.copy()
t1.set_size('medium')

plt.show()

现在尺码正确了:

如果您为绘图中的文本渲染激活 LaTeX,则可以采用更简单的方法。您可以毫不费力地实现这一点,在 'imports':

之后使用额外的命令行
plt.rc('text', usetex=True)

现在您可以通过在要用 LaTeX 处理的字符串的开头指定 r 来更改任何特定字符串的大小,并在 (\small, \Large, \Huge, 等)。 例如:

r'\Large Curve 1'

看看你改编的代码。只做了一些小改动!

import numpy as np
import matplotlib.pyplot as plt

plt.rc('text', usetex=True) #Added LaTeX processing

x = np.arange(1,5,0.5)
plt.figure(1)
#Added LaTeX size commands on the formatted String
plt.plot(x,x,label=r'\Large Curve 1')
plt.plot(x,2*x,label=r'\Huge Curve 2')
plt.legend(loc = 0, fontsize = 'small')
#leg.get_texts()[0].set_fontsize('medium')
plt.show()

所以你得到这个: