matplotlib legend()里字体如何修改
作者:沉思的雅典娜
这篇文章主要介绍了matplotlib legend()里字体如何修改问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
matplotlib legend()里字体修改
背景:准备投论文,因为操蛋的模板要求,所以你得好好修改。
对legend()显示的内容的字体进行修改
labelss = plt.legend(loc='upper right').get_texts() [label.set_fontname('Times New Roman') for label in labelss] label = labelss[0] label.set_fontproperties('SimSun')
如果你在一个plt显示多个线条,每个线条都设置label后,在最后通过plt.legend()方法显示,在这种情况下,要是中文设置宋体,英文设置Times New Roman,那你呵呵吧,通过set_fontname只会修改整体,而通过set_fontproperties才能对单个label进行修改。具体参考了matplotlib.Text的属性。
matplotlib 科学绘图字体设置
近期文章定稿,在确认最终版的插图时,被导师指出来很多没注意到的细节,其中印象最深的怕就是上下标的字体了,因为一开始用的是 Latex 的公式编译,所以没有注意到上下标的问题,结果在导师指出之后,才发现所有的上下标的字号都是有问题的,果然啊,大佬的一句指点对我们这些小菜鸡来说,就是一个质的提升啊。
借记录上下标的字体设置,将 Matplotlib 的所有相关的字体设置都记录下来。
闲话少说,直接上代码吧,完事接着去爆肝。
# -*- coding: utf-8 -*- """ @ Author: Tsinlu_Lee @ Mails: liqinlu19@mails.ucas.ac.cn liql0429@163.com @ Address: Beijing, China """ import matplotlib as mpl mpl.rcdefaults() # 恢复 mpl 为默认设置 mpl.mathtext.FontConstantsBase.sup1 = 0.45 # 注意,这个用法在matplotlib 3.4 以后被弃用了,替代 # 功能我没有找到,你们要是知道的话可以留言告诉我 """ 2023/06/14 更新 from matplotlib.mathtext import _mathtext as mathtext mathtext.FontConstantsBase.sup1 = 0.45 找到了哈,这个功能移入_mathtext中,更新一下。参考引文如下👇 https://stackoverflow.com/questions/41837171 """ # 一般来说,这些内容需要在代码最开始声明,为了增强比较,我在后面的代码中加了这两行代码,注意 # 设置的差别 import matplotlib.pyplot as plt plt.rcParams["mathtext.default"]="regular" # 设置公式的字体和其他字体统一 font_options = {"family":"Arial","size":16} fig = plt.figure(figsize=(5,3.8),dpi=540) # mpl 使用 inch 作为画布大小的单位,1 inch = 2.54 cm, # 为了标准规范的绘图输出,建议直接设置画布大小为 word 中的实际大小,然后设置字号为 11 号,即小四号 fig.text(0.18,0.78,"(a)",fontdict=font_options) # 其实在没有子图的时候,不需要加子图标号的, # 但为了记录子图标号的字体设置,直接在这里加了。 ax1 = plt.subplot(111) # 设置图例 plt.scatter(0.25,0.25, # 点中心的 x, y 位置 s=200, # 点的大小,设为与x, y 等长度的数组时,可以绘制气泡图 marker="s", # 点的形状 ec="k", # 点的边框颜色 fc="wheat", # 点的填充颜色 linewidths=1.2, # 点的边框粗细 label="Test point") # 设置点的图例名称 plt.legend(loc="lower left", framealpha=0, prop = font_options) # 关键来了,在 mpl 中,大多数设置字体的命令都是 fontdict, # 但设置图例时却变成了 prop # 设置上下标 plt.text(x=0.5,y=0.9,s = "CO$_2$ flux (g C m$^{-2}$ s$^{-1}$)") # 使用默认字体 plt.text(x=0.5,y=0.8,s = "CO$_2$ flux (g C m$^{-2}$ s$^{-1}$)",ha="center") # 使用默认字体 mpl.rcdefaults() # 为了便于比较上下标的差别,先恢复 mpl 为默认设置 plt.text(x=0.5,y=0.7,s = "CO$_2$ flux (g C m$^{-2}$ s$^{-1}$)",ha="center", fontdict=font_options) mpl.mathtext.FontConstantsBase.sup1 = 0.45 # 注意,这个用法在matplotlib 3.4 以后被弃用了, # 替代功能我没有找到,你们要是知道的话可以留言告诉我 plt.text(x=0.5,y=0.6, s = "$\mathregular{CO_2}$ flux (g C m$\mathregular{^{-2}}$ s$\mathregular{^{-1}}$)", ha="center",fontdict=font_options) # 设置横纵坐标刻度字体 plt.xticks([0,0.5,1]) plt.yticks([0,0.5,1]) """ 2023/07/12 更新 最近发现一个更花的玩法,记录一下 plt.xticks([0,0.5,1],[0,0.5,1],fontdict=font_options) 这句代码会把plt.xticks变为plt.text,直接可以定义字体,简直不要太爽。 """ plt.tick_params(labelsize=14) # labels = ax1.get_xticklabels() + ax1.get_yticklabels() 同时设置横纵坐标 labels = ax1.get_xticklabels() # 为了对比,只设置横坐标,纵坐标使用默认 [label.set_fontname('Arial') for label in labels] # 设置横纵坐标标签的字体 # 为了对比,只设置横坐标,纵坐标使用默认 plt.xlabel("xLabels",fontdict=font_options) plt.ylabel("yLabels") plt.subplots_adjust(bottom=0.16) plt.savefig("./Test.png",dpi = 720) plt.show()
最后吐槽一句,果然图还是要经过精心排版,就这副草图,从长宽比例到颜色搭配再到文字距离啥的,满满的无不是槽点,太难看了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。