Ubuntu下用matplotlib作图时显示中文

本文提供了一套详细的步骤来解决Ubuntu系统中matplotlib无法正常显示中文的问题,包括安装中文字体、配置字体文件等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在Ubuntu下用matplotlib作图的时候发现无法正常显示中文,查了一番以后发现是Ubuntu系统和matplotlib库没有共同可显示的中文字体库的原因。用此文章的方法可以解决这一问题。

1.首先需要安装中文字体

git clone https://github.com/tracyone/program_font && cd program_font && ./install.sh

PS:文章中说需要删除matplotlib的缓存列表~/.cache/matplotlib/fontList.py3k.cache,但是在下并没有删,可能是这个原因导致之后文中的调用方法并没有起效而是换了一种。

2.将安装的ttf字体文件复制到matplotlib的字体文件夹中(安装的ttf文件一般在/use/share/fonts/MyFonts/目录下)

用matplotlib.matplotlib_fname()命令可以获取matplotlib的字体配置文件。比如在下的在如下位置/home/MyUserName/anaconda2/envs/tensorflow/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc.那么相应的字体目录在mpl-data/fonts/ttf下。

cp /use/share/fonts/MyFonts/*.ttf /your/path/to/mpl-data/fonts/ttf/

3.寻找matplotlib和Ubuntu都能用的中文字体 (原文源代码)

__author__ = 'Katherine'
from matplotlib.font_manager import FontManager
import subprocess

fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)

output = subprocess.check_output(
    'fc-list :lang=zh -f "%{family}\n"', shell=True)
output = output.decode('utf-8')
# print '*' * 10, '系统可用的中文字体', '*' * 10
# print output
zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))
available = mat_fonts & zh_fonts

print('*' * 10, '可用的字体', '*' * 10)
for f in available:
    print(f)

输出为(基本是刚安装的中文字体):

********** 可用的字体 **********
YouYuan
SimHei
YaHei Consolas Hybrid
FangSong
KaiTi
Microsoft YaHei
LiSu
Yahei Mono

4.配置matplotlib字体文件

上面提到字体文件为matplotlibrc文件,编辑此文件找到font.family, font.serif, font.sans-serif行,删除句首#,然后将上述可用字体添加进去并用 , 隔开。例如:font.family: YouYuan, SimHei, FangSong, ...

5.脚本中进行申明

import pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体,但在下运行的时候报了warning并没正常显示中文

改用此方法则可行:

from matplotlib.font_manager import FontProperties
chinese_font = FontProperties(fname='/usr/share/fonts/MyFonts/YaHei.Consolas.1.11b.ttf')
...
plt.text(x, y, display, fontsize=12, fontproperties=chinese_font)

font_manager的用法可用看这里

参考:

1.How to Let Matplotlib Display Chinese Correctly
3.https://monkey0105.github.io/posts/2016/Dec/15/matplotlib_chinese_display/#3rd,findavailableChinesefontsbothinmatplotlibandubuntu

<think>我们正在解决Ubuntumatplotlib显示中文的问题。根据引用,问题通常是由于matplotlib默认字体不支持中文或字体路径不匹配导致的。解决方案包括安装中文字体、配置matplotlib使用该字体,以及清除缓存。步骤:1.安装中文字体(如SimHei)到系统中。2.将字体文件复制到matplotlib的字体目录。3.删除matplotlib的缓存文件。4.在代码中设置matplotlib的字体。具体操作:第一步:安装中文字体(以SimHei为例)可以通过以下命令安装常用中文字体包(包含SimHei等): ```bashsudo aptinstall fonts-wqy-microhei#文泉驿微米黑,包含常用中文字体sudo aptinstall fonts-wqy-zenhei#文泉驿正黑```或者,手动下载SimHei.ttf(黑体)字体文件,然后将其复制到系统字体目录: ```bash#创建用户字体目录(如果不存在)mkdir-p~/.fonts#将下载的SimHei.ttf复制到该目录cp /path/to/SimHei.ttf~/.fonts/#更新字体缓存fc-cache -fv```第二步:将字体文件复制到matplotlib的字体目录找到matplotlib的字体目录,通常位于: ```bashpython-c"importmatplotlib;print(matplotlib.matplotlib_fname())" ```该命令会输出matplotlib的配置文件路径,如:`/usr/local/lib/python3.8/dist-packages/matplotlib/mpl-data/matplotlibrc`,则字体目录通常是在该路径下的`fonts/ttf`目录。或者,使用以下命令找到字体目录:```bashpython-c"importmatplotlib;print(matplotlib.get_cachedir())"```缓存目录的上一级通常是`mpl-data`,其下就有`fonts/ttf`。通常,我们可以直接将字体文件复制到matplotlib的字体目录(例如:`/usr/local/lib/python3.8/dist-packages/matplotlib/mpl-data/fonts/ttf/`)或用户级别的目录(例如:`~/.local/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/`)。第三步:删除matplotlib的缓存缓存目录可以通过以下命令找到: ```bashpython -c "import matplotlib; print(matplotlib.get_cachedir())"```通常,缓存目录在`~/.cache/matplotlib`。删除该目录下的所有文件: ```bashrm -rf ~/.cache/matplotlib/*```第四步:在代码中设置字体在Python代码中,我们可以通过以下方式设置字体:```pythonimportmatplotlib.pyplotas pltplt.rcParams['font.sans-serif'] =['SimHei']#用来正常显示中文标签plt.rcParams['axes.unicode_minus'] =False#用来正常显示负号```或者,使用更通用的方法(指定一个已安装的中文字体):```pythonimportmatplotlib asmplmpl.rc('font',family='SimHei')```如果上述方法不起作用,可以尝试使用绝对路径指定字体文件(较少用):```pythonfrommatplotlib.font_manager importFontPropertiesfont= FontProperties(fname='/path/to/font/SimHei.ttf')#然后在绘指定fontproperties=font```注意:有需要重启Python内核或重新运行脚本。示例代码: ```pythonimport matplotlib.pyplot aspltplt.rcParams['font.sans-serif']= ['WenQuanYiMicro Hei','SimHei', 'DejaVu Sans']#可以指定多个字体,依次尝试plt.rcParams['axes.unicode_minus'] =Falseplt.plot([1,2,3], [4,5,6]) plt.title('中文标题') plt.show()```如果仍然无法显示,请检查:1.字体是否安装成功:使用`fc-list :lang=zh`查看系统中已安装的中文字体。2.是否删除了matplotlib的缓存。3.在代码中是否成功设置了字体。引用说明: [^1]:参考了安装中文字体和配置matplotlib的步骤。 [^2]:解释了乱码的原因:默认字体不支持中文或路径不匹配。 [^3]:提到了重建字体缓存的方法。 [^4]:强调了正确配置中文字体在数据可视化中的重要性。 [^5]:提到了手动下载字体并复制到matplotlib字体目录的方法。相关问题:1.如何在Ubuntu中安装其他中文字体?2.如果使用Jupyter Notebook,配置matplotlib字体有什么不同?3.除了SimHei,还有哪些常用的中文字体可以在matplotlib中使用?4.如何解决matplotlib中负号显示为方框的问题?5.如何永久设置matplotlib的默认字体,避免每次在代码中设置?</think>### Ubuntu下配置Matplotlib支持中文字体显示Ubuntu系统中配置Matplotlib显示中文字体需要解决两个核心问题:**安装支持中文的字体** 和 **正确配置Matplotlib字体路径**。以下是详细步骤: #### 步骤1:安装中文字体(以文泉驿字体为例) ```bash # 安装常用中文字体包 sudo apt install fonts-wqy-microhei # 文泉驿微米黑 sudo apt install fonts-wqy-zenhei # 文泉驿正黑 # 验证安装 fc-list :lang=zh | grep "WenQuanYi" ``` #### 步骤2:定位Matplotlib字体配置目录 ```bash # 获取Matplotlib配置路径 python -c "import matplotlib; print(matplotlib.matplotlib_fname())" # 示例输出:/usr/local/lib/python3.8/dist-packages/matplotlib/mpl-data/matplotlibrc # 进入字体目录(ttf文件夹) cd /path/to/matplotlib/mpl-data/fonts/ttf ``` #### 步骤3:配置Matplotlib使用中文字体 1. **修改配置文件** 打开步骤2获取的`matplotlibrc`文件: ```bash sudo nano /path/to/matplotlib/mpl-data/matplotlibrc ``` 修改以下参数: ```ini font.family : sans-serif font.sans-serif : WenQuanYi Micro Hei, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif axes.unicode_minus : False # 解决负号显示问题 ``` 2. **清除缓存**(关键步骤) ```bash rm -rf ~/.cache/matplotlib/* ``` #### 步骤4:代码中强制指定字体 ```python import matplotlib.pyplot as plt import matplotlib as mpl # 方法1:全局设置 plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] plt.rcParams['axes.unicode_minus'] = False # 方法2:单次设置 plt.title("中文标题", fontname="WenQuanYi Micro Hei") ``` #### 验证配置 ```python import matplotlib.pyplot as plt plt.plot([1,2,3], [4,5,6]) plt.title("中文标题测试 - 成功显示") plt.xlabel("X轴标签") plt.ylabel("Y轴标签") plt.show() ``` #### 常见问题解决 1. **字体仍不显示**: - 手动复制字体到Matplotlib目录: ```bash cp /usr/share/fonts/truetype/wqy/wqy-microhei.ttc /path/to/matplotlib/mpl-data/fonts/ttf/ ``` - 重建字体缓存: ```python import matplotlib.font_manager matplotlib.font_manager._rebuild() ``` 2. **Jupyter环境问题**: - 在Jupyter Notebook首行添加: ```python %matplotlib inline from matplotlib.font_manager import _rebuild _rebuild() # 重建字体缓存 ``` > **关键原理**:Matplotlib默认使用英文字体库,通过将中文字体添加到其字体路径并清除缓存,使字体引擎能正确加载中文渲染能力[^2][^4]。文泉驿字体是Ubuntu官方源支持的开源中文字体,兼容性最佳[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值