全面设置matplotlib字体参数
Posted
技术标签:
【中文标题】全面设置matplotlib字体参数【英文标题】:Comprehensively setting matplotlib font parameters 【发布时间】:2020-06-16 08:57:03 【问题描述】:根据我对this documentation 的了解,matplotlib
提供了 3 种更改绘图样式参数的方法(例如axes.grid
)。这些方法是:使用样式表一次设置多个参数;通过matplotlib.rcParams
或matplotlib.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 文件特别有用,因为它包含一个完整的 每个 参数列表,可以使用rcParams
、matplotlibrc
文件或样式表进行修改。是的,您可以使用这三种方法中的任何一种来修改同一组参数。
【参考方案1】:
更改字体的rcParams
属性是font.family
,它接受'serif'
、'sans-serif'
、'cursive'
、'fantasy'
和'monospace'
,如链接的sample matplotlibrc
file 中所述。如果 text.usetex
是 False
它还接受任何具体的字体名称或字体名称列表 - 将按照指定的顺序进行尝试,直到其中一个起作用。
此方法将指定的字体名称应用于整个图形(以及全局完成时的所有图形)。如果要修改单个 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.usetex
为True
时,此方法将不起作用。
【讨论】:
谢谢,非常有用。在我看来,这意味着轴和图例字体 不能 使用样式表单独设置(例如)。您可以改为设置整体字体。然后,您可以在绘图时间之前更改特定对象的内容,例如ylabel
。同样可以在绘图时间之前通过调用matplotlib.pyplot.setp
来更改图例。我很想知道情节的其他方面是否无法使用样式表或类似方式全局(一次)设置——我喜欢情节的统一风格,所以我想设置一次并且永远不会改变。
@villaa 您的结论是正确的,即单个文本实例的字体系列不能使用样式表设置,只能使用全局字体系列。如果您想“设置一次并且永远不会更改它”并且需要不同的字体用于轴标签、图例等,那么我建议编写一个包含单个生成函数的函数(例如plt.xlabel()
)并响应用于设置字体系列的自定义参数。
好的,请将其添加到答案中。我会接受这个作为最佳答案。以上是关于全面设置matplotlib字体参数的主要内容,如果未能解决你的问题,请参考以下文章
python使用matplotlib可视化使用fontsize参数设置单个图像的字体的大小使用rcParams.update参数全局设置字体的大小(font size)