Python 绘图库 Matplotlib 入门教程


Posted in Python onApril 19, 2018

运行环境

由于这是一个Python语言的软件包,因此需要你的机器上首先安装好Python语言的环境。关于这一点,请自行在网络上搜索获取方法。

关于如何安装Matplotlib请参见这里:Matplotlib Installing。

笔者推荐大家通过pip的方式进行安装,具体方法如下:

sudo pip3 install matplotlib

本文中的源码和测试数据可以在这里获取:matplotlib_tutorial

本文的代码示例会用到另外一个Python库:NumPy。建议读者先对NumPy有一定的熟悉,我之前也写过一个NumPy的基础教程,参见这里:Python 机器学习库 NumPy 教程。

本文的代码在如下环境中测试:

  • Apple OS X 10.13
  • Python 3.6.3 matplotlib 2.1.1
  • numpy 1.13.3

介绍

Matplotlib适用于各种环境,包括:

  • Python脚本
  • IPython shell Jupyter notebook
  • Web应用服务器
  • 用户图形界面工具包

使用Matplotlib,能够的轻易生成各种类型的图像,例如:直方图,波谱图,条形图,散点图等。并且,可以非常轻松的实现定制。

入门代码示例

下面我们先看一个最简单的代码示例,让我们感受一下Matplotlib是什么样的:

# test.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
plt.show()

这段代码的主体逻辑只有三行,但是它却绘制出了一个非常直观的线性图,如下所示:

Python 绘图库 Matplotlib 入门教程

对照着这个线形图,我们来讲解一下三行代码的逻辑:

  • 通过np.arange(100, 201)生成一个[100, 200]之间的整数数组,它的值是:[100, 101, 102, … , 200]
  • 通过matplotlib.pyplot将其绘制出来。很显然,绘制出来的值对应了图中的纵坐标(y轴)。而matplotlib本身为我们设置了图形的横坐标(x轴):[0, 100],因为我们刚好有100个数值
  • 通过plt.show()将这个图形显示出来

这段代码非常的简单,运行起来也是一样。如果你已经有了本文的运行环境,将上面的代码保存到一个文本文件中(或者通过Github获取本文的源码),然后通过下面的命令就可以在你自己的电脑上看到上面的图形了:

python3 test.py

注1:后面的教程中,我们会逐步讲解如何定制图中的每一个细节。例如:坐标轴,图形,着色,线条样式,等等。

注2:如果没有必要,下文的截图会去掉图形外侧的边框,只保留图形主体。

一次绘制多个图形

有些时候,我们可能希望一次绘制多个图形,例如:两组数据的对比,或者一组数据的不同展示方式等。

可以通过下面的方法创建多个图形:

多个figure

可以简单的理解为一个figure就是一个图形窗口。matplotlib.pyplot会有一个默认的figure,我们也可以通过plt.figure()创建更多个。如下面的代码所示:

# figure.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
data2 = np.arange(200, 301)
plt.figure()
plt.plot(data2)
plt.show()

这段代码绘制了两个窗口的图形,它们各自是一个不同区间的线形图,如下所示:

Python 绘图库 Matplotlib 入门教程

注:初始状态这两个窗口是完全重合的。

多个subplot

有些情况下,我们是希望在同一个窗口显示多个图形。此时就这可以用多个subplot。下面是一段代码示例:

# subplot.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.subplot(2, 1, 1)
plt.plot(data)
data2 = np.arange(200, 301)
plt.subplot(2, 1, 2)
plt.plot(data2)
plt.show()

这段代码中,除了subplot函数之外都是我们熟悉的内容。subplot函数的前两个参数指定了subplot数量,即:它们是以矩阵的形式来分割当前图形,两个整数分别指定了矩阵的行数和列数。而第三个参数是指矩阵中的索引。

因此,下面这行代码指的是:2行1列subplot中的第1个subplot。

plt.subplot(2, 1, 1)

下面这行代码指的是:2行1列subplot中的第2个subplot。

plt.subplot(2, 1, 2)

所以这段代码的结果是这个样子:

Python 绘图库 Matplotlib 入门教程

subplot函数的参数不仅仅支持上面这种形式,还可以将三个整数(10之内的)合并一个整数。例如:2, 1, 1可以写成2112, 1, 2可以写成212

因此,下面这段代码的结果是一样的:

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.subplot(211)
plt.plot(data)
data2 = np.arange(200, 301)
plt.subplot(212)
plt.plot(data2)
plt.show()

subplot函数的详细说明参见这里:matplotlib.pyplot.subplot

常用图形示例

Matplotlib可以生成非常多的图形式样,多到令人惊叹的地步。大家可以在这里:Matplotlib Gallery 感受一下。

本文作为第一次的入门教程,我们先来看看最常用的一些图形的绘制。

线性图

前面的例子中,线性图的横轴的点都是自动生成的,而我们很可能希望主动设置它。另外,线条我们可能也希望对其进行定制。看一下下面这个例子:

# plot.py
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 6, 9], '-r')
plt.plot([1, 2, 3], [2, 4, 9], ':g')
plt.show()

这段代码可以让我们得到这样的图形:

Python 绘图库 Matplotlib 入门教程

这段代码说明如下:

plot函数的第一个数组是横轴的值,第二个数组是纵轴的值,所以它们一个是直线,一个是折线; 最后一个参数是由两个字符构成的,分别是线条的样式和颜色。前者是红色的直线,后者是绿色的点线。关于样式和颜色的说明请参见plot函数的API Doc:matplotlib.pyplot.plot

散点图

scatter函数用来绘制散点图。同样,这个函数也需要两组配对的数据指定x和y轴的坐标。下面是一段代码示例:

# scatter.py
import matplotlib.pyplot as plt
import numpy as np
N = 20
plt.scatter(np.random.rand(N) * 100,
   np.random.rand(N) * 100,
   c='r', s=100, alpha=0.5)
plt.scatter(np.random.rand(N) * 100,
   np.random.rand(N) * 100,
   c='g', s=200, alpha=0.5)
plt.scatter(np.random.rand(N) * 100,
   np.random.rand(N) * 100,
   c='b', s=300, alpha=0.5)
plt.show()

这段代码说明如下:

这幅图包含了三组数据,每组数据都包含了20个随机坐标的位置 参数c表示点的颜色,s是点的大小,alpha是透明度

这段代码绘制的图形如下所示:

Python 绘图库 Matplotlib 入门教程

scatter函数的详细说明参见这里:matplotlib.pyplot.scatter

饼状图

pie函数用来绘制饼状图。饼状图通常用来表达集合中各个部分的百分比。

# pie.py
import matplotlib.pyplot as plt
import numpy as np
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
data = np.random.rand(7) * 100
plt.pie(data, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.legend()
plt.show()

这段代码说明如下:

data是一组包含7个数据的随机数值 图中的标签通过labels来指定 autopct指定了数值的精度格式 plt.axis('equal')设置了坐标轴大小一致 plt.legend()指明要绘制图例(见下图的右上角)

这段代码输出的图形如下所示:

Python 绘图库 Matplotlib 入门教程

pie函数的详细说明参见这里:matplotlib.pyplot.pie

条形图

bar函数用来绘制条形图。条形图常常用来描述一组数据的对比情况,例如:一周七天,每天的城市车流量。

下面是一个代码示例:

# bar.py
import matplotlib.pyplot as plt
import numpy as np
N = 7
x = np.arange(N)
data = np.random.randint(low=0, high=100, size=N)
colors = np.random.rand(N * 3).reshape(N, -1)
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
plt.title("Weekday Data")
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)
plt.show()

这段代码说明如下:

这幅图展示了一组包含7个随机数值的结果,每个数值是[0, 100]的随机数 它们的颜色也是通过随机数生成的。np.random.rand(N * 3).reshape(N, -1)表示先生成21(N x 3)个随机数,然后将它们组装成7行,那么每行就是三个数,这对应了颜色的三个组成部分。如果不理解这行代码,请先学习一下Python 机器学习库 NumPy 教程 title指定了图形的标题,labels指定了标签,alpha是透明度

这段代码输出的图形如下所示:

Python 绘图库 Matplotlib 入门教程

bar函数的详细说明参见这里:matplotlib.pyplot.bar

直方图

hist函数用来绘制直方图。直方图看起来是条形图有些类似。但它们的含义是不一样的,直方图描述了数据中某个范围内数据出现的频度。这么说有些抽象,我们通过一个代码示例来描述就好理解了:

# hist.py
import matplotlib.pyplot as plt
import numpy as np
data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K']
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]
plt.hist(data, bins=bins, label=labels)
plt.legend()
plt.show()

上面这段代码中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]生成了包含了三个数组的数组,这其中:

第一个数组包含了3000个随机数,这些随机数的范围是 [0, 3000) 第二个数组包含了4000个随机数,这些随机数的范围是 [0, 4000) 第三个数组包含了5000个随机数,这些随机数的范围是 [0, 5000)

bins数组用来指定我们显示的直方图的边界,即:[0, 100) 会有一个数据点,[100, 500)会有一个数据点,以此类推。所以最终结果一共会显示7个数据点。同样的,我们指定了标签和图例。

这段代码的输出如下图所示:

Python 绘图库 Matplotlib 入门教程

在这幅图中,我们看到,三组数据在3000以下都有数据,并且频度是差不多的。但蓝色条只有3000以下的数据,橙色条只有4000以下的数据。这与我们的随机数组数据刚好吻合。

hist函数的详细说明参见这里:matplotlib.pyplot.hist

结束语

通过本文,我们已经知道了Matplotlib的大致使用方法和几种最基本的图形的绘制方式。

需要说明的是,由于是入门教程,因此本文中我们只给出了这些函数和图形最基本的使用方法。但实际上,它们的功能远不止这么简单。因此本文中我们贴出了这些函数的API地址以便读者进一步的研究。

Python 相关文章推荐
Python base64编码解码实例
Jun 21 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
python3实现磁盘空间监控
Jun 21 Python
Python编程深度学习计算库之numpy
Dec 28 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
Python使用Pygame绘制时钟
Nov 29 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
python 列表删除所有指定元素的方法
Apr 19 #Python
Python 机器学习库 NumPy入门教程
Apr 19 #Python
python 显示数组全部元素的方法
Apr 19 #Python
PyQt5每天必学之进度条效果
Apr 19 #Python
python中实现将多个print输出合成一个数组
Apr 19 #Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 #Python
PyQt5实现下载进度条效果
Apr 19 #Python
You might like
SONY SRF-M100的电路分析
2021/03/02 无线电
PHP 实用代码收集
2010/01/22 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
护理专业推荐信
2013/11/07 职场文书
《春笋》教学反思
2014/04/15 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
学校团代会开幕词
2016/03/04 职场文书
python 网络编程要点总结
2021/06/18 Python