如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,原因在于图表数据更加直观且形象化,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做数据可视化。
当使用图表来表示数据时,我们可以更有效地分析数据,并根据分析做出相应的决策。在学习 Matplotlib 之前,了解什么是数据可视化!
图表为更好地探索、分析数据提供了一种直观的方法,它对最终分析结果的展示具有重要的作用。
当您对一个数据集进行分析时,如果使用数据可视化的方式,那么您会很容易地确定数据集的分类模式、缺失数据、离群值等等。下图展示了五个常用的数据可视化图表:
对于组织决策者而言,数据可视化也只是一种辅助工具,从寻找数据间关联到最终做出决定,大致分为以下四步。如下图所示:
组织者决策流程图
下面对图中的流程进行简要说明:
数据可视化主要有以下应用场景:
其实不管是在日常生活,还是工作中,我们都会根据过往的经验作出某些决定,这种做法也叫做“经验之谈”。数据分析和其类似,通过对过往数据的大量分析,从而对数据的未来走势做出预测。
Matplotlib 是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂,深受广大技术爱好者喜爱。
NumPy 是 Python 科学计算的软件包,ndarray 则是 NumPy 提供的一种数组结构。
Matplotlib 由 John D. Hunter 在 2002 年开始编写, 2003 年 Matplotlib 发布了第一个版本,并加入了 BSD 开源软件组织。Matplotlib 1.4 是最后一个支持 Python 2 的版本,它的最新版本 3.1.1 已于 2019 年 7 月 1 日发布。
图1:Matplotlib 图标
Matplotlib 提供了一个套面向绘图对象编程的 API 接口,能够很轻松地实现各种图像的绘制,并且它可以配合 Python GUI 工具(如 PyQt、Tkinter 等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。
Matplotlib 由三个不同的层次结构组成,分别是脚本层、美工层和后端层。
脚本层是 Matplotlib 结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行,它的主要工作是负责生成图形与坐标系。
美工层是结构中的第二层,它提供了绘制图形的元素时的给各种功能,例如,绘制标题、轴标签、坐标刻度等。
后端层是 Matplotlib 最底层,它定义了三个基本类,首先是 FigureCanvas(图层画布类),它提供了绘图所需的画布,其次是 Renderer(绘图操作类),它提供了在画布上进行绘图的各种方法,最后是 Event(事件处理类),它提供了用来处理鼠标和键盘事件的方法。
Matplotlib 生成的图形主要由以下几个部分构成:
许多第三方工具包都对 Matplotlib 进行了功能扩展,其中有些安装包需要单独安装,也有一些允许与 Matplotlib 一起安装。常见的工具包如下:
Matplotlib 是 Python 的第三方绘图库,它非常类似于 MATLAB。在使用 Matplotlib 软件包之前,需要对其进行安装。本节以 Windows10 系统为例,介绍 Matplotlib 的几种安装方式。
MATLAB 是一款商业软件,主要用于数据分析、图像处理、计算机视觉等领域。
使用 Python 包管理器 pip 来安装 Matplotlib 是一种最轻量级的方式。打开 CMD 命令提示符窗口,并输入以下命令:
pip install matplotlib
图1:pip安装Matplotlib
安装 Matplotlib 的最好的方法是下载 Python 的 Anaconda 发行版,因为 Matplotlib 被预先安装在 Anaconda 中。安装方法如下:
Anaconda 是一个开源的 Python 发行版本,其包含了 Python、NumPy、Matplotlib 等180多个科学包及其依赖项。
1) 访问 Anaconda 的官方网站(点击前往),然后单击“Download”按钮,如下图所示:
Anaconda官网
2) 根据您的 Python 解释器版本选择相应的 Anaconda 版本下载。
Anconda 中提供了一个交互式笔记本 Jupyter,您可以把它理解为 IPython 的升级本,它拥有比 IPython 更强大的功能,方便您对程序代码的实时调试。
Jupyter 的本质上是一个 Web 应用程序,它支持运行 40 多种编程语言,主要应用于数据可视化、数值模拟、统计建模以及机器学习等。
当您成功安装 Anaconda 后,您可以通过系统的开始菜单找到 Jupyter,然后启动它,Jupyter 界面如下所示:
Jupyter交互式笔记本
Jupyter 使用方法简单,在本教程不做具体介绍,可以参见官网《Jupyter Notbook使用介绍》。
要验证 Matplotlib 是否成功安装,可以在命令提示符窗口执行以下命令:
'3.1.1'
绘图类型
绘图类型
函数名称
描述
Bar
绘制条形图
Barh
绘制水平条形图
Boxplot
绘制箱型图
Hist
绘制直方图
his2d
绘制2D直方图
Pie
绘制饼状图
Plot
在坐标轴上画线或者标记
Polar
绘制极坐标图
Scatter
绘制x与y的散点图
Stackplot
绘制堆叠图
Stem
用来绘制二维离散数据绘制(又称为“火柴图”)
Step
绘制阶梯图
Quiver
绘制一个二维按箭头
Image函数
图像函数
函数名称
描述
Imread
从文件中读取图像的数据并形成数组。
Imsave
将数组另存为图像文件。
Imshow
在数轴区域内显示图像。
Axis函数
Axis函数
函数名称
描述
Axes
在画布(Figure)中添加轴
Text
向轴添加文本
Title
设置当前轴的标题
Xlabel
设置x轴标签
Xlim
获取或者设置x轴区间大小
Xscale
设置x轴缩放比例
Xticks
获取或设置x轴刻标和相应标签
Ylabel
设置y轴的标签
Ylim
获取或设置y轴的区间大小
Yscale
设置y轴的缩放比例
Yticks
获取或设置y轴的刻标和相应标签
Figure函数
Figure函数
函数名称
描述
Figtext
在画布上添加文本
Figure
创建一个新画布
Show
显示数字
Savefig
保存当前画布
Close
关闭画布窗口
代码执行后,显示结果如下:
sin(angle)正弦函数图像
PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块,随 Matplotlib 软件包一起安装,该模块的导包方式和 Pyplot 不同,如下所示:
PyLab 是一个很便捷的模块,下面对它的使用方法做相应的介绍。
提供一对相同长度的数组(或序列),然后使用plot()绘制曲线,示例如下:
输出结果:
如果您要绘制特殊类型的线条,并想添加一些颜色,PyLab 提供了如下方法:
符号
'-','--','-.',':','.',',',,o,^,v,\<,>,s,+,x,D,d,1,2,3,4,h,H,p,| ,_
颜色
b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色)
使用示例如下:
输出结果:
如果您想在同一绘图区域内绘制多个图形,只需要使用多个绘图命令。示例如下:
输出结果:
该函数的参数值,如下所示:
参数
说明
figsize
指定画布的大小,(宽度,高度),单位为英寸。
dpi
指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
facecolor
背景颜色。
dgecolor
边框颜色。
frameon
是否显示边框。
figure() 创建一个空白画布:
我们使用 add_axes() 将 axes 轴域添加到画布中。如下所示:
add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
设置 x 和 y 轴的标签以及标题,如下所示:
调用 axes 对象的 plot() 方法,对 x 、 y 数组进行绘图操作:
完整的代码如下所示:
输出结果如下:
axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数,如下所示:
下面是 loc 参数的表示方法,分为字符串和整数两种,如下所示:
位置
字符串表示
整数数字表示
自适应
Best
右上方
upper right
左上方
upper left
左下
lower left
右下
lower right
右侧
right
居中靠左
center left
居中靠右
center right
底部居中
lower center
上部居中
upper center
中部
center
10
这是 axes 类的基本方法,它将一个数组的值与另一个数组的值绘制成线或标记,plot() 方法具有可选格式的字符串参数,用来指定线型、标记颜色、样式以及大小。
颜色代码如下表:
'b'
蓝色
'g'
绿色
'r'
红色
'c'
青色
'm'
品红色
'y'
黄色
'k'
黑色
'w'
白色
标记符号如下表:
标记符号
描述
'.'
点标记
'o'
圆圈标记
'x'
'X'标记
'D'
钻石标记
'H'
六角标记
's'
正方形标记
'+'
加号标记
线型表示字符,如下表:
字符
描述
'-'
实线
'--'
虚线
'-.'
点划线
':'
虚线
'H'
六角标记
输出结果如下:
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。
例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。
图1:示意图
如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。
上述代码运行结果,如下图所示:
subplot绘制结果
如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:
执行上述代码,输出结果如下:
add_subplot()绘图结果
通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。
输出结果如下:
输出结果图
subplots 的函数格式如下:
nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列数。
函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)。
下面我们创建了一个 2 行 2 列的子图,并在每个子图中显示 4 个不同的图像。
上述代码的输出结果如下:
函数语法格式如下:
参数含义如下:
下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:
输出结果如下:
subplot2grid()输出结果
grid() 的函数使用格式如下:
grid(color='b', ls = '-.', lw = 0.25)
参数含义如下:
网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果您只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。
上述代码执行后,输出结果:
图1:输出结果
在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。
示例:右侧的子图显示对数刻度,左侧子图则显示标量刻度。
图1:对数关系图
轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。通过指定轴的颜色和宽度,从而对进行显示格式设置,比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:
输出结果如下:
Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。
当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。
下面示例分别对自动设置和自定义设置做了演示:第一种 Matplotlib 自动设置
代码执行后,输出结果如下:
图1:输出结果
第二种:自定义设置,set_xlim() 将 x 轴的数值范围设置为(0到10); set_ylim() 将 y 轴的范围设置为(0到10000)。
输出结果如下:
刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。
xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如下所示:
x 轴上的刻度标记,依次为 2,4,6,8,10。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。
下面示例对刻度和标签的使用方法做了说明。
from matplotlib import pyplot as plt
import numpy as np
import math
x=2015,2016,2017,2018,2019,2020,2021,2022
y=8.1,7.2,8.2,7.3,6.4,7.3,7.4,2.9
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
langs = 'C', 'C++', 'Java', 'Python', 'PHP'
students=23,34,28,40,17
import numpy as np
#准备数据
data =[30, 25, 50, 20,40, 23, 51, 17,35, 22, 45, 19]
#添加子图区域
#绘制柱状图
import numpy as np
countries = 'USA', 'India', 'China', 'Russia', 'Germany'
ind = x for x, _ in enumerate(countries)
#绘制堆叠图
#设置坐标轴
from matplotlib import pyplot as plt
import numpy
data=21,34,56,87,99,11,23,45,76,12,35,12,46,86,56,77,9,57,79
from matplotlib import pyplot as plt
import numpy as np
subject='c','c++','java','python','maltab'
students=12,16,23,25,14
from matplotlib import pyplot as plt
x = "Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"
y = 20, 40, 35, 55, 42, 80, 50
for x1, y1 in zip(x, y):
from matplotlib import pyplot as plt
x = 5, 8, 12, 14, 16, 18, 20
y1 = 18, 21, 29, 31, 26, 24, 20
y2 = 15, 18, 24, 30, 31, 25, 24
#* 表示绘制五角星;此处也可以不设置线条颜色,matplotlib会自动为线条添加不同的颜色
for a,b in zip(x,y1):
for a,b in zip(x,y2):
from matplotlib import pyplot as plt
girls_grades = 89, 90, 70, 89, 100, 80, 90, 100, 80, 34
boys_grades = 30, 29, 49, 48, 100, 48, 38, 45, 20, 30
grades_range = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
from matplotlib import pyplot as plt
import numpy as np
import numpy as np
from matplotlib import pyplot as plt
data=collectn_1,collectn_2,collectn_3,collectn_4
#导入三维工具包mplot3d
from mpl_toolkits import mplot3d
import numpy as np
#创建3d绘图区域
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d
import numpy as np
from matplotlib import pyplot as plt
import numpy as np
def f(x, y):
from matplotlib import pyplot as plt
import numpy as np
#将数据网格化处理
Z = f(X, Y)
def f(x, y):
from matplotlib import pyplot as plt