matplotlib legend()里字体如何修改

 更新时间:2023年09月14日 14:40:07   作者:沉思的雅典娜  
这篇文章主要介绍了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

总结

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

相关文章

  • Python实现对比不同字体中的同一字符的显示效果

    Python实现对比不同字体中的同一字符的显示效果

    这篇文章主要介绍了Python实现对比不同字体中的同一字符的显示效果,也就是对比不同字体中某个字的显示效果,这在做设计时非常有用,需要的朋友可以参考下
    2015-04-04
  • django创建超级用户过程解析

    django创建超级用户过程解析

    这篇文章主要介绍了django创建超级用户过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 总结Python编程中函数的使用要点

    总结Python编程中函数的使用要点

    这篇文章主要介绍了Python编程中函数的使用要点总结,文中也讲到了人民群众喜闻乐见的lambda表达式的用法,需要的朋友可以参考下
    2016-03-03
  • python中字典dict常用操作方法实例总结

    python中字典dict常用操作方法实例总结

    这篇文章主要介绍了python中字典dict常用操作方法,实例总结了Python针对字典操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Python pathlib模块使用方法及实例解析

    Python pathlib模块使用方法及实例解析

    这篇文章主要介绍了Python pathlib模块使用方法及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 举例讲解Python中的list列表数据结构用法

    举例讲解Python中的list列表数据结构用法

    这篇文章主要介绍了Python中的list列表数据结构用法,列表是Python内置的六种集合类数据类型中最常见的之一,需要的朋友可以参考下
    2016-03-03
  • python日志模块loguru详解

    python日志模块loguru详解

    大家好,本篇文章主要讲的是python日志模块loguru详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • python列表与元组详解实例

    python列表与元组详解实例

    python列表与元组详解实例,本文是基于python2.x的讲解,这点一定要注意。
    2013-11-11
  • python复制列表时[:]和[::]之间有什么区别

    python复制列表时[:]和[::]之间有什么区别

    这篇文章主要给大家介绍了关于python复制列表时[:]和[::]之间有什么区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Python进程间通讯与进程池超详细讲解

    Python进程间通讯与进程池超详细讲解

    进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块主要通过队列方式,队列:队列类似于一条管道,元素先进先出,需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态
    2022-12-12

最新评论