本博客内容均基于环境:Ubuntu18.04 + Python3.7
中文字体
Matplotlib图像中不能显示中文,报错:Font family ['sans-serif'] not found. Falling back to DejaVu Sans...
按以下步骤解决:
我从Win10中拷贝了msyh.ttf
和simhei.ttf
字体文件,备份在文件夹/home/data/linuxdocus/Documents/Backup/fonts
中。
参考一:
第一步:下载字体:msyh.ttf (微软雅黑)放在系统字体文件夹下:/usr/share/fonts
同时我也复制了下放在matplotlib的字体文件夹下了(不知道这一步是不是必须)/usr/local/lib/python3.5/dist-packages/matplotlib/mpl-data/fonts/ttf/
第二步:修改matplotlib配置文件:sudo vim /usr/local/lib/python3.5/dist-packages/matplotlib/mpl-data/matplotlibrc删除font.family和font.sans-serif两行前的#,并在font.sans-serif后添加中文字体Microsoft YaHei, …(其余不变)
第三步:删除~/.cache/matplotlib下文件fontList.py3k.cache重启python即可
另外:可以执行下这段程序–可以打印出可用的字体:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
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)
#print( '*' * 10, '系统可用的中文字体', '*' * 10)
#print (output)
zh_fonts = set(f.split(',', 1)[0] for f in output.decode('utf-8').split('\n'))
available = mat_fonts & zh_fonts
print ('*' * 10, '可用的字体', '*' * 10)
for f in available:
print (f)
参考链接:https://www.zhihu.com/question/25404709/answer/128171562
参考二:
1.查看系统是否有中文字体
~$ fc-list (“:lang=zh”可添加此后缀单独查看安装的中文字体)
运行结果如下:
/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: DejaVu Serif:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf: DejaVu Sans:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf: DejaVu Sans:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf: DejaVu Serif:style=Book
没有发现任何中文字体
2.下载SimHei.ttf字体
由于系统没有任何中文字体,需要自己准备中文字体,Ubuntu支持TTF字体,这里笔者下载的是SimHei字体(百度搜索下载,注意要是ttf)
3.将SimHei字体拷贝到matplotlib字体目录
jupyter输入并运行:
import matplotlib
matplotlib.matplotlib_fname()
得到:
/home/linuxbrew/.linuxbrew/opt/python/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
在FillZill中输入:
/home/linuxbrew/.linuxbrew/opt/python/lib/python3.6/site-packages/matplotlib/mpl-data
即可看到fonts文件夹—->进入ttf文件夹——->将字体拷贝进入即可
4.修改matplotlibrc配置
在控制台输入:
vi /home/linuxbrew/.linuxbrew/opt/python/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
进入到文件内容中,使用上下光标建找到
1)font.family : sans-serif ,去掉前面的 # 号
2)font.sans-serif ,去掉前面的 # 号,并在后面内容首位添加一个SimHei
3)axes.unicode_minus,去掉前面的 # 号,将True改为False,解决负号‘-‘显示为方块的问题
5.删除~/.cache/matplotlib缓存文件夹
一定要删除这个文件夹,一般在系统目录下面,比如ubuntu这个文件夹下面
6.常见问题
1)当matplotlib/mpl-data/fonts/ttf中没有指定字体是执行时会出现如下错误
font_manager.py:1287: UserWarning: findfont: Font family [u’sans-serif’] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext]))
2)有字体但还是显示小方块,一般是没有删除~/.cache/matplotlib 的缓冲目录
参考链接:http://supercalifragilisticexpiadocious.com/archives/277
双y轴绘制
# 20190111:使用双Y轴绘图(合并图例)
fig = plt.figure(figsize=(18, 9))
ax = fig.add_subplot(111)
labels = ['acc', 'sens', 'spec', 'R', 'varR', 'stdR', 'fit', 'fit_a']
for i in range(4):
ax.plot(plotVar[:, i], label=labels[i])
ax2 = ax.twinx() # this is the important function
for i in range(4, plotVar.shape[1]):
ax2.plot(plotVar[:, i], label=labels[i]) # , 'r'
ax.legend(loc=3)
ax2.legend(loc=4)
ax.grid()
ax.set_title("GA_SVM_Result")
ax.set_xlabel('Number of Generation')
ax.set_ylabel('Metrics')
ax.set_xlim([-20, MAXGEN+20])
ax2.set_ylabel('OtherMetrics')
plt.xticks(np.arange(0, MAXGEN+20, 20))
plt.savefig('{}.jpg'.format(os.path.join(filepath, 'GA_SVM_Result')))
plt.show()
参考链接:https://www.cnblogs.com/Atanisi/p/8530693.html
Matplotlib图像详解
Data-ink Ratio
: “数据笔墨率”,用来表示Data-ink在印制一张图表所用墨水中所占的比率。Data-ink是指一张图表中用来代表数据的无法擦除的核心部分所使用的墨水。
chartjunk
: 所有存在于图表当中的,对人们理解该图表所要反映的信息没有帮助,甚至会分散看图表者注意力的可视元素。
参考链接:【Matplotlib】详解图像各个部分