了解 Matplotlib 字体相关知识
- Matplotlib 默认不支持中文字体显示,会出现中文乱码的情况。这是因为 Matplotlib 在渲染文本时,使用的字体库没有包含中文字体。
- Matplotlib 使用
rcParams
来控制各种默认参数,包括字体相关的参数。
- 方法一:修改全局字体设置(适用于整个脚本或笔记本)
- 步骤一:找到中文字体文件路径
- 首先需要确定你想要使用的中文字体文件的位置。在 Windows 系统中,字体文件通常位于
C:\Windows\Fonts
目录下;在 Linux 系统中,字体文件一般在/usr/share/fonts
或/usr/local/share/fonts
等目录下。
- 步骤二:修改
rcParams
设置
- 假设你要使用宋体(SimSun)字体,并且字体文件路径为
C:\Windows\Fonts\simsun.ttc
(这是在 Windows 系统下的路径示例)。 - 在 Python 脚本或 Jupyter Notebook 的开头添加以下代码:
import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties # 设置字体路径 font_path = 'C:\\Windows\\Fonts\\simsun.ttc' font = FontProperties(fname = font_path, size = 12) plt.rcParams['font.family'] = font.get_name()
- 这里首先导入了
plt
(Matplotlib 的绘图模块)和FontProperties
(用于管理字体属性)。然后指定了字体路径font_path
,并通过FontProperties
创建了字体对象font
,其包含字体名称和大小等属性。最后,将plt.rcParams['font.family']
设置为该字体的名称,这样在整个脚本或笔记本中的所有图形绘制都会使用这个中文字体。
- 方法二:仅在特定元素中使用自定义字体(局部设置)
- 步骤一:找到字体文件路径并加载字体
- 同样先找到字体文件路径,例如还是使用宋体(SimSun),字体文件路径为
C:\Windows\Fonts\simsun.ttc
。 - 在绘图代码中添加以下内容来加载字体:
from matplotlib.font_manager import FontProperties font_path = 'C:\\Windows\\Fonts\\simsun.ttc' font_prop = FontProperties(fname = font_path)
- 步骤二:在绘图元素中应用字体
- 假设你要绘制一个柱状图,并且要为坐标轴标签设置中文字体。示例代码如下:
import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4]) y = np.array([10, 20, 30, 40]) font_path = 'C:\\Windows\\Fonts\\simsun.ttc' font_prop = FontProperties(fname = font_path) plt.bar(x, y) plt.xlabel("类别", fontproperties = font_prop) plt.ylabel("数量", fontproperties = font_prop) plt.show()
- 这里在
xlabel
和ylabel
函数中通过fontproperties
参数传入了之前加载的字体属性font_prop
,使得坐标轴标签使用了自定义的中文字体,而其他部分(如标题、图例等)如果没有特别设置,仍然使用默认字体。
- 方法三:使用系统字体名称(更简便,但可能因系统而异)
- 步骤一:确定系统中文字体名称
- 在某些操作系统中,可以直接使用系统中文字体的名称来设置 Matplotlib 的字体。例如,在 Windows 系统中,宋体的名称可能是
SimSun
。
- 步骤二:修改
rcParams
或局部应用字体名称
- 全局修改:
import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'SimSun'
- 局部修改:
import matplotlib.pyplot as plt plt.xlabel("类别", fontfamily='SimSun')
- 这种方法比较简便,但需要注意字体名称可能因系统和字体安装情况而有所不同,可能会出现找不到字体的情况。而且在一些跨平台的项目中,这种方法的稳定性可能不如前两种方法。