如何更改matplotlib图例和图例标题的字体系列?

py49o6xq  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(129)

我想在我的matplotlib图例中使用字体家族“Consolas”,以使等宽字体受益。我还想要一个图例标题。
但似乎当我更改我的图例的字体系列时,它会擦除图例标题。
下面是一个代码来查看问题:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
plt.plot(np.linspace(0, 10), np.linspace(0, 1), label='First plot     #1')
plt.plot(np.linspace(0, 10), np.linspace(0, 2), label='Second plot    #2')
plt.legend(loc='best', title="My Awesome Legend Title")

# I would like to use a Monospaced font so I have found this snippet to do so
plt.setp(ax.legend().texts, family='Consolas')
# But as you can see, my legend title just disapeared !!!

# how can I do ?
# Can I force again the legend title ?
ax.legend(title="My NEW Awesome Legend Title")
# Yes ! But it changes the font family again to default.

你有什么解决办法吗?谢谢你的帮助和宝贵的时间。

zpjtge22

zpjtge221#

有几点:

  • 图例的标题在执行ax.legend()后立即消失,因此这种消失实际上不是由于设置字体引起的。这只是创建了一个没有标题的新图例。
  • 图例标题和图例文本是单独的项目。

这对我很有效:

leg = ax.get_legend()
plt.setp(leg.get_title(), family='Ubuntu Mono')
plt.setp(leg.get_texts(), family='Ubuntu Mono')

Consolas不是我系统上可用的字体之一。

i2byvkas

i2byvkas2#

虽然@Warren Weckesser的答案有效,但我想我应该指出,这可以直接在ax.legend()中通过proptitle_fontproperties关键字实现:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.plot(np.linspace(0, 10), np.linspace(0, 1), label='First plot     #1')
ax.plot(np.linspace(0, 10), np.linspace(0, 2), label='Second plot    #2')
ax.legend(loc='best', title="My Awesome Legend Title")
ax.legend(loc='best', title="My Awesome Legend Title",
          prop=dict(family='monospace'),
          title_fontproperties=dict(family='monospace'))

旁注:如果你只使用等宽字体来对齐“#1”和“#2”,那么你可以使用latex来实现这一点,而不需要使用不同的字体系列:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['text.usetex'] = True

fig, ax = plt.subplots()
ax.plot(np.linspace(0, 10), np.linspace(0, 1), label='First plot \hphantom{Second} \#1')
ax.plot(np.linspace(0, 10), np.linspace(0, 2), label='Second plot \hphantom{First} \#2')
ax.legend(loc='best', title="My Awesome Legend Title")

相关问题