字体设置是规范图片内容的重要组成,本文内容:
1)如何查找matplotlib支持的字体
2)自定义字体运用到matplotlib中
3)matplotlib的FontProperties和font_dict应用场景
1.1 查看matplotlib支持的字体
代码语言:javascript复制from matplotlib import font_manager
for font in font_manager.fontManager.ttflist:
print(font.name, '-', font.fname) #输出字体名称和路径
---结果---
...
Bodoni MT - C:WindowsFontsBOD_B.TTF
Malgun Gothic - C:WindowsFontsmalgun.ttf
Consolas - C:WindowsFontsconsolai.ttf
...
该方法输出的字体包括:matplotlib库自带的字体和系统已安装字体
系统已安装字体在:C:WindowsFont 文件夹下
matplotlib自带字体在matplotlib安装路径的mpl-datafontsttf文件夹下
系统已安装字体
1.2 在matplotlib中正确使用字体名
以“楷体”为例,如何在matplotlib中查找正确的使用名称?
1.在使用的字体文件上右击,选择属性
2.查看文件英文名称(注意大小写)和后缀名(是.ttf还是.TTF)。如楷体,对应英文名为"simkai",后缀名为".ttf“
3.根据英文名和后缀名在matplotlib查找正确使用名称
代码语言:javascript复制for font in font_manager.fontManager.ttflist:
if font.fname.split('\')[-1] == 'simkai.ttf':
print(font.name, '-', font.fname)
---结果---
KaiTi - C:WindowsFontssimkai.ttf
结论:根据输出结果,如果在matplotlib中使用楷体,则字体名为”KaiTi"而不是"simkai"
2 使用自定义字体
现使用4种字体(新罗马、宋体、方正舒体、楷体)绘图,并将这四种字体使用到坐标轴上(使用1.2的第3步获取matplotlib正确使用的字体)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['axes.unicode_minus'] =False #使用中文字体(例如宋体、隶书、楷体等都不支持负号,需要添加此语句以支持)
#根据1.2第3步获取的正确4种字体使用名称:楷体、宋体、方正舒体、新罗马
font_ls = ['KaiTi', 'SimSun', 'FZShuTi', 'Times New Roman']
fig = plt.figure()
i = 0
x = np.linspace(-5, 5, 100)
y = np.sin(x)
for i in range(4):
ax1 = fig.add_subplot(2, 2, i 1)
ax1.plot(x, y)
#设置坐标轴字体格式
plt.setp([ax1.get_xticklabels(), ax1.get_yticklabels()], fontproperties = font_ls[i], size = 10)
ax1.text(-5, -1, font_ls[i])
plt.show()
3 FontProperties和font_dict使用场景
FontProperties和font_dict都是用于设置绘图的字体格式,公有参数均有'family', 'size', 'weight'分别设置字体名称、大小和粗细,定义格式如下:
代码语言:javascript复制import matplotlib.font_manager as fm
fm1 = fm.FontProperties(family = 'Times New Roman', size = 20, weight = 'normal')
font1 = {'family': 'Times New Roman', 'size': 20, 'weight': 'normal'}
但FontProperties和font_dict使用场景略有不同:
方法 | 字体参数 | 参数内容 |
---|---|---|
ax.set_xtickables,ax.set_ytickables | fontproperties | FontProperties实例或fontdict字典 |
ax.set_xticks,ax.set_yticks | fontproperties | FontProperties实例或fontdict字典 |
ax.set_xlabel,ax.set_ylabel,ax.text,ax.set_title | fontdict | fontdict字典 |
ax.legend | prop | fontdict字典 |
示例如下:
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
import matplotlib.font_manager as fm
fm1 = fm.FontProperties(family = 'Times New Roman', size = 20, weight = 'normal')
font1 = {'family': 'Times New Roman', 'size': 20, 'weight': 'normal'}
fig = plt.figure()
ax1 = fig.add_subplot(111)
x = np.linspace(-5, 5, 100)
y = np.sin(x)
ax1.plot(x, y, label = 'sin(x)')
plt.setp([ax1.get_xticklabels(), ax1.get_yticklabels()], fontproperties = fm1) #两个都可用
ax1.set_xlabel('X axis', fontdict = font1) #不可用FontProperties
ax1.set_ylabel('Y axos', fontdict = font1)
ax1.text(-5, -0.8, 'text', fontdict = font1) #不可用FontProperties
ax1.set_xticks(np.arange(-5, 5, 2), labels = ['A', 'B', 'C', 'D', 'E'], fontproperties = fm1) #两个都可用
ax1.legend(prop = font1) #不可用FontProperties
ax1.set_title('sin function map', fontdict = font1) #不可用FontProperties
plt.show()
END
本文介绍了matplotlib自定义字体的使用以及如何使用系统自带字体,并对FontProperties和font_dict使用场景做出区别。限于笔者水平,如有错误,望请纠正,欢迎交流。