Matplotlib学习笔记

本博客内容均基于环境:Ubuntu18.04 + Python3.7

中文字体

Matplotlib图像中不能显示中文,报错:Font family ['sans-serif'] not found. Falling back to DejaVu Sans...
按以下步骤解决:
我从Win10中拷贝了msyh.ttfsimhei.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】详解图像各个部分

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值