全面设置matplotlib字体参数

Posted

技术标签:

【中文标题】全面设置matplotlib字体参数【英文标题】:Comprehensively setting matplotlib font parameters 【发布时间】:2020-06-16 08:57:03 【问题描述】:

根据我对this documentation 的了解,matplotlib 提供了 3 种更改绘图样式参数的方法(例如axes.grid)。这些方法是:使用样式表一次设置多个参数;通过matplotlib.rcParamsmatplotlib.rc设置具体参数;或使用matplotlibrc 文件设置默认值。

我想了解在上面列出的每个方法中是否可以访问 所有 参数,以及在哪里可以找到所有 参数的完整列表.

我试图从链接的文档中理解这一点,但我经常失败。一个具体的例子是设置轴字体。我通常使用这样的组合:

axis_font = 'fontname':'Arial', 'size':'32'
ax.set_ylabel('some axis title',**axis_font)

但不清楚我设置了什么matplotlib 参数(如果有)。例如,是否存在可以包含在样式文件中的轴字体参数?

我的代码中的其他尝试包括令人困惑的块,例如:

legend_font = 'fontname':'Arial', 'size':'22'
#fonts global settings
matplotlib.rc('font',family=legend_font['fontname'])

从名称上看,它似乎会改变图例字体,但实际上它显然是在为整体字体设置参数。并且尺寸没有被使用。 特别是图例字体和图例大小是否有matplotlib 参数?

我尝试过的事情是:

检查链接页面底部的示例matplotlibrc(没有专门的轴符号或图例字体) 正在打印matplotlib.rcParams(没有轴符号或图例字体) 检查axis api(无法与示例样式文件匹配,例如classic predefined style file 具有facecolor 集,该页面中提到了,但它也有edgecolor 集,该页面未提及)

【问题讨论】:

rcParams 只是一个默认值字典,被认为允许设置为默认值很有用。不能保证任何特定的方法在他的 rcParams 中有一个条目,它们不应该被认为是各种类或方法的 kwargs 的同义词。 如果要更改图例字体,建议您使用ax.legend(prop=fontprop),而不是切换rcParam。同样,对于轴字体... @JodyKlymak 好的。如果我理解你在说什么,这意味着对我的直接问题的一个非常简单的回答。即不,轴和图例字体不能由rcParams设置如果这是答案,请发布。 This page 尤其是sample rc file 应该会有所帮助。 那么也许你看的不够仔细,这个问题每个部分的答案都包含在那个页面中。查看示例 rc 文件特别有用,因为它包含一个完整的 每个 参数列表,可以使用rcParamsmatplotlibrc 文件或样式表进行修改。是的,您可以使用这三种方法中的任何一种来修改同一组参数。 【参考方案1】:

更改字体的rcParams 属性是font.family,它接受'serif''sans-serif''cursive'、'fantasy''monospace',如链接的sample matplotlibrc file 中所述。如果 text.usetexFalse 它还接受任何具体的字体名称或字体名称列表 - 将按照指定的顺序进行尝试,直到其中一个起作用。

此方法将指定的字体名称应用于整个图形(以及全局完成时的所有图形)。如果要修改单个 Text 实例(即轴标签)的字体系列,可以使用 matplotlib.text.Text.set_family()(这是 matplotlib.text.Text.set_fontfamily() 的别名)

import matplotlib.pyplot as plt

ylabel = plt.ylabel("Y Label")
ylabel.set_family("DejaVu Serif")
plt.xlabel("X Label")

plt.show()

要为图例实例设置字体系列,您可以使用plt.setp,例如

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

ylabel = plt.ylabel("Y Label")
plt.xlabel("X Label")
ylabel.set_family("DejaVu Serif")

legend = plt.legend(handles = [mpatches.Patch(color='grey', label="Label")])
plt.setp(legend.texts, family="EB Garamond")

plt.show()


请注意,当text.usetexTrue 时,此方法将不起作用。

【讨论】:

谢谢,非常有用。在我看来,这意味着轴和图例字体 不能 使用样式表单独设置(例如)。您可以改为设置整体字体。然后,您可以在绘图时间之前更改特定对象的内容,例如 ylabel。同样可以在绘图时间之前通过调用matplotlib.pyplot.setp 来更改图例。我很想知道情节的其他方面是否无法使用样式表或类似方式全局(一次)设置——我喜欢情节的统一风格,所以我想设置一次并且永远不会改变。 @villaa 您的结论是正确的,即单个文本实例的字体系列不能使用样式表设置,只能使用全局字体系列。如果您想“设置一次并且永远不会更改它”并且需要不同的字体用于轴标签、图例等,那么我建议编写一个包含单个生成函数的函数(例如plt.xlabel())并响应用于设置字体系列的自定义参数。 好的,请将其添加到答案中。我会接受这个作为最佳答案。

以上是关于全面设置matplotlib字体参数的主要内容,如果未能解决你的问题,请参考以下文章

python使用matplotlib可视化使用fontsize参数设置单个图像的字体的大小使用rcParams.update参数全局设置字体的大小(font size)

matplot绘图

Python Matplot中文显示完美解决方案

Python Matplot中文显示完美解决方案

matplot:在matplotlib中显示标签的问题[重复]

在Mac OS X 10.6上的Python中,无法在Matplotlib中将字体更改为Helvetica