Matplotlib 科学绘图字体设置

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

   Over, 我要去忙了,欢迎交流 python、Arcgis 和 CLM,R语言也会一点,现在不怎么用了。最后吐槽一句,果然图还是要经过精心排版,就这副草图,从长宽比例到颜色搭配再到文字距离啥的,满满的无不是槽点,太难看了。
Test.png

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值