文章目录
- 一.简介
- 二.Mapltlib的简单使用
- 2.1 Pylot的API
- 2.2 Pylab模块
- 2.3 matplotlib简单绘图
- 三.Mapltlib进阶使用
- 3.1 面向对象思想画图
- 3.2 Figure类
- 3.3 Axes类
- 3.4 画布上创建多个子图
- 3.5 图中添加网格
- 3.6 设置图片轴线
- 3.7 保存图片
一.简介
matplotlib是最初由John D.Hunter于2003年编写,是用于数据可视化的最流行的Python包之一,它是一个跨平台,用于根据数组中的数据制作2D图。Matplotlib是用Python编写的,并使用了Python的数值数学扩展Numpy,它提供了一个面向对象的API,有助于使用Python GUI工具包(如PyQt,WxPythonTkinter)在应用程序中嵌入绘图。它也可以使用Python和IPython Shell,jupyter笔记本和Web应用程序服务器。Matplotlib和Numpy可以被认为是Matlab的开源等价物。
二.Mapltlib的简单使用
2.1 Pylot的API
Matplotlib.pylot是命令样式函数的集合,使Matplotlib像MatLab一样工作,每个Pylot功能都会对图像进行一些更改。例如,函数创建一个图形,一个图形中的绘画区域,绘制绘图区域中的一些线条,用标签装饰图形等。
函数 | 描述 |
---|---|
Bar | 绘制柱状图 |
Barh | 绘制水平柱状图 |
Boxplot | 绘制一个箱形图 |
Hist | 绘制直方图 |
hist2d | 绘制2D直方图 |
Pie | 绘制饼图 |
Plot | 绘制轴线或标记 |
Polar | 绘制一个极坐标图 |
Scatter | 绘制x和y的散点图 |
Stackplot | 绘制堆积区域图 |
Stem | 绘制杆图 |
Step | 绘制步骤图 |
Quiver | 绘制二维箭头字段 |
图形函数
函数 | 描述 |
---|---|
Imread | 在文件中的图像读入数组 |
Imsave | 像在图形文件中一样保存数组 |
Imshow | 在轴上显示图像 |
轴函数
函数 | 描述 |
---|---|
Axes | 添加轴到图形 |
Text | 向轴中添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置当前轴的X轴标签 |
Xlim | 获取或设置当前轴的x的限制 |
Xscale | 设置x轴的缩放比例 |
Xticks | 获取或设置当前刻度位置和标签的X限制 |
Ylabel | 设置当前轴的y轴标签 |
Ylim | 获取或设置当前轴的y的限制 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置当前刻度位置和标签的y限制 |
图形操作函数
函数 | 描述 |
---|---|
Figtext | 将文字添加到图形 |
Figure | 创建一个新的图形 |
Show | 显示一个图形 |
Savefig | 保存当前图形 |
Close | 关闭一个图窗口 |
2.2 Pylab模块
matplotlib是整个包,Matplotlib.pylot是Matplotlib中的一个模块,它和PyLab是一个与Matplotlib一起安装的模型。PyLab是Matplotlib面向对象绘图库的过程接口,是一个非常方便的模块,可以单个名称空间中批量导入matplotlib.pyplot和Numpy。(不推荐使用)
- 基本绘图
import numpy as np
import pylab as plb
x=np.linspace(-3,3,30)
y=x**2
plb.plot(x,y,'r1')#r1是线的颜色和样式
plb.show()
线的颜色和样式
颜色:b,g,r,c,m,y,k,w
符号:^,v,<,>,s,+,x,D,d,1,2,3,4,h,H,p,|,_,-,--,-.,.,,,。
- 使用多个绘图命令实现覆盖图
import numpy as np
import pylab as plb
x=np.linspace(-3,3,30)
plb.plot(x,np.sin(x))
plb.plot(x,np.cos(x),'r--')
plb.plot(x,-np.sin(x),'g-')
#plb.clf()可以清除图片
plb.show()
2.3 matplotlib简单绘图
显示一个简单的角度线图,以弧度为单位,与正弦值相对应
import numpy as np
import math
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(0,math.pi*2,0.05)
y=np.sin(x)
plt.rcParams["font.size"]=15 #设置图整体字体大小(包括轴数字等)
plt.title("sine wave")
plt.xlabel("angle",color='r',fontsize=20)#fontsize设置字大小
plt.ylabel("值",color='b',fontsize=20,rotation=0) #可以让文本旋转0度(保存水平)
plt.plot(x,y)
三.Mapltlib进阶使用
3.1 面向对象思想画图
虽然使用Matplotlib.pylot模块很容易生成绘图,但建议使用面向对象的方法,因为它可以更好地控制和自定义绘图,并且matplotlib.axes.Axes类中也提供了大多数函数。使用更正式的面向对象方法背后的主要思想是创建图形对象,然后只调用该对象的方法或属性,这种方法有助于更好地处理其上有多个绘图的画布。在面向对象中pylot仅用于一些功能,如图形创建,用户显式创建和跟踪图形或轴对象。在此级别,用户使用pylot创建图形,通过这些图形,可以创建一个或多个轴对象。然后,这些轴对象用于大多数绘图操作。
3.2 Figure类
它是定义在Matplotlib.figure下,模块保护Figure类,它是所有plot元素的顶级容器,通过pylot模块调用figure()函数来实例话Figure对象
figure()函数参数 | 描述 |
---|---|
Figsize | (width,height) 以英寸为单元的元组,表示画布的尺寸 |
Dpi | 每英寸点数 |
Facecolor | 图的贴面颜色 |
Edegecolor | 图的边缘颜色 |
Linewidth | 边线宽度 |
3.3 Axes类
Figure对象我们可以理解为画纸,Axes对象具有数据空间的图像区域(相当于纸上画的一张图,一个画布可以有多张图)。给定的图形可以包含很多轴,但给定的Axes对象只能在一个图中。轴包含两个(或在3D情况下为3个)Axes对象。Axes类及其成员函数是使用面向对象接口的主要入口点。figure对象通过调用add_axes()方法将Axes对象添加到图中,它返回轴对象并在位置rect[left,bottom,width,height]
地点添加一个轴,其中所有数量都是图形宽度和高度的分数,add_axes()的参数是4个长度序列的[左,底,宽,高]数量。轴类的以下成员函数为图添加了不同的元素。
fig=plt.figure() #可以理解为画纸
x=np.arange(0,math.pi*2,0.05)
y=np.sin(x)
z=np.cos(x)
ax=fig.add_axes([0,0,1,1])
ax1=fig.add_axes([1.3,0,1,1])
ax.plot(x,y)
ax.set_title("正弦函数")
ax.set_xlabel("sine wave")
ax.set_ylabel("sine")
ax1.plot(x,z)
ax1.set_title("余弦函数")
ax1.set_xlabel("cose wave")
ax1.set_ylabel("cose")
plt.show()
axes.legend()
为绘图图形添加一个图例(对图像曲线的一个说明)
参数 | 说明 |
---|---|
lables | 描述 |
loc | 图例位置 |
loc位置简介 | 位置代码 |
---|---|
best | 0 |
upper right | 1 |
upper light | 2 |
lower left | 3 |
lower right | 4 |
right | 5 |
center left | 6 |
center right | 7 |
lower center | 8 |
upper center | 9 |
center | 10 |
ax.plot()
这是轴类的基本方法,他将一个数组的值与另一个数组的值绘制为线或标记
axes.plot(*args,scalex=True,scaley=True,data=None,**kwargs)
axes.plot([x],y,[fmt],*,data=None,**kwargs)
axes.plot([x],y,[fmt],[x2],y2,[fmt2],...,**kwargs)
属性 | 说明 |
---|---|
color | 颜色 |
alpha | 透明度 |
linestyle/ls | 线型 |
linewidth/ls | 线宽 |
marker | 点类型 |
markersize | 点大小 |
markeredgewidth | 点边缘宽度 |
markeredgecolor | 点边缘颜色 |
markerfacecolor | 点内部颜色 |
fmt颜色代码字符标记 | 颜色 |
---|---|
b | blue |
g | green |
r | red |
c | cyan |
m | magenta |
y | yellow |
k | black |
w | white |
fmt标记代码字符颜色 | 描述 |
---|---|
. | 点标记 |
, | 像素标记 |
o | 圆形标记 |
v | 朝下的三角形 |
^ | 朝上的三角形 |
< | 朝左的三角形 |
> | 朝右的三角形 |
s | 正方形 |
p | 五角星 |
* | 星形 |
h | 1号六角形 |
H | 2号六角形 |
+ | +号标记 |
D | 砖石形 |
d | 小砖石形 |
| | 垂直线形 |
- | 水平线形 |
fmt线条样式字符 | 描述 |
---|---|
- | 实线 |
– | 虚线 |
-. | 单点划线 |
: | 点虚线 |
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(figsize=(10,5))
ax=fig.add_axes([0,0,1,1])
ax.plot(x1,y,alpha=0.2,linestyle="-.",lw=3,color='g',marker='s',markersize=10,markeredgewidth=5,markeredgecolor='r')
ax.plot(x2,y,'rs--')#''中间就是fmt参数
ax.legend(labels=("television,'phone'"),loc=2)
3.4 画布上创建多个子图
3.3给出了画两张图的方法,通过设立每个axes对象与画布边缘的距离,以及axes对象的宽度和高度来生成多张图,显然这个很麻烦的,因为需要自己去规划画布的每一块位置(这个方法叫做添加轴对象方法)
plt.subplot(nrows,ncols,index)
返回给定网格位置的axes对象
这个函数将画布分割成几个位置,nrows行,ncols列就表示在画布上沿行切(nrows-1)刀,再沿着列切(ncols-1)刀,这样就可以将画布分割成多个子区域,再使用index来选择子画布区域位置
fig=plt.figure(figsize=(12,6))#创建画布
ax1=plt.subplot(2,2,1)
ax1.plot(range(12))
ax1=plt.subplot(222,facecolor='y')
ax1.plot(range(12))
ax1=plt.subplot(223,facecolor='r')
ax1.plot(range(12))
ax1=plt.subplot(224,facecolor='b')
ax1.plot(range(12))
plt.show()
plt.subplots(nrows,ncols)
它充当使用程序包装器,并在单个调用中帮助创建子图的公共布局,包括封闭的图形对象。该函数返回一个图形对象和一个包含nrows*ncols的轴对象的元组,每个轴都可以通过索引来访问(这个函数和前面subplot区别就是不是通过index来确定子画图区域的位置,而是在创建子画布时就已经给每个子区域创建好了axes对象,返回的就是axes对象,若我们要使用子画布,只需要调用相应位置的axes对象即可直接画图)
fig,axList=plt.subplots(2,2)
axList[0][0].plot(range(12),color='r')
axList[0][1].plot(range(12),color='b')
axList[1][0].plot(range(12),color='y')
axList[1][1].plot(range(12))
plt.show()
subplot2grid()
该方法在网格的特定的位置创建轴对象提供了更大的灵活,甚至还允许多个轴对象占多个行或列(即允许一个图占画布的多个子区域,前面的两个方法一个图只能占一个区域,这个方法让画布上图的分布更加的随意)
fig=plt.figure(figsize=(12,6))#创建画布
ax1=plt.subplot2grid((3,3),(0,0),colspan=2,rowspan=1)#(3,3)表示三行三列,(0,0)指的是0行0列,colspan表示该图占两列,rowspan表示占1行
ax2=plt.subplot2grid((3,3),(0,2),colspan=1,rowspan=3)
ax3=plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=2)
x=np.arange(1,10)
ax1.plot(x,np.exp(x))
ax1.set_title("square root")
ax3.plot(x,np.log(x))
ax3.set_title("log")
ax2.plot(x,x*x)
ax2.set_title("quare")
figure.add_subplot()
实现添加子图
fig=plt.figure()
x=np.arange(1,math.pi*2,0.05)
ax1=fig.add_subplot(111) #1行1列下标为1
ax1.plot(x,np.sin(x))
ax2=fig.add_subplot(222,facecolor='r')
ax2.plot(x,np.cos(x),'b')
3.5 图中添加网格
axes对象的grid函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要刻度,还可以在grid()里面设置color,linestyle和linewidth属性
fig=plt.figure()
ax1=fig.add_axes([0,0,1,1])
x=np.arange(1,math.pi*2,0.05)
ax1.grid(color='r',ls='-',lw=0.3)
ax1.plot(x,np.cos(x))
3.6 设置图片轴线
轴线就是一张图的四个边,每个轴线可以指定颜色和宽度,设置颜色为无可以忽略轴线
fig=plt.figure()
ax1=fig.add_axes([0,0,1,1])
x=np.arange(1,math.pi*2,0.05)
ax1.grid(color='r',ls='-',lw=0.3)
ax1.plot(x,np.cos(x))
ax1.spines['bottom'].set_color("k") #拿到下轴线
ax1.spines['left'].set_color("blue")
ax1.spines['left'].set_linewidth(4)
ax1.spines['right'].set_color(None)
ax1.spines['top'].set_color(None)
- 格式化轴
有时候一个或几个点比大量数据大得多,在这种情况下,轴的比例需要设置为对数而不是正常比例。这种对数标度在Matplotlib中可以通过axes对象的xscale或vscale属性设置为log,有时还需要在轴编号和轴标签之间显示一些额外的距离,任一轴(x或y或两者)的labelpad属性都可以设置为所需的值。
fig,axes=plt.subplots(1,2,figsize=(10,4))
x=np.arange(1,6)
axes[0].plot(x,np.exp(x))
axes[0].plot(x,x*x)
axes[0].set_xlabel("x axis")
axes[1].plot(x,np.exp(x))
axes[1].plot(x,x*x)
axes[1].set_xlabel("x axis")
axes[1].set_yscale("log")
axes[1].xaxis.labelpad=30 #x_label与坐标轴之间的距离
plt.show()
2. 设置限制
将x轴上的大小格式为(0到10)和y轴(0到10000)
fig,axes=plt.subplots(1,2,figsize=(10,4))
x=np.arange(1,11)
y=np.exp(x)
axes[0].plot(x,y)
axes[1].plot(x,y)
axes[1].set_xlim(0,8) #设置x的刻度范围为0-8
axes[1].set_ylim(0,10000)#设置y的刻度范围为0-10000
3. 设置刻度和刻度标签
刻度是表示轴上的数据点的标记,到目前为止matplotlib在我们之前的所有例子都自动接管了轴上间隔点的任务。matplotlib的默认刻度定位器和格式化器 在很多常见的情况下通常都够用了。也可以明确提及刻度线的位置和标签以满足特定的要求
xticks()
和yticks()
作用:将列表对象作为参数,列表中的元素表示将显示刻度的相应操作的位置
set_xlabels()
和set_ylabels()
设置刻度线的标签
fig,axes=plt.subplots(1,2,figsize=(14,4))
x=np.arange(1,math.pi*2,0.05)
y=np.sin(x)
axes[0].plot(x,y)
axes[1].plot(x,y)
axes[1].set_xticks([0,2,4,6])
axes[1].set_xticklabels(["zero","tow","four","six"]) #给x轴刻度起别名,数量要和x刻度的数量对应
plt.show()
4. 设置轴线类型
常用类型:tight
off
equal
fig,axes=plt.subplots(1,2,figsize=(14,4))
x=np.linspace(-1,1,100)
y=lambda x:(1-x**2)**0.5 #lambda函数
axes[0].plot(x,y(x))
axes[0].plot(x,-y(x)) #由于x轴和y轴长度不等值,所以画出来的圆不圆
axes[1].plot(x,y(x))
axes[1].plot(x,-y(x))
axes[1].axis("equal")
axes[1].axis("off") #关闭轴线
3.7 保存图片
savefig(fname,dipi=None,facecolor='w',edgecolor='w',orientation='portrait',papertype=None,format=None,transparent=False,bbox_inches=None,pad_inches=0.1,frameon=None,metadata=None)
常用参数 | 说明 |
---|---|
fname | 含有文件路径的字符串或python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出pdf,.png推断出PNG |
dpi | 图像分辨率 |
facecolor | 图像的背景色,默认为w白色 |
fig,axes=plt.subplots(1,2,figsize=(14,4))
x=np.linspace(-1,1,100)
y=lambda x:(1-x**2)**0.5 #lambda函数
axes[0].plot(x,y(x))
axes[0].plot(x,-y(x)) #由于x轴和y轴长度不等值,所以画出来的圆不圆
axes[1].plot(x,y(x))
axes[1].plot(x,-y(x))
axes[1].axis("equal")
axes[1].axis("off") #关闭轴线
fig.savefig("circle.jpg",dpi=200,facecolor='b')