解决 Linux 下使用 matplotlib 中文乱码问题

loskyertt Unknown

1.出现的问题

以下面这个代码为例:

1
2
3
4
5
6
7
8
9
10
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 12)
y = x ** 2 + 4
plt.title("Matplotlib demo")
plt.xlabel("时间(分钟)")
plt.ylabel("金额($)")
plt.plot(x,y)
plt.show()

在 Linux 下使用 Python 的matplotlib包默认是会出现乱码的:

乱码.png
乱码.png

2.解决方法

首先需要下载字体,网上常用的中文字体是SimHei下载地址

2.1 方式一:直接在代码中引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.font_manager as fm

font_path = "/home/sky/下载/SimHei.ttf" # 设置字体路径
my_font = fm.FontProperties(fname=font_path)

# 手动注册字体
fm.fontManager.addfont(font_path)

# 获取字体名称
font_name = my_font.get_name()
print(f"真实字体名称: {font_name}")

# 设置 Matplotlib 识别该字体
plt.rcParams["font.sans-serif"] = [font_name]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题

2.2 方式二:修改配置文件

  1. 查找存放字体的文件夹
1
2
3
import matplotlib

print(matplotlib.matplotlib_fname()) # 查找字体路径

运行这段代码会打印出字体存放路径,如:

1
/home/sky/miniconda3/envs/test/lib/python3.12/site-packages/matplotlib/mpl-data/matplotlibrc

matplotlibrc是配置文件,一会儿要修改的。然后进入存放字体的目录下:

1
cd /home/sky/miniconda3/envs/test/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf

把下载好的字体文件SimHei.ttf复制到ttf目录下:

1
cp ~/下载/SimHei.ttf .  

然后回到mpl-data目录下,修改matplotlibrc文件:

1
nano matplotlibrc

找到font.seriffont.sans-serif所在位置,如下如所示。在冒号后面加入SimHei,保存退出:

  • 原来的:

    1
    2
    #font.serif:      DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
    #font.sans-serif: DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
  • 修改后的:

    1
    2
    #font.serif:      SimHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
    #font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

修改示意图
修改示意图

  1. 清理缓存

查找缓存位置:

1
2
import matplotlib    
print(matplotlib.get_cachedir())

把缓存文件删除即可:

1
rm ~/.cache/matplotlib -rf

3.解决示例

正常输出.png
正常输出.png

3.1 参考教程

4.负号乱码解决

只要在前面加以段这个代码:

1
2
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False

就能正常显示负号

  • Title: 解决 Linux 下使用 matplotlib 中文乱码问题
  • Author: loskyertt
  • Created at : 2024-09-14 15:01:53
  • Updated at : 2025-01-05 06:26:00
  • Link: https://redefine.ohevan.com/2024/09/14/linux-matplotli乱码解决/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments