matplotlib设置中文字体


作者Lou Xiao创建时间2024-03-20 13:05:06更新时间2024-03-20 13:05:06

0. 前言

matplotlib是非常流行的画图软件包,在科研和工程中有着广泛的应用。由于字体的设置不当,绘图中的中文不能正常显示。本教程着手解决这个问题,并提供2种方法。

1. 方法1(常用方法)

此方法通过修改matplotlib的配置/参数,指定合适的默认字体,属于比较常用的方法。

1.1 安装中文字体

在Linux系统上,常见的字体路径是:

  • /usr/share/fonts/usr/local/share/fonts:系统级安装的字体,影响整个操作系统;
  • ~/.fonts/:这是当前用户的个人字体目录,用于存放用户自己的字体文件。如果该目录不存在,可以手动创建它。
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 步骤1. 把自定义的字体文件(例如:仿宋_GB2312.ttf)拷贝到`/usr/share/fonts`(需要root权限) 或 `~/.fonts/`。
2 cp 仿宋_GB2312.ttf ~/.fonts/
3 # 步骤2. 刷新字体缓存,这个命令将重新扫描字体目录,并刷新字体缓存,使新安装的字体可用。
4 fc-cache -f -v
5 # 步骤3. 查看已经安装的字体
6 fc-list
7 # 步骤4. 清除matplotlib的字体缓存
8 rm -v ~/.cache/matplotlib/font*

1.2 设置中文字体

我们已安装了中文字体(例如:仿宋_GB2312.ttf),绘图前需要设置matplotlib的字体。

❶ 查看字体文件对应的family

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 fc-list : file family

输出如下:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 /usr/share/X11/fonts/Type1/c0611bt_.pfb: Courier 10 Pitch
2 /home/LouXiao/.fonts/仿宋_GB2312.ttf: FangSong_GB2312
3 /usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf: DejaVu Sans
4 /usr/share/X11/fonts/Type1/c0648bt_.pfb: Bitstream Charter
5 /usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf: DejaVu Sans
6 /usr/share/fonts/dejavu/DejaVuSansCondensed.ttf: DejaVu Sans,DejaVu Sans Condensed

从第二行,我们获取了字体(仿宋_GB2312.ttf)的family是FangSong_GB2312

❷ 在Python代码中设置字体

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 import matplotlib
2 matplotlib.rcParams['font.size'] = 12
3 matplotlib.rcParams['font.family'] = 'FangSong_GB2312'
4 # 强制清除字体缓存
5 matplotlib.font_manager._rebuild()

2. 方法2

这种方法仅通过代码方式指定中文字体,优点是对用户友好、稳健,缺点是编程较为繁琐。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 引入需要的库
2 import os
3 import matplotlib.pyplot as plt
4 from matplotlib.font_manager import FontProperties
5
6 # 指定字体的绝对路径(字体文件可以是任意路径)
7 font_file = "/home/LouXiao/仿宋_GB2312.ttf"
8 font_property = FontProperties(fname=font_file)
9
10 # 对于suptitle
11 plt.suptitle("这是中文字体", font=font_property)
12 # 对于title
13 plt.title("这是中文字体", font=font_property)
14 # 对于legend
15 plt.legend(prop=font_property)
文章目录