linux平台matplotlib或pandas绘图plot坐标中文乱码问题
·
背景/问题
我使用jupyter notebook运行在远程linux服务器上,使用pandas.Series的plot绘制图形时,发现坐标中有乱码,为空白方格型。
踩坑
搜索相关资料,发现主要都是介绍windows上的乱码问题,让设置字体为黑体或仿宋等,但实际上linux系统上并没有装这些字体,所以无效。
解决方案
也可以直接跳到4尝试按我的配置设置字体,如果不行再尝试1 2 3步骤
1 查询系统中有哪些字体
import matplotlib.font_manager as fm
print(fm.findSystemFonts())
会给出类似这样的输出:
['/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc',
'/usr/share/fonts/truetype/tlwg/Purisa-Oblique.ttf',
'/usr/share/fonts/truetype/tlwg/Kinnari.ttf',
'/usr/share/fonts/opentype/urw-base35/NimbusSansNarrow-Oblique.otf',
'/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf',
2 支持中文的字体
在我的系统中,存在多个明确支持中文的字体,主要来自谷歌的 Noto CJK 系列和安卓经典的 Droid Sans Fallback 系列。以下是具体支持中文字体的详细信息:
| 字体文件路径 | 字体类型 | 特点与用途 |
|---|---|---|
/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc | 无衬线宋体(粗体) | Noto CJK 系列核心字体,专为东亚语言(中、日、韩)设计,支持简体中文、繁体中文,粗体适合标题/强调文本 |
/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc | 无衬线宋体(常规体) | 同上,常规字重,适合正文排版,兼容性强,是 Linux 系统中常见的中文默认字体之一 |
/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc | 衬线宋体(粗体) | Noto CJK 衬线系列,字体带有衬线(笔画末端装饰),风格更正式,适合书籍、文档等严肃场景的标题 |
/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc | 衬线宋体(常规体) | 同上,常规字重,衬线设计提升长文本阅读体验,适合中文正文排版 |
/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf | 无衬线 fallback 字体 | 安卓系统经典中文 fallback 字体,专门用于显示中文等非拉丁文字符,“Full” 版本包含更全的中文生僻字,兼容性极佳 |
3 确认字体实际可检索的名称
因为上面查到的都是ttf的源文件名,是不能让matplotlib直接检索的,需要使用字体对应的名字,以DroidSansFallbackFull为例,使用如下代码查询:
import matplotlib.font_manager as fm
# 查找 DroidSansFallbackFull.ttf 的内部名称
for font in fm.findSystemFonts():
if "DroidSansFallbackFull.ttf" in font:
font_prop = fm.FontProperties(fname=font)
print("字体内部名称:", font_prop.get_name()) # 这是正确的配置名称
实际输出为:
字体内部名称: Droid Sans Fallback
4 设置matplotlib默认字体
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
# 1. 重置所有 matplotlib 配置(清除旧缓存)
mpl.rcParams.update(mpl.rcParamsDefault)
# 2. 用查到的正确名称配置("Droid Sans Fallback")
mpl.rcParams["font.family"] = ["Droid Sans Fallback", "sans-serif"] # 覆盖所有字体场景
mpl.rcParams["axes.unicode_minus"] = False # 解决负号问题
# 3. 绘图
a.plot(XX)
plt.show()
更多推荐
所有评论(0)