matplotlib自定义字体、字体设置总结

2023-10-30 17:02:32 浏览数 (2)

字体设置是规范图片内容的重要组成,本文内容:

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使用场景做出区别。限于笔者水平,如有错误,望请纠正,欢迎交流。

0 人点赞