matplotlib
address:https://www.matplotlib.org.cn/tutorials/#%E5%BA%8F%E8%A8%80
基本绘图
提供一对相同长度的数组,然后使用plot()绘制曲线.
如果想绘制特别的曲线,有以下修饰
颜色 | 描述 | 标记 | 描述 | 线条 | 描述 |
---|---|---|---|---|---|
‘b’ | 蓝色 | ‘.’ | 点标记 | ‘-‘ | 实线 |
‘g’ | 绿色 | ‘o’ | 圆圈标记 | ‘–’ | 虚线 |
‘r’ | 红色 | ‘x’ | x标记 | ‘-.’ | 点划线 |
‘c’ | 青色 | ‘D’ | 钻石标记 | ‘:’ | 虚线 |
‘m’ | 品红色 | ‘H’ | 六角标记 | ||
‘y’ | 黄色 | ‘s’ | 正方形标记 | ||
‘k’ | 黑色 | ‘+’ | 加号标记 | ||
‘w’ | 白色 |
如果想在同一幅图里面绘制多条曲线,只需使用多条plot指令即可.如果您想清除图像,直接在程序末尾调用 clf() 方法即可。
figure对象
通过面向对象的思想,将图形封装为图形对象,就能更好的处理控制多个画布.Matplotlib 提供了matplotlib.figure
图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
dgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
创建画布的步骤如下;
from matplotlib import plot as plt
fig = plt.figure() ## 实例化figure对象
ax=fig.add_axes([0,0,1,1]) ## 添加axes域到画布,这样ax就是我们的画布了
add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
ax.set_title("sine wave") ##设置标题
ax.set_xlabel('angle') ##设置x轴标签
ax.set_ylabel('sine') ##设置y轴标签
axes类使用详解
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
也就是说一个figure里面能有多个axes对象,每个对象是一幅图,但是一个axes对象只能隶属一个figure画布.
通过调用 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])##表示从画布10%开始画,高与宽是画布的80%
legend()绘制图例
axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数
ax.legend(handles, labels, loc)
- handles:是一个序列,包含了所有线的实例
- labels:指定标签名称,也可以在plot的时候,直接命名label
- 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’ | 绿色 | ‘o’ | 圆圈标记 | ‘–’ | 虚线 |
‘r’ | 红色 | ‘x’ | x标记 | ‘-.’ | 点划线 |
‘c’ | 青色 | ‘D’ | 钻石标记 | ‘:’ | 虚线 |
‘m’ | 品红色 | ‘H’ | 六角标记 | ||
‘y’ | 黄色 | ‘s’ | 正方形标记 | ||
‘k’ | 黑色 | ‘+’ | 加号标记 | ||
‘w’ | 白色 |
axes.grid()设置网格格式
rid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。
grid(color, ls, lw)
轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。通过指定轴的颜色和宽度,从而对进行显示格式设置,比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#为左侧轴,底部轴添加颜色
ax.spines['bottom'].set_color('blue')
ax.spines['left'].set_color('red')
ax.spines['left'].set_linewidth(2)
#将侧轴、顶部轴设置为None
ax.spines['right'].set_color(None)
ax.spines['top'].set_color(None)
ax.plot([1,2,3,4,5])
plt.show()
设置坐标轴范围
Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。
示例如下:
import matplotlib.pyplot as plt
import numpy as npy
##生成画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,0.5,0.5])
##自变量生成
x = npy.linspace(0,2*npy.pi,100)
##绘图区域生成
ax1.plot(x,npy.cos(x),'r--',label='cos')
ax1.legend()
##设置y轴取值范围
ax1.set_ylim(-npy.pi,npy.pi)
plt.show()
设置刻度和刻度标签
如果需要将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,自带的刻度就需要自己重新设置。
xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如:
ax.set_xticks([2,4,6,8,10])
也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。
import matplotlib.pyplot as plt
import numpy as npy
##生成画布对象
fig = plt.figure()
#添加绘图区域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
y = npy.cos(x)
ax.plot(x, y)
#设置x轴标签
ax.set_xlabel(‘angle’)
ax.set_title('sin')
ax.set_xticks([0,2,4,6])
#设置x轴刻度标签
ax.set_xticklabels(['zero','two','four','six'])
#设置y轴刻度
ax.set_yticks([-1,0,1])
plt.show()
subplot()函数
matplotlib.pyplot模块提供了一个 subplot() 函数,它可以均等地划分画布,该函数的参数格式如下:
plt.subplot(nrows, ncols, index)
subplot如果出现了图像重叠,那么之前的那幅图就会被消除,但是,如果使用figure对象的add_subplot方法就不会被消除,而是两幅图重叠一起.
通过给figure画布创建多个axes对象也能做到subplot的效果.
subplots()函数
subplots() 函数和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。
格式如下
fig , ax = plt.subplots(nrows, ncols)
实例:
import matplotlib.pyplot as plt
fig,a = plt.subplots(2,2)
import numpy as np
x = np.arange(1,5)
#绘制平方函数
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
#绘制平方根图像
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('square root')
#绘制指数函数
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
#绘制对数函数
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()
subplot2grid()函数
subplot2grid()能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
plt.subplot2grid(shape, location, rowspan, colspan)
- shape:把该参数值规定的网格区域作为绘图区域;
- location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
- rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。
import matplotlib.pyplot as plt import numpy as np #使用 colspan指定列,使用rowspan指定行 a1 = plt.subplot2grid((3,3),(0,0),colspan = 2) a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3) a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2) x = np.arange(1,10) a2.plot(x, x*x) a2.set_title('square') a1.plot(x, np.exp(x)) a1.set_title('exp') a3.plot(x, np.log(x)) a3.set_title('log') plt.tight_layout() plt.show()
双轴图
在需要两个x轴或者两个y轴的情况下,可以使用Matplotlib提供的twinx()和twiny()函数,实现双轴功能.
绘制指数函数和对数函数的示例如下:
import matplotlib.pyplot as plt
import numpy as npy
## 布置画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,1,1])
## 准备自变量x
x = npy.linspace(-5,1,200)
## 绘制指数函数
ax1.plot(x,npy.exp(x),'r',label='exp')
ax1.set_ylabel('exp')
ax1.legend()
## 绘制对数函数
ax2 = ax1.twiny()
ax2.plot(x[x>0],npy.log(x[x>0]),'b--',label='log')
ax2.set_ylabel('log')
ax2.legend()
plt.show()
柱状图
Matplotlib 提供了bar()函数来绘制柱状图。当它与 axes 对象一起使用时,其语法格式如下:
ax.bar(x, height, width, bottom, align)
- x:标量,代表x坐标
- height:标量序列,表示柱状图高度
- width:可选参数,表示柱状图宽度
- bottom:表示柱状图开始堆叠的起始值
- align:有两个可选项 {“center”,”edge”},默认为 ‘center’,该参数决定 x 值位于柱状图的位置。
直方图
语法格式:
hist(x,bins,range,density,histtype)
- x:数组或者数组序列
- bins:可选参数,整数或者序列,表示每一个间隔的边缘(起点和终点)默认会生成10个间隔。
- range:指定全局间隔的下限与上限值 (min,max),元组类型,默认值为 None。
- density:如果为 True,返回概率密度直方图;默认为 False,返回相应区间元素的个数的直方图。
- histtype:要绘制的直方图类型,默认值为“bar”,可选值有 barstacked(堆叠条形图)、step(未填充的阶梯图)、stepfilled(已填充的阶梯图)。
饼状图
Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:
pie(x,labels,color,autopct)
- x:数组
- labels:字符串序列,给每一个扇形区域备注一个名字
- color:为每个扇形区域设置颜色,默认按照颜色周期填充
- autopct: 格式化字符串”fmt%pct”,使用百分比的格式设置每个扇形
区的标签,并将其放置在扇形区内。
折线图
matplotlib里面没有绘制折线图的函数,但是可以通过调用text()的方法在图像上绘制注释文本的方法,示例如下:
import matplotlib.pyplot as plt
#准备绘制数据
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x, y, "g", marker='D', markersize=5, label="周活")
#绘制坐标轴标签
plt.xlabel("登录时间")
plt.ylabel("用户活跃度")
plt.title("C语言中文网活跃度")
#显示图例
plt.legend(loc="lower right")
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1, y1 in zip(x, y):
plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
#保存图片
plt.savefig("1.jpg")
plt.show()
散点图
散点图的语法规范:
scatter(x, y, color)
- x:自变量
- y:因变量
- color:点的颜色
等高线图
如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。
numpy
里面有函数meshgrid
构建网格点矩阵.
在matplotlob API里面提供了绘制等高线(contour
)与填充等高线( contourf
)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。
示例:
import matplotlib.pyplot as plt
import numpy as npy
## 构建500*500的网格
x = npy.linspace(-10,10,500)
y = npy.linspace(-10,10,500)
X,Y = npy.meshgrid(x,y)
## 构建画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,1,1,])
## 构建函数
Z = npy.log(X**2+Y**2+100)
## 构建等高线
cp = ax1.contourf(X,Y,Z)
fig.colorbar(cp) ##添加颜色柱
ax1.set_title('Test')
ax1.set_ylabel('Y')
ax1.set_xlabel('X')
## 画等高线
plt.show()
3D绘图
通过调用matplotlib
的绘图工具包mpl_toolkits.mplot3d
的一些接口可以实现绘制3D图形.
基础绘图
首先需要创建一个3D
绘图区域,pyplot.axes()
这个axes
对象构造方法提供了一个参数projection
,将其参数值设置为3d
.
from mpl_toolkits import mplot3d as m3d
import matplotlib.pyplot as plt
import numpy as npy
ax1 = plt.axes(projection='3d')
然后构建3D
图像
#从x,y,z轴开始构建
x = npy.linspace(0,10,200)
y = npy.linspace(0,10,200)
z = npy.exp(x)+npy.hstack((npy.array([0]),npy.log(y[y>0])))
最后调用plot3D()
方法构建3d
图形
ax1.plot3D(x,y,z,'b')
ax1.set_title('The first 3D')
plt.show()
3D散点图
ax.scatter3D()
函数可以绘制 3D 散点图
3D等高线图
ax.contour3D()
可以用来创建三维等高线图
3D线框图
plot_wireframe()
能够绘制 3D 线框图。
3D曲线图
plot_surface()
函数可以绘制 3D 曲面图
Matplotlib绘制文本
Matplotlib
通过下列函数绘制出相应内容
函数 | 解释 |
---|---|
text | 在绘图区域的任意位置添加文本。 |
annotate | 在绘图区域的任意位置添加带有可选箭头的注释。 |
xlabel | 在绘图区域的 x 轴上添加标签。 |
ylabel | 在绘图区域的 y 轴上添加标签。 |
title | 为绘图区域添加标题。 |
figtext | 在画布的任意位置添加文本。 |
suptitle | 为画布中添加标题。 |
Matplotlib数学表达式
Matplotlib 中的文本字符串都可以使用 Text Markup(一种文本标记语言)显现出来,Text Markup类似Mathjax.