函数名称 | 描述 |
---|---|
Bar | 绘制条形图 |
Barh | 绘制水平条形图 |
Boxplot | 绘制箱型图 |
Hist | 绘制直方图 |
his2d | 绘制2D直方图 |
Pie | 绘制饼状图 |
Plot | 在坐标轴上画线或者标记 |
Polar | 绘制极坐标图 |
Scatter | 绘制x与y的散点图 |
Stackplot | 绘制堆叠图 |
Stem | 用来绘制二维离散数据绘制(又称为“火柴图”) |
Step | 绘制阶梯图 |
Quiver | 绘制一个二维按箭头 |
函数名称 | 描述 |
---|---|
Imread | 从文件中读取图像的数据并形成数组 |
Imsave | 将数组另存为图像文件 |
Imshow | 在数轴区域内显示图像 |
函数名称 | 描述 |
---|---|
Axes | 在画布(Figure)中添加轴 |
Text | 向轴添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置x轴标签 |
Xlim | 获取或者设置x轴区间大小 |
Xscale | 设置x轴缩放比例 |
Xticks | 获取或设置x轴刻标和相应标签 |
Ylabel | 设置y轴的标签 |
Ylim | 获取或设置y轴的区间大小 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置y轴的刻标和相应标签 |
函数名称 | 描述 |
---|---|
Figtext | 在画布上添加文本 |
Figure | 创建一个新画布 |
Show | 显示数字 |
Savefig | 保存当前画布 |
Close | 关闭画布窗口 |
plt.figure()函数
该函数的参数值,如下所示:
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
dgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
from matplotlib import pyplot as plt
#创建一个图形对象
fig=plt.figure()
我们用add_axes()函数方法将轴域 添加到画布fig中
ax=fig.add_axes([0,0,1,1]) #实例化轴对象
x=linspace(30,0.1)
y=x**2
add_axes()参数值必须为list,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)
通过add_axes()方法可以将axes对象添加到 figure画布中,对象位置由参数rect决定
rect:4元素float_list,格式为[left,bottom,width,height] 元素∈[0,1],即将figure画布的宽、高作为1个单位
下面介绍axes类其他成员函数,他们在绘图中承担不同的作用
ax.legend(handle,labels,loc)#legend为axes的方法
labels为字符串list,可以指定label_name
loc为图例位置参数,参数值可以用字符串或整数表示
handles参数为list,包含所有线型的实例
下图为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的基本方法,将一个数组的值(x)与另一个数组的值(y)绘制成线或标记,同时具有可选的字符串参数用来指定 线型,标记颜色、样式、大小
颜色代码如下表:
‘b’ | 蓝色 |
---|---|
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青色 |
‘m’ | 品红色 |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
标记符号如下表:
字符 | 描述 |
---|---|
‘-’ | 实线 |
‘–’ | 虚线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
‘H’ | 六角标记 |
线型表示字符,如下表:
字符 | 描述 |
---|---|
‘-’ | 实线 |
‘–’ | 虚线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
‘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.2,0.2,0.5,0.5])#实例化一个轴域
#使用简写的形式color/标记符/线型
l1=ax.plot(x1,y,'ys-')
l2=ax.plot(x2,y,'go--')
ax.legend(labels=('tv','Smartphone'),loc='lower right')#legend将出现在右下角
ax.set_title("ad_effect on products")
ax.set_xlabel("media")
ax.set_ylabel("sales")
plt.show()
由上例可以看出,axes轴域基于figure画布对象,而具体画图基于axes对象
plt.subplot(nrows,ncols,index)
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。
如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。
import matplotlib.pyplot as plt
plt.plot([1,2,3])#创建了一个plot折线图
#现在创建一个子图,他表示一个有2行1列的网格的顶部图
#因为这个子图与开始的plot图重叠,所以删除之前的plot图
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(212,facecolor='y')
plt.plot(range(12))
上述表明,若subplot()中的第一个参数行列相同,则在该子图划分区域基础上进行画图,若不同,则如所示
import matplotlib.pyplot as plt
plt.plot([1,2,3])#创建了一个plot折线图
#现在创建一个子图,他表示一个有2行1列的网格的顶部图
#因为这个子图与开始的plot图重叠,所以删除之前的plot图
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(222,facecolor='y')
plt.plot(range(12))
之前创建的子图格式(2行1列)被删除,变成了如上图所示的2行2列
如果不想覆盖之前的图,可以如下措施
import matplotlib.pyplot as plt
fig=plt.figure()#创建画布
ax1=fig.add_subplot(111)
ax1.plot([1,2,3])
ax2=fig.add_subplot(221,face_color='y')
ax2.plot([1,2,3])
#上述画布同时存在了两种不同的子图格式
结果表明,通过add_subplot()方法,可以在同一画布同时存在多种不同的子图格式
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()
操作区别:
区别:subplots函数既创建了一个包含子图区域的画布,又创建了一个figure图形对象,而subplot()只创建一个包含子图区域的画布
subplots函数格式:
fig,ax=plt.subplots(nrow,ncols)
返回值是tuple,包含一个图形对象和所有的axes对象。axes数量=nrows*ncols,且每个axes对象均可以通过索引值访问(从1开始)
import matplotlib.pyplot as plt
fig,a = plt.subplots(2,2) #a相当于轴区域数组 fig为figure画布
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()与subplots()和subplot()函数不同,该函数可以非等分切分画布
语法:
plt.subplot2grid(shape,location,rowspan,colspan)
参数含义如下:
下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:
import matplotlib.pyplot as plt
#使用 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)
import numpy as np
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()
grid()函数可以 1.开启/关闭画布网格 2.设置网格颜色、线型、线宽等属性
使用格式:
grid(color='b',Is='-',lw=0.25)
参数含义如下:
网格默认关闭,若调用上述函数,网格会自动打开,如果只想开启网格不需要格式调整,使用grid(True)
import matplotlib.pyplot as plt
import numpy as np
#fig画布,axes子图区域
fig,axes=plt.subplots(1,3,figsize=(12,4))
x=np.arange(1,11)
#开启axes[0]的轴域网格
axes[0].grid(True)
axes[0].set_title('default grid')
axes[0].plot(x,x**3,'g',lw=2)
axes[1].plot(x,np.exp(x),'r')
#设置axes[1]轴域的网格颜色、线型、线宽
axes[1].grid(color='b',ls='-',lw=0.25)
axes[1].set_title('custom grid')
axes[2].plot(x,x)
axes[2].set_title('no grid')
fig.tight_layout()#自动调整子图大小,使之充满整个图像区域,部分情况下不工作
plt.show()
1.axes.set_xscale() or axes.set_yscale()
有时x与y是指数对应关系,这时候需要将坐标轴刻度设置为对数刻度
上述通过axes对象中的 xscale或 yscale属性实现对坐标轴的格式设置
示例:下面左侧子图显示标量刻度,右侧子图显示对数刻度
import matplotlib.pyplot as plt
import numpy as np
frg,axes=plt.subplots(1,2,figsize=(10,4))
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title("Normal scale")
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
#设置y轴
axes[1].set_yscale('log')#将y的刻度设为log型
axes[1].set_title('Logarithmic scale(y)')
#设置label
axes[0].set_xlabel('x axis',labelpad=10)#labelpad用于设置label显示位置
axes[0].set_ylabel('y axis')
axes[1].set_xlabel('x axis')
axes[1].set_ylabel('y axis')
plt.tight_layout()
plt.show()
2.axes.spines[‘’].set_color() or axes.spines[‘’].set_linewidth()
在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。可以指定轴的宽度和颜色(None为无色,即不显示轴)
以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
#为 左侧、底部轴添加颜色
ax.spines['buttom'].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()对进行轴的范围自定义设置
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
a1=fig.add_axes([0.1,0.1,0.7,0.7])
x=np.arange(1,10)
a1.plot(x,np.exp(x))
a1.set_title('exp')
plt.show()
2.自定义设置 set_xlim()将范围设到(0,10)、set_ylim()将范围设到(0,10000)
import matplotlib.pyplot as plt
fig=plt.figure()
a1=fig.add_axes([0,0,1,1])
import numpy as np
x=np.arange(1,10)
a1.plot(x,np.exp(x),'r')
a1.set_title('exp')
#设置x,y轴
a1.set_xlim(1,10)
a1.set_ylim(0,10000)
plt.show()
刻度指 轴上数据点的标记,Matplotlib可以自动在x、y轴上绘制出刻度(得益于内置的刻度定位器和格式化器)
xticks()和yticks()函数参数:list,list中的元素表示对应数轴上要显示的刻度
ax.set_xticks[(2,4,6,8,10)]
此时x轴的刻度标签分别为(2,4,6,8,10),我们也可以采取set_xticklabels()和set_yticklabels()函数重新需设置刻度标签,但刻度不会改变
下面的示例对刻度和刻度标签的使用方法进行说明
import matplotlib.pyplot as plt
import numpy as np
import math
x=np.arange(0,math.pi*2,0.05)
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.7,0.7])
y=np.sin(x)
ax.plot(x,y)
#设置x轴标签
ax.set_xlabel('angle')
ax.set_title('sine')
ax.set_xticks([0,2,4,6])#x刻度为[0,2,4,6]
ax.set_xticklabels(['zero','two','four','six'])#只修改刻度相应的label
#设置y轴标签
ax.set_yticks([-1,0,1])
plt.show()
有时候需要两个x轴或两个y轴表述数据关系,采用twinx()和twiny()函数实现
twinx()和twiny()函数除了绘制双轴,还可以用不同的单位来绘制曲线,比如一个y轴为对函数,一个y轴为指数函数
下面示例具有两个y轴的图像,左侧为exp(x),右侧为log(x)
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
a1=fig.add_axes([0.1,0.1,0.7,0.7])
x=np.arange(1,11)
a1.plot(x.np.exp(x))
a1.set_ylabel('exp')
#添加双轴
a2=a1.twinx()#在a1的轴域内进行轴的添加
#'ro'代表红色圆点
#绘制对数函数
a2.plot(x,np.log(x),'ro-')
#设置y2的label
a2.set_ylabel('log')
#绘制legend图例
fig.legend(labels=('exp','log'),loc=0)
plt.show()
#此处只有fig.legend才能两个都显示在图例中
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('loaded_time')
plt.ylabel('user_activity')
plt.title('the website activity')
plt.legend('loc=lower right')
#下面,我们可以调用 plt.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.show()
上面例子的legend 通过plt.plot(label)直接实现
2.绘制多条折线图
下面给出两天同一时刻,天气T随time变化的折线图:
import matplotlib.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会自动为线条添加不同的颜色
plt.plot(x,y1,'r',marker='*',markersize=10,label='frist day')
plt.plot(x,y2,'b',marker='*',markersize=10,label='next day')
plt.title('Tem_difference')
plt.xlabel('time(h)')
plt.ylabel('T(℃)')
#绘制注释
for x,y in zip(x,y1):
plt.text(x,y,y,ha='center',va='bottom',fontsize=10)
for x,y in zip(x,y2):
plt.text(x,y,y,ha='center',va='bottom',fontsize=10)
plt.show()
此处结果图借用 Matplotlib折线图(绘图实例+代码详解) (biancheng.net) ,自行实现时,zip()出错,原因暂时不明
等高线图(水平图) 是一种 在2D上显示3D图像的方法
等高线有时也成为 “Z切片”
通过numpy.meshgrid()函数将x、y数组构造成一个网格点矩阵
matplotlib API 提供了绘制等高线(contour) 与 **填充等高线 (contourf)**的函数。这两个函数都需要三个参数,分别是(X,Y,Z),表示x范围的颜色柱 基于contour定义的对象实现
import numpy as np
import matplotlib.pyplot as plt
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X,Y=np.meshgrid(xlist,ylist)
#定义Z与X、Y的关系
Z=np.sqrt(X**2+Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线
cp=ax.contourf(X,Y,Z)
fig.colorbar(cp)#右侧添加表示x取值的颜色柱
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x(cm)')
ax.set_ylabel('y(cm)')
#绘制等高线
plt.contour(X,Y,Z)#绘制等高线,减少边界锐化程度?
plt.show()
左侧图像绘制了两个变量 X、Y ,右侧的颜色柱(colorbar)则表示 X 的取值,颜色越深表示值越小,中间深色部分的圆心点表示 x=0,y=0,z=0。
1.ax.contourf(X,Y,Z)、2.plt.contour(X,Y,Z)的区别通过下图展示:
text | 在绘图区域的任意位置添加文本。 |
---|---|
annotate | 在绘图区域的任意位置添加带有可选箭头的注释。 |
xlabel | 在绘图区域的 x 轴上添加标签。 |
ylabel | 在绘图区域的 y 轴上添加标签。 |
title | 为绘图区域添加标题。 |
figtext | 在画布的任意位置添加文本。 |
suptitle | 为画布中添加标题。 |
plt.text(x,y,string,weight='bold',color='b')
#weight:注释文本内容的粗细风格
2.annotate()函数 用于绘制箭头
xy为箭头终端,xytext()为箭头起始 arrowprops为dict,用于设置箭头的格式
可以设置箭头的形状等
connectionstyle的属性值有
ax.annotate(string, xy = (,), xytext = (, ),arrowprops = dict(facecolor = string, shrink =,addrowstyle="箭头形状",connectionstyle="例如arc3"))
例子:
import matplotlib.pyplot as plt
fig = plt.figure()
#添加绘图区域
ax = fig.add_axes([0.1,0.1,0.7,0.7])
#设置格式
ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
# 3,8 表示x,y的坐标点;style设置字体样式为斜体;bbox用来设置盒子的属性,比如背景色
ax.text(3, 8, 'i am here', style='italic',bbox = {'facecolor': 'yellow'},fontsize=15)
#绘制数学表达式,用$符包裹
ax.text(2, 6, r'an equation: $E = mc^2$', fontsize = 15)
#添加文字,并设置样式
ax.text(4, 0.05, 'now i am here',verticalalignment = 'bottom', color = 'green', fontsize = 15)
ax.plot([2], [1], 'o')#绘制一个圆
#xy为点的坐标;xytext为注释内容坐标;arrowprops设置箭头的属性
ax.annotate('circle', xy = (2, 1), xytext = (3, 4),arrowprops = dict(facecolor = 'blue', shrink = 0.1))
#设置坐标轴x,y
ax.axis([0, 10, 0, 10])
plt.show()
数学表达式语法:
plt.title(r'$\alpha>\beta$')
绘制小标和上标需要使用’_‘,’^',示例:
#绘制表达式 r'$\alpha_i>\beta_i$'
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
plt.plot(t,s)
#设置标题
plt.title(r'$\alpha_i>\beta_i$',fontsize=20)
#设置数学表达式
plt.text(0.6,0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)
#设置数学表达式
plt.text(0.1,-0.5, r'$\sqrt{2}$', fontsize=10)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()