在无头设备上使用 matplotlib

matplotlib 是一个被广泛使用的 Python 绘图库,但是在远程服务器等无头设备上使用时,可能会遇到 plt.show() 无法显示和缺少中文字体的问题。本文将介绍如何解决这些问题。

使用 WebAgg 后端进行显示

matplotlib 默认使用的后端agg,但是在无头设备上使用时,这个后端是无法正常工作的。因此,我们需要使用其他后端进行显示。在无头设备上,我们可以使用 WebAgg 后端进行显示。

打开 Python 控制台,输入以下命令:

1
2
import matplotlib
matplotlib.matplotlib_fname()

这个命令会输出 matplotlib 的配置文件路径。将该配置文件复制到 ~/.config/matplotlib/matplotlibrc,并在其中添加以下内容:

1
backend: WebAgg

这样,在调用 plt.show() 时,matplotlib 就会在 127.0.0.1:8988 上启动一个 Web 服务器以显示图像,你可以通过 SSH 端口转发(VSCode 提供此功能)或者反向代理来访问该网页。你可以更改配置文件来更改监听的地址和端口。

使用中文字体

无头设备通常没有中文字体,因此在使用中文时,matplotlib 会无法显示。我们需要安装中文字体,然后在 matplotlib 的配置文件中指定使用该字体。本文以 SimHei 字体为例。

安装字体

下载 SimHei.ttf,在网上搜索即可。将该字体文件复制到 /usr/share/fonts/ 目录下。如果你没有服务器的 root 权限,可以将该字体文件复制到 ~/.local/share/fonts/ 目录,或在此选择一个目录。

然后找到 matplotlib 的字体缓存:

1
2
import matplotlib
matplotlib.get_cachedir()

输出的路径就是字体缓存的路径,删除该文件夹:

1
rm -rf /path/to/cache

下一次使用 matplotlib 时,就会重新生成字体缓存,这时就会包含 SimHei 字体了。但是在这之前,你需要先在 matplotlib 的配置文件中指定使用 SimHei 字体。

指定字体

打开 matplotlib 的配置文件 ~/.config/matplotlib/matplotlibrc ,添加以下内容:

1
2
3
font.family: sans-serif
font.sans-serif: SimHei
axes.unicode_minus: False

此时,你就可以在 matplotlib 中使用中文了。

Reference

  1. matplotlib docs: matplotlib backends
  2. matplotlib docs: The matplotlibrc file
  3. Mr. Liu's Tech Blog: wsl 安装字体与配置
  4. matplotlib/font_manager.py: X11FontDirectories
作者

Cao Mingjun

发布于

2023-02-27

更新于

2023-02-27

许可协议

评论