Python-Matplotlib绘图
Matplotlib 中的 pyplot 模块是一个类似命令风格的函数集合,这使得 Matplotlib 的工作模式和 MATLAB 相似。
pyplot 模块提供了可以用来绘图的各种函数,比如创建一个画布,在画布中创建一个绘图区域,或是在绘图区域添加一些线、标签等。以下表格对这些函数做了简单地介绍。
绘图类型
函数名称 | 描述 |
---|---|
Bar | 绘制条形图 |
Barh | 绘制水平条形图 |
Boxplot | 绘制箱型图 |
Hist | 绘制直方图 |
his2d | 绘制2D直方图 |
Pie | 绘制饼状图 |
Plot | 在坐标轴上画线或者标记 |
Polar | 绘制极坐标图 |
Scatter | 绘制x与y的散点图 |
Stackplot | 绘制堆叠图 |
Stem | 用来绘制二维离散数据绘制(又称为“火柴图”) |
Step | 绘制阶梯图 |
Quiver | 绘制一个二维按箭头 |
Image函数
函数名称 | 描述 |
---|---|
Imread | 从文件中读取图像的数据并形成数组。 |
Imsave | 将数组另存为图像文件。 |
Imshow | 在数轴区域内显示图像。 |
Axis函数
函数名称 | 描述 |
---|---|
Axes | 在画布(Figure)中添加轴 |
Text | 向轴添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置x轴标签 |
Xlim | 获取或者设置x轴区间大小 |
Xscale | 设置x轴缩放比例 |
Xticks | 获取或设置x轴刻标和相应标签 |
Ylabel | 设置y轴的标签 |
Ylim | 获取或设置y轴的区间大小 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置y轴的刻标和相应标签 |
Figure函数
函数名称 | 描述 |
---|---|
Figtext | 在画布上添加文本 |
Figure | 创建一个新画布 |
Show | 显示数字 |
Savefig | 保存当前画布 |
Close | 关闭画布窗口 |
第一个绘图程序
首先导入 Matplotlib 包中的 Pyplot 模块,并以 as 别名的形式简化引入包的名称。
import matplotlib.pyplot as plt
接下来,使用 NumPy 提供的函数 arange() 创建一组数据来绘制图像。
#引入numpy包 import numpy as np #获得0到2π之间的ndarray对象 x = np.arange(0, math.pi*2, 0.05)
上述所得 x 的值作用到 x 轴上,而该值对应的正弦值,也就是 y 值,使用以下方法获取:
y = np.sin(x)
使用 plot() 函数对 x、y 进行绘制。
plt.plot(x,y)
主要的绘图工作已经完成,不过还需要绘制一些细节,需要我们补充一下,比如图像的标题(title)、x 轴与 y 轴的标签(label)等。
plt.xlabel("angle") plt.ylabel("sine") plt.title('sine wave')
完整的程序代码如下:
from matplotlib import pyplot as plt import numpy as np import math #调用math.pi方法弧度转为角度 x = np.arange(0, math.pi*2, 0.05) y = np.sin(x) plt.plot(x,y) plt.xlabel("angle") plt.ylabel("sine") plt.title('sine wave') #使用show展示图像 plt.show()
代码执行后,显示结果如下:
#Pyplot导包方式 from matplotlib import pyplot as plt #PyLab导包有两种方式 import pylab from pylab import *
基本绘图
提供一对相同长度的数组(或序列),然后使用plot()
绘制曲线,示例如下:
from numpy import * from pylab import * x = linspace(-3, 3, 30) y = x**2 plot(x, y) show()
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129163232674-710829902.png)
图1:绘制曲线图
如果您要绘制特殊类型的线条,并想添加一些颜色,PyLab 提供了如下方法:
符号 | '-','--','-.',':','.',',',,o,^,v,<,>,s,+,x,D,d,1,2,3,4,h,H,p,| ,_ |
颜色 | b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色) |
使用示例如下:
from pylab import * x = linspace(-3, 3, 30) y = x**2 plot(x, y, 'r.') show()
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129163309578-2087449558.png)
如果您想在同一绘图区域内绘制多个图形,只需要使用多个绘图命令。示例如下:
from pylab import * plot(x, sin(x)) plot(x, cos(x), 'r-') plot(x, -sin(x), 'g--') show()
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129163341346-1702030391.png)
matplotlib.pyplot
模块能够快速地生成图像,但如果使用面向对象的编程思想,我们就可以更好地控制和自定义图像。
在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个 axes 对象(即绘图区域)。
Matplotlib 提供了matplotlib.figure
图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。如下所示:
from matplotlib import pyplot as plt #创建图形对象 fig = plt.figure()
该函数的参数值,如下所示:
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
dgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
下面使用 figure() 创建一个空白画布:
fig = plt.figure()
我们使用 add_axes() 将 axes 轴域添加到画布中。如下所示:
ax=fig.add_axes([0,0,1,1])
add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
设置 x 和 y 轴的标签以及标题,如下所示:
ax.set_title("sine wave") ax.set_xlabel('angle') ax.set_ylabel('sine')
调用 axes 对象的 plot() 方法,对 x 、 y 数组进行绘图操作:
ax.plot(x,y)
完整的代码如下所示:
from matplotlib import pyplot as plt import numpy as np import math x = np.arange(0, math.pi*2, 0.05) y = np.sin(x) fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.plot(x,y) ax.set_title("sine wave") ax.set_xlabel('angle') ax.set_ylabel('sine') plt.show()
输出结果如下:
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129163621069-1973520672.png)
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
2D 绘图区域(axes)包含两个轴(axis)对象;如果是 3D 绘图区域,则包含三个。
通过调用 add_axes() 方法能够将 axes 对象添加到画布中,该方法用来生成一个 axes 轴域对象,对象的位置由参数rect
决定。
rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。如下所示:
ax=fig.add_axes([0.1,0.1,0.8,0.8])
注意:每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。
下面介绍 axes 类的其他成员函数,这些函数在绘图过程中都承担着不同的作用。
legend()绘制图例
axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数,如下所示:
ax.legend(handles, labels, loc)
- labels 是一个字符串序列,用来指定标签的名称;
- loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示;
- handles 参数,它也是一个序列,它包含了所有线型的实例;
下面是 loc 参数的表示方法,分为字符串和整数两种,如下所示:
位置 | 字符串表示 | 整数数字表示 |
---|---|---|
自适应 | Best | 0 |
右上方 | upper right | 1 |
左上方 | upper left | 2 |
左下 | lower left | 3 |
右下 | lower right | 4 |
右侧 | right | 5 |
居中靠左 | center left | 6 |
居中靠右 | center right | 7 |
底部居中 | lower center | 8 |
上部居中 | upper center | 9 |
中部 | center | 10 |
axes.plot()
这是 axes 类的基本方法,它将一个数组的值与另一个数组的值绘制成线或标记,plot() 方法具有可选格式的字符串参数,用来指定线型、标记颜色、样式以及大小。
颜色代码如下表:
'b' | 蓝色 |
'g' | 绿色 |
'r' | 红色 |
'c' | 青色 |
'm' | 品红色 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
标记符号如下表:
标记符号 | 描述 |
'.' | 点标记 |
'o' | 圆圈标记 |
'x' | 'X'标记 |
'D' | 钻石标记 |
'H' | 六角标记 |
's' | 正方形标记 |
'+' | 加号标记 |
线型表示字符,如下表:
字符 | 描述 |
'-' | 实线 |
'--' | 虚线 |
'-.' | 点划线 |
':' | 虚线 |
'H' | 六角标记 |
下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。
import matplotlib.pyplot as plt
y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#使用简写的形式color/标记符/线型
l1 = ax.plot(x1,y,'ys-')
l2 = ax.plot(x2,y,'go--')
ax.legend(labels = ('tv', 'Smartphone'), loc = 'lower right') # legend placed at lower right
ax.set_title("Advertisement effect on sales")
ax.set_xlabel('medium')
ax.set_ylabel('sales')
plt.show()
在使用 Matplotlib 绘图时,我们大多数情况下,需要将一张画布划分为若干个子区域,之后,我们就可以在这些区域上绘制不用的图形。在本节,我们将学习如何在同一画布上绘制多个子图。matplotlib.pyplot
模块提供了一个 subplot() 函数,它可以均等地划分画布,该函数的参数格式如下:
plt.subplot(nrows, ncols, index)
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。
例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129164928122-1643253317.png)
如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。
import matplotlib.pyplot as plt plt.plot([1,2,3]) #现在创建一个子图,它表示一个有2行1列的网格的顶部图。 #因为这个子图将与第一个重叠,所以之前创建的图将被删除 plt.subplot(211) plt.plot(range(12)) #创建带有黄色背景的第二个子图 plt.subplot(212, facecolor='y') plt.plot(range(12))
上述代码运行结果,如下图所示:
如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:
import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot([1,2,3]) ax2 = fig.add_subplot(221, facecolor='y') ax2.plot([1,2,3])
执行上述代码,输出结果如下:
通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。
import matplotlib.pyplot as plt import numpy as np import math x = np.arange(0, math.pi*2, 0.05) fig=plt.figure() axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes axes2 = fig.add_axes([0.55, 0.55, 0.3, 0.3]) # inset axes y = np.sin(x) axes1.plot(x, y, 'b') axes2.plot(x,np.cos(x),'r') axes1.set_title('sine') axes2.set_title("cosine") plt.show()
输出结果如下:
![](https://img2022.cnblogs.com/blog/2738914/202201/2738914-20220129165713390-510276051.png)