最近做了一个云盘性能对比,用 matplotlib 绘制了一张图,但是碰到了中文乱码问题。简单搜索之后,发现有人总结出了比较好的方案,亲测可行。推荐给大家。
作者:nphard
原文链接:http://nphard.me/2016/03/27/matplotlib-cn
一个中文乱码问题,让我搞的好苦,总结一下。
安装 matplotlib
pip 安装失败,使用 apt - get install matplotlib安装成功
简单程序
importmatplotlib.pyplot aspl
frommatplotlib.ticker importMultipleLocator, FuncFormatter
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
pl.figure(figsize=(8, 4))
pl.plot(x, y)
pl.title('标题')
pl.xlabel('x轴')
pl.ylabel('y轴')
ax = pl.gca()
defpi_formatter(x, pos):
returnstr(int(x)) + '月'
# 设置两个坐标轴的范围
pl.ylim(0, 10)
pl.xlim(0, 12)
# 设置图的底边距
pl.subplots_adjust(bottom=0.15)
pl.grid() # 开启网格
# 主刻度为1
ax.xaxis.set_major_locator(MultipleLocator(1))
# 主刻度文本用pi_formatter函数计算
ax.xaxis.set_major_formatter(FuncFormatter(pi_formatter))
# 设置刻度文本的大小
fortick inax.xaxis.get_major_ticks():
tick.label1.set_fontsize(14)
pl.show()
运行了发现,所有的中文都变成了一个小方框,简单尝试了在开头加 #-*- coding : UTF -8 -*-,和在`'标题'`前加 u,都不好使
动态加载字体
frommatplotlib.font_manager importFontProperties
font = FontProperties(
fname=r"/usr/share/fonts/truetype/arphic/ukai.ttc", size=14)
pl.title('测试程序', fontproperties=font)
pl.xlabel('x轴', fontproperties=font)
pl.ylabel('y轴', fontproperties=font)
ukai是系统里的中文字体。系统里的中文字体可以通过命令 fc - list : lang =zh列出。
尝试后可以发现 title 和 label 的中文显示都正常了,但坐标轴的刻度文字依然不能正常显示。
配置文件 matplotlibrc
这个配置文件在 /etc/下,有的在 ~/.matplotlib/下。可以通过 matplotlib.matplotlib_fname ()打印获得这个路径。
编辑该配置文件,找到 font.family,将注释去掉,在下面的 font.sans - serif :Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial,Helvetica, Avant Garde, sans - serif加上中文字体 SimHei。
font.family:
sans - serif
font.sans - serif:
SimHei, BitstreamVeraSans, LucidaGrande, Verdana, Geneva, Lucid, Arial, Helvetica, AvantGarde, sans - serif
或者直接改为 font.family : SimHei
SimHei可以到 http://fontzone.net/download/simhei下载,我尝试过使用上面提到的 ukai,没有效果。
下载的 SimHei 放到下面任何一个路径均可:
/usr /share / fonts / truetype
/usr / share / matplotlib / mpl - data / fonts / ttf
~ / .fonts
清除缓存
做了上面的更改,发现并没有什么卵用。
到 ~/.cache/matplotlib下的文件删掉,就ok了。
另一种方式,动态配置
frommatplotlib importrcParams
rcParams['font.sans-serif'] = ['SimHei']
rcParams['font.family'] = 'sans-serif'
这样可以不通过配置文件,动态配置。
点击阅读原文,查看更多 Python 教程和资源