Matplotlib基础(杂):中文及英文字体设置

记一下在Matplotlib绘图中默认字体的调整,以及中文字体绘图时会涉及的乱码问题,本文主要参考

包引入,需要注意的是,此处默认绘图要么统一中文要么统一英文,不考虑中英文混杂的情况

1
2
3
4
5
6
7
8
9
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

matplotlib.rcParams['figure.dpi'] = 150
# 解决中文乱码问题
plt.rcParams["font.family"] = "serif"
plt.rcParams["font.serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

内置及本地字体查看

配置文件matplotlibrc,查看字体列表位置:

1
2
3
matplotlib.get_cachedir()
# fontlist = "C:/Users/huangs/.matplotlib/fontlist-v330.json"
matplotlib.matplotlib_fname()# 当前工作路径的默认字体属性文件

查看具体及本地全部中英文字体的别名:

1
2
[f.name for f in matplotlib.font_manager.fontManager.afmlist]
[f.name for f in matplotlib.font_manager.fontManager.ttflist]

当前的默认字体

1
2
3
print(plt.rcParams["font.serif"][0])
print(plt.rcParams["font.sans-serif"][0])
print(plt.rcParams["font.monospace"][0])

字体类别及设置

了解一下中英文字体和分类,此处对字体进行初步了解

英文

Matplotlib中字体大类==Family==有{'cursive', 'fantasy', 'monospace', 'sans', 'sans-serif', 'serif'},常用的就 'sans serif', 'serif'。选择字体时先选择大类再设置对应的具体字体,如下:

1
2
3
4
5
6
7
8
9
# 选择无衬线字体并将其指定为“Helvetica”
plt.rcParams["font.family"] = "sans-serif"
plt.rcParams["font.sans-serif"] = ["Helvetica"]
# 选择无衬线字体并将其指定为“Times New Roman”
plt.rcParams["font.family"] = "serif"
plt.rcParams["font.serif"] = ["Times New Roman"]
# 选择等宽字体并将其指定为“FreeMono”
plt.rcParams["font.family"] = "monospace"
plt.rcParams["font.monospace"] = ["FreeMono"]

常用字体:

  • Sans Serif:无衬线体,如Arial(等线),Calibri,Helvetica,Consolas,Noto Sans SC
  • Serif:衬线体,笔画的末尾有“衬线”,棱角分明一些,似乎对印刷更为友好:Times New Roman,Courier,Noto Serif SC,Georgia, Droid Serif, Cambria

中文

中文常用的字体别称如下,具体名称可以在第一节除查看:

1
2
3
plt.rcParams["font.family"] = "serif"
plt.rcParams["font.serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
字体名称 别名
宋体 SimSun
黑体 Simhei
楷体 KaiTi
等线 DengXian
仿宋 FangSong
微软雅黑 Microsoft YaHei
华文宋体 STSong
华文中宋 STZhongsong
华文楷体 STKaiti
方正舒体 FZShuTi
华文新魏 STXinwei
方正姚体 FZYaoTi

绘图参考,比如此处我设置华文新魏字体

字体属性

字体属性在涉及文本的属性设置如text或者labels,都可以添加属性字典调节:

包括:颜色、字体风格、是否加粗、倾斜、大小、透明度、背景颜色、对齐方式、背景框bbox等等

  • 如果单独设置则:fontsize, fontstyle,fontweight...,详细参考字体属性
1
2
3
4
5
6
7
8
9
10
11
12
fontdict = {
'family': 'serif',
'alpla':0.5,
'style': 'italic',
'color': 'darkred',
'weight': 'bold',
'size': 16,
'va': 'center',# 对齐方式verticalalignment
'rotation':40,#'vertical'
bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10}
}
ax.text(2, 6, '注释', fontdict=fontdict)