开始前,先通过几张图来感受一下:
快速上手
1. 自动化生成器
饼状图应该是最简单的统计图表了,用以介绍 matplotlib 画图方式最为合适。数据准备就绪,生成饼状图只需若干行代码:
import matplotlib.pyplot as plt
# data to plot
labels = ('Python', 'C++', 'Ruby', 'Java',)
sizes = (215, 130, 245, 210,)
colors = ('gold', 'yellowgreen', 'lightcoral', 'lightskyblue',)
plt.pie(
sizes,
labels=labels,
colors=colors,
autopct='%1.1f%%',
)
plt.title("Programming Languages")
plt.show()
第 4-5 行,为待渲染数据,包括 数值 以及 标签 ;第 7 行,定义渲染 颜色 ;第 9-14 行,配置饼图,包括数值、标签、颜色以及百分比展示;第 16 行,为图表追加 标题 ;第 18 行,将图表展示出来。
运行程序后,画出的图表效果如下:
2. 字体
在编程世界,中文一直是个麻烦事。不折腾一番, matplotlib 是不能渲染中文文本的。
让 matplotlib 支持中文 的方式有不少,接下来介绍一种最简单的:准备好字体文件,为文本定义 FontProperties 并设置。除了指定 字体 , FontProperties 还支持 字号 、 粗细 、 斜体 、 下划线 等属性设置。
import matplotlib.pyplot as plt
import matplotlib.font_manager as mfm
fonts = (
('微软雅黑', 'Downloads/Microsoft Yahei.ttf',),
('中易黑体', 'Downloads/SimHei.ttf',),
('仿宋', 'Downloads/FangSong.ttf',),
('宋体', 'Downloads/STSong.ttf',),
)
# load font files
label_fonts = tuple(
mfm.FontProperties(fname=path, size=10)
for _, path in fonts
)
title_fonts = label_fonts[0].copy()
title_fonts.set_size(18)
# data to plot
labels = [name for name, _ in fonts]
sizes = (215, 130, 245, 210,)
colors = ('gold', 'yellowgreen', 'lightcoral', 'lightskyblue',)
patches, texts, autotexts = plt.pie(
sizes,
labels=labels,
colors=colors,
autopct='%1.1f%%',
)
for text, font in zip(texts, label_fonts):
text.set_fontproperties(font)
plt.title("编程语言", fontproperties=title_fonts)
plt.show()
程序第 11-15 行加载字体文件,并设置字号;第 17-18 行在第一个标签字体基础上设置新字号,作为标题字体, 第 33-34 行为 4 个标签分别设置字体;第 36 行指定标题,同时设置标题字体。
运行程序后,画出的图表效果如下:
Github 上有个项目提供一些字体文件,以供测试:dolbydu/font
3. 保存图片
将图表保存成文件,只需调用 savefig 方法。保存为 PNG 图片:
plt.savefig('foo.png')
文件格式由文件后缀名决定,另存为 PDF 文件:
plt.savefig('foo.pdf')
如果仅需获取保存文件内容,则可借助 BytesIO :
import io
bio = io.BytesIO()
plt.savefig(bio, format='png')
bio.seek(0)
content = bio.read()
matplotlib 疑难杂症
1. backend
在 OSX 下,用 virtualenv 提供的虚拟 Python 环境运行 matplotlib ,会抛异常:
ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
关键信息是, Python 不是作为 framework 安装,因此找不到 Mac OS X backend 。解决方法也非常简单,只需在使用 matplotlib 之前,先设置使用 TkAgg :
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
当然了,也可以将设置写到配置文件,一劳永逸:
$ cat ~/.matplotlib/matplotlibrc
backend: TkAgg
2. 圆形不圆
使用 pyinstaller 对程序进行打包后再运行,发现一个诡异的现象:用 pie 方法画出的饼状图变成了一个椭圆!同样的程序直接运行 python 命令运行是完全正常的,这太奇怪了!应该是 pyinstaller 额外运行一些 hook 代码导致的,由于时间关系没细究。
为了解决这个问题,只需添加一行代码:
ax.set_aspect('equal')