python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > matplotlib legend()里字体修改

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()

最后吐槽一句,果然图还是要经过精心排版,就这副草图,从长宽比例到颜色搭配再到文字距离啥的,满满的无不是槽点,太难看了。

Test.png

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文