问题描述
使用Vscode中Jupyter插件matplotlib画图时,因为缺少字体,出现warning,图像上label上的中文显示时空白小方块
代码如下:
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1,4,9,16,25]
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)
plt.xlabel('x')
plt.ylabel('y=x^2')
#添加标题
plt.title('多个点绘制折线图') #会出现乱码
#显示绘制的图
plt.show()
报错:
/Users/XXX/opt/anaconda3/lib/python3.8/site-packages/matplotlib/backends/backend_agg.py:238: RuntimeWarning: Glyph 22810 missing from current font.
font.set_text(s, 0.0, flags=flags)
生成结果:
解决方法
方法一
使用MAC自带的字体
#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签
方法二
使用SimHei.ttf字体
1、查看matplotlib字体路径
import matplotlib
print (matplotlib.matplotlib_fname())
# 输出:/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
matplotlib字体路径为:/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data/
2、下载SimHei.ttf字体
3、将下载好的SimHei.ttf字体移动到第一步查询到的字体目录./fonts/ttf/下
注意名字必须是SimHei.ttf
mv /Users/xxx/Downloads/simhei_itmop.com/simhei.ttf /Users/xxx/opt/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/SimHei.ttf
4、清理matplotlib缓冲目录
获取缓存目录
import matplotlib
print(matplotlib.get_cachedir())
# 输出:/Users/xxx/.matplotlib
清理缓存目录
rm -rf /Users/xxx/.matplotlib
5、重新加载新的字体库,并彻底退出重启Vscode(重要)
# python3
Python 3.8.16 | packaged by conda-forge | (default, Feb 1 2023, 16:05:36)
[Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from matplotlib.font_manager import _rebuild
>>> _rebuild()
>>> exit()
6、测试
添加使用指定字体
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
完整代码:
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1,4,9,16,25]
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)
plt.xlabel('x')
plt.ylabel('y=x^2')
#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#添加标题
plt.title('多个点绘制折线图') #会出现乱码
#显示绘制的图
plt.show()
中文显示恢复正常
方法二进阶
上接方法二中将下载好的字体移到matplotlib字体路径下
修改原始文件
打开第一步找到的字体路径:/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc进行修改
#去掉前面的#
font.family: sans-serif
#去掉前面的#,手动加SimHei
font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
#去掉前面的#,把True改为False
axes.unicode_minus: False # use Unicode for the minus symbol rather than hyphen. See
# https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
然后,重复方法二中清理matplotlib缓冲目录,重新加载新的字体库,并彻底退出重启Vscode
之后不需要plt.rcParams['font.sans-serif'] = ['SimHei']就可以自动显示中文
测试:
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1,4,9,16,25]
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)
plt.xlabel('x')
plt.ylabel('y=x^2')
#添加标题
plt.title('多个点绘制折线图')
#显示绘制的图
plt.show()
解决!!!