矩池云上matplotlib显示中文乱码
下载字体https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansSC.zip命令可以是cd /wget https://download.fastgit.org/be5invis/source-han-sans-ttf/releases/download/v2.002.1/source-han-sans
·
检测Ubuntu 和 Matplotlib 都可用的中文字体
from matplotlib.font_manager import FontManager
import subprocess
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
#print(mat_fonts)
output = subprocess.check_output(
'fc-list :lang=zh -f "%{family}\n"', shell=True) # 获取字体列表
output = output.decode('utf-8')
#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)
输出:
********** 可用的字体 **********
WenQuanYi Zen Hei
表示WenQuanYi Zen Hei
这个中文字体可用。
如果你检测出没有可用的中文字体,你可以下载SimHei字体,然后将字体移动到matplotlib相关的字体目录中。
- 下载SimHei字体
wget https://us-logger1.oss-cn-beijing.aliyuncs.com/SimHei.ttf
- 查看matplotlib安装目录
import matplotlib
# 查了安装路径
print(matplotlib.get_data_path())
'''
/root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data
matplotlib字体目录在:/root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/
'''
- 将下载好的中文字体移动到对应目录
mv SimHei.ttf /root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/
临时使用
# 随便绘制一个饼图
import matplotlib.pyplot as plt
import matplotlib as mpl
font_name = "WenQuanYi Zen Hei"
mpl.rcParams['font.family']= font_name # 指定字体,实际上相当于修改 matplotlibrc 文件 只不过这样做是暂时的 下次失效
mpl.rcParams['axes.unicode_minus']=False # 正确显示负号,防止变成方框
fig1 = plt.figure() # 先创建一个图像对象
plt.pie([0.5, 0.3, 0.2], # 值
labels=['我', '你', '它'], # 标签
explode=(0, 0.2, 0), # (爆裂)距离
autopct='%1.1f%%', # 显示百分数格式
shadow=True) # 是否显示阴影
plt.show()
如上所示,在代码中新增了:
mpl.rcParams['font.family']= font_name # 指定字体
mpl.rcParams['axes.unicode_minus']=False # 正确显示负号
永久有效
修改matplotlib设置文件,在mpl-data/matplotlibrc,利用vim打开即可,修改三个地方,修改好后保存即可:
vim /root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
# 第一个地方:font.family: sans-serif这一句前面的#去掉
font.family: sans-serif
# 第二个地方:在:(冒号)后加一个SimHei
font.sans-serif: SimHei, DejaVu Sans, Bitstream ...
# 第三个地方:axes.unicode_minus后的值改为False
axes.unicode_minus: False
修改好后,重启下kernel,最好删除下matplotlib缓存的目录下的配置文件,
# matplotlib缓存的目录
import matplotlib
print(matplotlib.get_cachedir())
'''
/root/.cache/matplotlib
'''
后面就可以直接显示中文了。如果后面还想用,记得保存环境。
参考文章
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献9条内容
所有评论(0)