Python数据可视化第 2 讲:matplotlib 绘图中文字体设置

1. 常见报错 Font family [‘sans-serif’] not found

1.1 报错现象

在使用 matplotlib 绘图时,中文设置(如 titile、x label、y label 等)经常出现无法正常展示的问题。我们先来看一个代码示例,其中 title、x label、y label 均设置为中文。

# step0:导入画图工具包 matplotlib
import matplotlib.pyplot as plt

# step1:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()

# step2:字体基本设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# step3:在画布上添加一个坐标系,标定绘图位置
axes1 = figure.add_subplot(1, 1, 1)

# step4:准备画图的数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [21, 27, 29, 32, 29, 28, 35, 39, 49]

# step5:设置基本信息
axes1.set_xlabel('X轴')
axes1.set_ylabel('Y轴')
axes1.set_title("图片标题")

# step6:画图,设置线条颜色、线型、点标记符
axes1.plot(x, y, color='red', linestyle='-.', marker='*')

# step7:展示
plt.show()

上面下代码示例执行结果如下图所示,中文设置展示为“口”,与此同时,程序执行过程中也会报错,信息如下。

报错信息:
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
Python数据可视化第 2 讲:matplotlib 绘图中文字体设置_第1张图片

1.2 报错原因

sans-serif 是无衬线字体,是一种通用字体族,常见的中文无衬线字体有:宋体(STSong), 黑体(SimHei), 楷体(Kaiti),隶书(Lisu), 仿宋(FangSong), 幼圆(YouYuan),微软雅黑(Microsoft YaHei)等。之所以出现上面的报错,根本原因在于运行程序的机器上没有对应的字体配置。原因清楚了,问题也就好解决了——下载对应的字体文件,放置于指定的文件目录下并进行配置即可。

1.3 解决方案

步骤-1: 下载需要的字体文件
本文以黑体(SimHei)为例,下载对应的字体文件 “SimHei.ttf”,下载地址

步骤-2: 将下载的字体文件放到指定目录下

  • 通过执行如下代码,获取字体文件路径信息。
import matplotlib    
print(matplotlib.matplotlib_fname())

上述代码执行结果:

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
  • 将字体文件放置于如下文件目录(不同的操作系统略有差异):
    /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf 。

步骤-3: 删除 matplotlib 的缓冲目录

  • 通过执行如下代码,获取缓冲目录路径信息。
import matplotlib    
print(matplotlib.get_cachedir())
  • 执行命令删除缓存目录。

对于 Linux、Mac OX 类型操作系统,可以直接使用命令“rm -rf 路径” 删除缓存,对于 Windows 系统可以手动删除。本文所示的例子中,删除命令为:

rm -rf  /Users/guojin/.matplotlib

步骤-4: 修改文件 matplotlibrc,增加配置
这一步非常关键,很多时候配置不生效,都是由于此步骤缺失。修改 matplotlibrc 文件
修改/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc,修改内容有三处,如下所示:

# 1.去掉前面的 # 号,这是一个注解符
font.family         : sans-serif   
# 2.去掉前面的 # 号,并在冒号后面添加 SimHei   
font.sans-serif     : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif  
# 3.去掉前面的 # 号,并将True改为False
 axes.unicode_minus  : False

步骤-5: 重启集成开发环境-IDE
经过上述步骤,基本大功告成,重启集成开发环境-IDE(Eclipse、IntelliJ IDEA等),重新运行程序即可正常显示。注意:重启大多数时候都是必要的!!!

1.4 问题修复后的执行结果

Python数据可视化第 2 讲:matplotlib 绘图中文字体设置_第2张图片

2. matplotlib 字体设置

2.1 设置字体的类型

在上一节的例子中已经介绍了字体的设置方法,这里重新回顾一下。

# 字体基本设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

除了 SimHei 之外,常用的中文字体还有很多,设置方式如下:

plt.rcParams['font.sans-serif']=['STSong']     ## 中文宋体
plt.rcParams['font.sans-serif']=['SimHei']     ## 中文黑体
plt.rcParams['font.sans-serif']=['Kaiti']      ## 中文楷体
plt.rcParams['font.sans-serif']=['Lisu']       ## 中文隶书
plt.rcParams['font.sans-serif']=['FangSong']   ## 中文仿宋
plt.rcParams['font.sans-serif']=['YouYuan']    ## 中文幼圆

2.2 设置字体的格式

通过执行如下代码,获取字体文件路径信息。

import matplotlib    
print(matplotlib.matplotlib_fname())

通过上述代码,获得字体文件路径为:

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc

文件 matplotlibrc 中有一段默认的配置,如下所示:

#font.style   : normal
#font.variant : normal
#font.weight  : normal
#font.stretch : normal
#font.size    : 10.0

在实际应用中,我们可以通过修改上述配置,或者在代码中直接设置实现字体格式控制。其中,字体的 style 和 weight 有如下选项:

# 字体粗细、类型
styles=['normal','italic','oblique']
weights=['light','normal','medium','semibold','bold','heavy','black']

你可能感兴趣的:(Python数据可视化)