一,matplotilb库(数学绘图库)
mat数学 plot绘图 lib库
matplotlib.pyplot(缩写mp)->python 最常用接口
mp.plot(水平坐标,垂直坐标数组)
X:[1 2 3 4]
Y:[5 6 7 8]
.mp.plot(X,Y)
代码:plot(xxx,linestyle=线型,linewidth=线宽,color=颜色)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 from numpy import pi 4 5 x= np.linspace(-np.pi,np.pi,1000) #线性空间划分 1000个横坐标 6 #余弦曲线坐标 7 cos_y = np.cos(x)/2 #x是一个数组 numpy的cos可以接受数组,无需遍历矢量化 8 #正弦曲线坐标 9 sin_y = np.sin(x) 10 #x水平坐标,cos_y , sin_y 垂直坐标 11 # mp.plot((x,cos_y),color='limegreen') 12 mp.plot(x,cos_y,linestyle='--',linewidth=10,color='black') 13 mp.plot(x,sin_y) 14 mp.show()
看手册功能:help(mp.plot)
设置图标范围
mp.xlim(左边界,右边界)
mp.xlim(地边界,顶边界)
功能:设置图标范围
如果设置最大值最小值,则全部填满。
显示弧度值:
mp.xticks(刻度位置数组,刻度文本数组)
mp.yticks(刻度位置数组,刻度文本数组)
刻度文本数组转义字符串写法:
[r'$\pi$,r'$\frac{分子}{分母}$',r'$0$']
3/4pi = >r'$\frac{3\pi}{4}$'
引十字座标:
作用:拿到框线的轴
ax=mp.gca() #获取等前坐标轴
ax.spines['left'].set_position(('data',0)) #设置位置边框(有四边)
ax.spines['left'].set_color(颜色) #设置位置边框颜色
显示图列和位置
mp.plot(...,label=r'$y=sin(x)$')
mp.legend(loc='upper left')
标记一些特殊的点:
散点图(不连线)
mp.scatter(水平坐标数组,垂直坐标数组,marker=点型,s=大小,edgecolor=勾边色,faceolor=填充色,zorder=Z序)
Z序就是绘画的顺序,zorder数越大,点越晚压在线上
Matplotilb绘画顺序是线画点,再画线
图上做注释:
mp.annotate(备注文本,xy=目标位置,需要coords=目标坐标系,xytext=文本位置,Textcoords=文本坐标系,fontsize=字体大小,arrowprops=箭头属性)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 x =np.linspace(-np.pi,np.pi,1000) #线性空间划分 5 6 cos_y = np.cos(x)/2 #x是一个数组nupmy的cos可以接受数组,无需遍历矢量化 7 sin_y=np.sin(x) 8 xo=np.pi*3/4 9 yo_cos=np.cos(xo)/2 10 yo_sin = np.sin(xo) 11 12 13 # mp.xlim(x.min(),x.max()) #取最小的值做x的左边界,最大值右边界 14 # mp.ylim(sin_y.min(),sin_y.max()) 15 16 #乘上1.1,上下左右都空开距离 17 mp.xlim(x.min()*1.1,x.max()*1.1) 18 mp.ylim(sin_y.min()*1.1,sin_y.max()*1.1) 19 20 mp.xticks([ 21 -np.pi,-np.pi/2,0,np.pi/2,np.pi*3/4,np.pi], 22 [r'$-\pi$',r'$-\frac{\pi}{2}$',r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$'] 23 ) 24 mp.yticks([-1,-0.5,0,5,1]) 25 26 ax = mp.gca() 27 ax.spines['left'].set_position(('data',0)) 28 ax.spines['bottom'].set_position(('data',0)) 29 ax.spines['right'].set_color('none') #设置为color=none就没有边框了 30 ax.spines['top'].set_color('none') #设置为color=none就没有边框了 31 32 33 mp.scatter([xo,xo],[yo_cos,yo_sin],s=60, 34 edgecolors='limegreen',facecolor='white',zorder=10 35 ) 36 37 mp.annotate( 38 r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$', 39 xy=(xo,yo_cos),xycoords='data', 40 xytext=(-90,-40),textcoords='offset points', 41 fontsize=14, 42 arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) 43 44 mp.annotate( 45 r'$sin(\frac{3\pi}{4})=-\frac{\sqrt{2}}{2}$', 46 xy=(xo,yo_sin),xycoords='data', 47 xytext=(20,20),textcoords='offset points', 48 fontsize=14, 49 arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2')) 50 51 52 53 54 mp.plot([xo,xo],[yo_cos,yo_sin],linestyle='--',linewidth=1,color='limegreen') 55 56 mp.plot(x,cos_y,linestyle='-',linewidth=2,color='dodgerblue',label =r'$y=cos(x)$') 57 mp.plot(x,sin_y,linestyle='-',linewidth=2,color='orangered',label =r'$y=sin(x)$') 58 mp.legend(loc='upper left') 59 mp.show()
==============================================以上是常用matplotilb方法=====================================================
图形对象
1.具体写法:
mp.figure(图形对象名,figsize=窗口大小,dpi=分辨率,facecolor=窗口颜色)
mp.figure()方法:
第一次调用是创建,第二次创建为再次置为当前口
mp.title()写标题
mp.title('XXXX',fontsize=20)
mp.xlabel()坐标轴的标签
mp.xlabel(标签文字,字体大小)
mp.xlabel('x',fortsize=12)
mp.tick_params()设置刻度参数
mp.tick_params(labelsize=10)
mp.grid()设置格线
mp.grid(linestyle=':')
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 x= np.linspace(-np.pi,np.pi,1000) 5 cos_y = np.cos(x)/2 6 sin_y=np.sin(x) 7 8 mp.figure('Figuer Objecti 1',figsize=(6,4),dpi=120,facecolor='lightgray') 9 mp.title('Figure Objcet 1',fontsize=16) 10 11 mp.xlabel('x',fontsize=12) 12 mp.xlabel('y',fontsize=12) 13 mp.tick_params(labelsize=10) 14 mp.grid(linestyle=':') 15 16 mp.figure('Figuer Objecti 2',figsize=(6,4),dpi=120,facecolor='lightgray') 17 mp.title('Figure Objcet 2',fontsize=16) 18 19 mp.xlabel('x',fontsize=12) 20 mp.xlabel('y',fontsize=12) 21 mp.tick_params(labelsize=10) 22 mp.grid(linestyle=':') 23 24 25 mp.figure('Figuer Objecti 1') #再调用一下figuer o1,就会到1的窗口下绘画 26 mp.plot(x,cos_y,label=r'$y=\frac{1}{2}cos(x)$') 27 mp.legend() 28 mp.figure('Figuer Objecti 2') #再调用一下figuer o2,就会到2的窗口下绘画 29 mp.plot(x,sin_y,label=r'$y=sin(x)$') 30 mp.legend() 31 32 mp.show() #只有show针对所有,其余的函数都只针对当前对象
2.图形
1)子图
创建子图,大图里创建子图
1.缺省(默认)布局:
mp.subplot(行数,列数,图号)
例:mp.subplot(2,3,1)或者mp.subplot(231)
子图显示文字:
mp.text(对应中心位置的比例,对应中心位置的比例,图号数值,
ha=水平对其方式,va=垂直对齐方式,
size=尺寸大小,alpha=透明度)
mp.tight_layout() 紧凑 不空很多格 边距变窄
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import matplotlib.pyplot as mp 2 mp.figure(facecolor='lightgray') 3 for i in range(2): #2代表2行 4 for j in range(3): #3代表3列 5 k= i * 3+j+1 6 #mp.subplot(231) #2行3列第一张 7 mp.subplot(2,3,k) 8 mp.xticks(()) #不带刻度线 9 mp.yticks() 10 mp.text(0.5,0.5,str(k),ha='center',va='center',size=36,alpha=0.5) 11 12 mp.tight_layout() #紧凑 不空很多格 边距变窄 13 mp.show()
2.栅格布局
先建立一个栅格布局器:
import matplotlib.gridspes as mg
gs = mg.GridSpes(行数,列数) <-栅格布局器
mp.subplot(gs[行,列])
栅格布局优势:布局均匀
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import matplotlib.pyplot as mp 2 import matplotlib.gridspec as mg 3 4 5 mp.figure(facecolor='lightgray') 6 gs=mg.GridSpec(3,3) #生成栅格布局器,3行3列 九宫格 7 mp.subplot(gs[0,:2]) #gs[0,:2],0代表第0行,:2代表前两例 8 mp.xticks(()) 9 mp.yticks(()) 10 mp.text(0.5,0.5,'1',ha='center',va='center',size=36,alpha=0.5) 11 12 13 mp.subplot(gs[1:,0]) 14 mp.xticks(()) 15 mp.yticks(()) 16 mp.text(0.5,0.5,'2',ha='center',va='center',size=36,alpha=0.5) 17 18 19 mp.subplot(gs[2,1:]) 20 mp.xticks(()) 21 mp.yticks(()) 22 mp.text(0.5,0.5,'3',ha='center',va='center',size=36,alpha=0.5) 23 24 25 mp.tight_layout() 26 mp.show()
3.自由布局
mp.axes([左下角水平坐标,左下角垂直坐标,宽度,高度])
优点:所有尺寸参数都是相对比例
缺点:同时输入几个,最后一张图能在另一张里面
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import matplotlib.pyplot as mp 2 3 mp.figure(facecolor='lightgray') 4 mp.axes([0.03,0.038,0.94,0.924]) 5 mp.xticks(()) 6 mp.yticks(()) 7 mp.text(0.5,0.5,'1',ha='center',va='center',size=36,alpha=0.5) 8 9 10 mp.axes([0.63,0.076,0.31,0.308]) 11 mp.xticks(()) 12 mp.yticks(()) 13 mp.text(0.5,0.5,'2',ha='center',va='center',size=36,alpha=0.5) 14 15 16 mp.show()
2)坐标刻度定位器
定位器对象=mp.xxLocator(...)
ax=mp.gca()
主刻度:ax.xaxis.set_major_locator(定位器对象)#x轴,让定位器对象帮我们定义刻度。
次刻度:ax.xaxis.set_minor_locator(定位器对象)#x轴,让定位器对象帮我们定义刻度
locators=[
'mp.NullLocator()', #空定位器。不需要参数,可以被解释执行
'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])', #等分定位器。最多分n段,从后续列表中选一个等分的点
'mp.FixedLocator(locs=[0,2,5,5,7,5,10])', #固定定位器。等价于直接调用xticks。
'mp.AutoLocator()', #自动定位器。特点:隔间不太密也不太疏,自动匹配
'mp.IndexLocator(offset=0.5,base=1.5)', #索引定位器。Offset起始点,base是隔间。
'mp.MultipleLocator()', #次刻度定位器。
'mp.LinearLocator(numticks=21)', #线性均分定位。如例子,等分20份。
mp.LogLocator(base=2,subs=[1.0])' #指数定位器。
]
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 mp.figure() 5 6 locators = [ 7 'mp.NullLocator()', 8 'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])', 9 'mp.FixedLocator(locs=[0,2.5,5,7.5,10])', 10 'mp.AutoLocator()', 11 'mp.IndexLocator(offset=0.5,base=1.5)', 12 'mp.MultipleLocator()', 13 'mp.LinearLocator(numticks=21)', 14 'mp.LogLocator(base=2,subs=[1.0])'] 15 16 n_locators = len(locators) 17 18 for i, locator in enumerate(locators): 19 mp.subplot(n_locators,1,i+1) 20 mp.xlim(0,10) 21 mp.ylim(-1,1) 22 mp.yticks(()) 23 mp.xticks(()) 24 ax = mp.gca() 25 ax.spines['left'].set_color('none') 26 ax.spines['top'].set_color('none') 27 ax.spines['right'].set_color('none') 28 ax.spines['bottom'].set_position(('data',0)) #底轴放中间 因为1到-1,0在中间 29 ax.xaxis.set_major_locator(eval(locator)) #eval函数解释执行 产生类的对象,主刻度执行器 30 ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))#此刻度定位 0.1为间隔 31 #上面做完但是没有图 32 mp.plot(np.arange(11),np.zeros(11),c='none') #zeros是全零 y坐标 33 mp.text(5,0.3, locator[3:], ha='center',size=12) 34 35 36 mp.tight_layout() 37 mp.show()
3.散点图
散点图的意义:
可以让一个点附带更多信息。
总是用两个坐标想,y坐标来表示。
例子:x代表身高,y代表年龄
X=np.random.normal(0, 1, n)这是正态分布规律的随机数
| | |
V V v
平均值u 标志差 n个
u=0
o=1 代表标准的正太分布
o 表示标准差 o 值越大就越集中; o值越小瘦高 , o越大越平坦。
o²方差
区域填充
mp.fill_between(水平座标数组,垂直座标数组,垂直座标终点数组,条件,color=颜色,alpha=透明度)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 n=1000 5 x=np.linspace(0,8*np.pi,n)#线性分隔 6 sin_y =np.sin(x) 7 cos_y=np.cos(x/2)/2 #周期短频率高 8 9 mp.figure('Fill',facecolor='lightgray') 10 mp.title('Fill',fontsize=20) 11 mp.xlabel('x',fontsize=14) 12 mp.ylabel('y',fontsize=14) 13 mp.tick_params(labelsize=10) #标签文本的字体大小 14 mp.grid(linestyle=':') 15 16 mp.plot(x,sin_y,c='dodgerblue',label=r'$y=sin(x)$') #线用plot来画 17 mp.plot(x,cos_y,c='orangered',label=r'$y=\frac{1}{2}cos(\frac{x}{2})$') 18 mp.fill_between(x,cos_y,sin_y,cos_y < sin_y,color='dodgerblue',alpha=0.5) 19 mp.fill_between(x,cos_y,sin_y,cos_y > sin_y,color='orangered',alpha=0.5) 20 mp.legend() 21 22 23 mp.tight_layout() 24 mp.show()
4.柱状图
mp.bar(水平坐标数组,高度数组,ec=边缘颜色,fc=填充颜色,label=标签文本,alpha=透明度)
y1=np.random.uniform(0.5,1.0,n)
在0.5和1.0内产生n个随机数
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 n=12 5 x=np.arange(n) #生成整数数组 6 y1 =(1-x/n)*np.random.uniform(0.5,1.0,n) 7 y2 =(1-x/n)*np.random.uniform(0.5,1.0,n) 8 mp.figure('Bar',facecolor='lightgray') 9 mp.title('Bar',fontsize=20) 10 mp.ylim(-1.25,1.25) 11 mp.xlabel('x',fontsize=14) 12 mp.ylabel('y',fontsize=14) #12个数字 13 mp.tick_params(labelsize=10) 14 mp.grid(axis='y',linestyle=':') #axis='y' 只有水平线的网格 15 16 for _x,_y in zip(x,y1): 17 #取矩形条的位置和高度 18 #显示文字,两位小数精度的浮点数来表示格式化占位符 19 mp.text(_x,_y,'%.2f'% _y,ha='center',va='bottom') #块在水平底下 20 21 22 for _x, _y in zip(x,y2): 23 #取矩形条的位置和高度 24 #显示文字,两位小数精度的浮点数来表示格式化占位符 25 mp.text(_x, -_y-0.015,'%.2f'% _y,ha='center',va='top') #块在水平底下 26 27 mp.bar(x,y1,ec='white',fc='dodgerblue',label='Sample 1') 28 mp.bar(x,-y2,ec='white',fc='dodgerblue',alpha=0.5,label='Sample 2') 29 mp.legend() 30 31 mp.show()
5.饼图
mp.pie(值,间隙,标签,颜色,格式串,shadow=是否带阴影,startangle=起始角度)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 valuse=[26,17,21,29,11] 5 spaces=[0.05,0.01,0.01,0.01,0.01] #偏移值,每个饼图之间的间距 6 labels=['Python','JavaScript','C++','Java','PHP'] 7 colors=['dodgerblue','orangered','limegreen','violet','gold'] 8 9 mp.figure('Pie',facecolor='lightgray') 10 mp.title('Pie',fontsize=20) 11 mp.pie(valuse,spaces,labels,colors,'%d%%',shadow=True,startangle=90) 12 mp.axis('equal') #等轴比例 13 mp.show()
6.等高线图
用途:用二维的图形来展示三维的数据,多用在地理中。
mp.contour(x,y,z,线数,colors=颜色,linewidth=线宽) #一根根线
mp.contourf(x,y,z,线数,cmap=颜色映射) #一根根色带线(颜色鲜明点)
|
V
N个线数,n个间隔,间隔越多,色带越密集。
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 n=1000 5 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) 6 7 #结果是一个空间曲面 8 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) 9 10 mp.figure('Contour',facecolor='lightgray') 11 mp.title('Contour',fontsize=20) 12 mp.xlabel('x',fontsize=14) 13 mp.ylabel('y',fontsize=14) 14 mp.tick_params(labelsize=10) 15 mp.grid(linestyle=':') 16 #颜色填充等高线 17 mp.contourf(x,y,z,8,cmap='jet') 18 cntr= mp.contour(x,y,z,8,colors='black',linewidths=0.5) 19 20 mp.clabel(cntr,inline_spacing=1,fmt='%.1f',fontsize=10) #填充数字 21 mp.show()
meshgrid函数:
适合于生成网格型数据,它可以接受两个一个数维组生成两个二维矩阵,对应两个数组中所有的(x,y)对。
meshgrid的作用是 根据传入的两个一维数组参数生成两个数组元素的列表。
如果第一个参数xarray,维度就是xdimension
如果第二个参数是yarray,维度就是ydimension
那么生成第一个二维数组是以xarray作为行,共ydimension行,而第二个二维数组以yarray的转置为列,共xdimension列的向量
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #meshgrid 2 3 # 二维坐标,X轴取三个值1,2,3,Y轴取两个值7,8. 4 #思考:可以获得几个点的坐标 5 #6个坐标点 6 #(1,7)(2,7)(3,7) 7 #(1,8)(2,8)(3,8) 8 9 import numpy as np 10 #坐标向量a 11 a=np.array([1,2,3]) 12 #坐标向量b 13 b=np.array([7,8]) 14 15 #从坐标中量中返回坐标矩阵 16 #返回一个list,第一个元素就是x轴的取值,第二个元素是y轴的取值 17 res=np.meshgrid(a,b) 18 print(res) 19 20 21 a2=np.arange(4) 22 b2=np.arange(5) 23 24 25 datalist=np.meshgrid(a2,b2) 26 # print(datalist) 27 x,y=datalist 28 print(x.shape) 29 print(x) 30 print("*"*123) 31 print(y)
返回结果:
第一个二维数组是:以xarray作为行,共ydimension行的向量:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
第为个二维数组是:以yarray作为行,共xdimension行的向量:
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[4 4 4 4]]
7.热像图:
mp.imshow(矩阵,cmap=颜色映射,origin=确定y轴方向
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 4 n=1000 5 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) 6 7 #结果是一个空间曲面 8 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) 9 10 mp.figure('Hot',facecolor='lightgray') 11 mp.title('Hot',fontsize=20) 12 mp.xlabel('x',fontsize=14) 13 mp.ylabel('y',fontsize=14) 14 mp.tick_params(labelsize=10) 15 mp.grid(linestyle=':') 16 17 mp.imshow(z,cmap='jet',origin='low') #origin是上下颠倒的顺序(没什么必要) 18 mp.show()
8.三维曲面图:
主要指:三维贴面和三维线框
引入库:
from mpl_toolkits.mplot3d import axes3d
ax= mp.gca(projection='3d') #创建三维效果的坐标轴
ax.plot_surface(x,y,z,rstride=行距,cstride=列距,cmap=颜色映射)
ax.plot_wireframe(x,y,z,rstride=行距,cstride=列距,linewidth=线宽,cmap=颜色映射)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 from mpl_toolkits.mplot3d import axes3d 2 import numpy as np 3 import matplotlib.pyplot as mp 4 5 n=1000 6 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) 7 8 #结果是一个空间曲面 9 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) 10 11 mp.figure('3d Wireframe') 12 ax = mp.gca(projection='3d') #生成ax 3d对象 13 mp.title('3d Wireframe',fontsize=20) 14 #3d图里不能再用mp画标签,mp是2d的 15 ax.set_xlabel('x', fontsize=14) 16 ax.set_ylabel('y', fontsize=14) 17 ax.set_zlabel('z', fontsize=14) 18 mp.tick_params(labelsize=10) 19 ax.plot_wireframe(x,y,z,rstride=30,cstride=30,linewidth=0.5,color='orangered') 20 #ax.plot_wireframe(x,y,z,rstride=30,cstride=30,cmap='jet') 21 mp.show()
9.三维三点图:
from mpl_toolkits.mplot3d import axes3d
ax=mp.gca(projection='3d') #创建三维效果的坐标轴
ax.scatter(x,y,z,s=大小,c=颜色,marker=点型)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 from mpl_toolkits.mplot3d import axes3d 2 import numpy as np 3 import matplotlib.pyplot as mp 4 5 n=1500 6 x=np.random.normal(0,1,n) 7 y=np.random.normal(0,1,n) 8 z=np.random.normal(0,1,n) 9 d=np.sqrt( x **2+y**2+z**2) #距离正下方的点 空间原点距离 10 11 mp.figure('Scatter3D') 12 ax = mp.gca(projection='3d') #生成ax 3d对象 13 mp.title('Scatter3D',fontsize=20) 14 #3d图里不能再用mp画标签,mp是2d的 15 ax.set_xlabel('x', fontsize=14) 16 ax.set_ylabel('y', fontsize=14) 17 ax.set_zlabel('z', fontsize=14) 18 mp.tick_params(labelsize=10) #标签文本的字体 19 20 ax.scatter(x,y,z,s=60,c=d,cmap='jet_r',alpha=0.5,marker='*') #用距离来做颜色,cmap颜色映射,颜色就和距离对应起来 21 #jet_c 0对应深红,最大值对应深蓝;marker='*' 五角星 marker="s"方块,marker="D"菱形 22 mp.show()
10.极坐标系
ax=mp.gca(Projection='Polar') #二维
mp.plot...(画曲线)
mp.scatter...
x,y(x代表极角,y代表极径)
六元回归线 六片花瓣
六元回归线 表达由线尺寸和角度尺寸之间的函数关系 比较容易角度作极角,线性尺寸作极径。它往往是一个简单的线性方程,使整个操作个能简单化。
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 from mpl_toolkits.mplot3d import axes3d 2 import numpy as np 3 import matplotlib.pyplot as mp 4 5 t = np.linspace(0,2 * np.pi,1001)#线性等分 0,2pi 一圈 6 r_spiral=0.8*t #螺旋线方程 7 r_rose=5*np.sin(6*t)#玫瑰线 六元回归线 六瓣 8 mp.figure('Polar',facecolor='lightgray') 9 mp.gca(projection='polar') 10 mp.title('Polar',fontsize=20) 11 mp.xlabel(r'$\theta$',fontsize=14) 12 mp.ylabel(r'$\rho$',fontsize=14) 13 mp.tick_params(labelsize=10) #标签文本的字体 14 mp.grid(linestyle=':') 15 mp.plot(t,r_spiral,c='dodgerblue',label=r'$\rho=0.8\theta$') 16 17 mp.plot(t,r_rose,c='orangered',label=r'$\rho=5sin(6\theta)$') 18 mp.legend() 19 mp.show()
11.简单动画
引入库:import matplotlib.animation as ma
1.第一种方式:给定一个函数,自己不调取,让别人调取
Eg.:def 更新函数(顺序号): #()这个函数不调取;这步完成一个图像生成器,按照一定的频率去刷新显示。每刷新一次,图形变化一次,产生动画效果)
更新画面帧 #给FuncAnimation调取
ma.FuncAnimation(图形对象,更新函数,interval=间隔时间(毫秒),)
#作用:每间隔多少毫秒,就会调取这个更新函数。
注:一定要绑定anim = ma.FuncAnimation(mp.gcf(),update,interval=10)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 import matplotlib.animation as ma 4 5 n_bubbles=100 6 #自定义结构 每个数组就是每个气泡(气泡数组) 7 #dtype自定义符合结构 8 bubbles = np.zeros(n_bubbles,dtype=[ 9 ('position',float, 2), 10 ('size',float,1), 11 ('growth',float,1), 12 ('color',float,4)]) 13 #初始化位置数组 14 #np.random.uniform均匀分布随机数(最小值) 15 bubbles['position']=np.random.uniform(0,1,(n_bubbles,2)) 16 bubbles['size']=np.random.uniform(50,750,n_bubbles) 17 bubbles['growth']=np.random.uniform(30,150,n_bubbles) 18 bubbles['color']=np.random.uniform(0,1,(n_bubbles,4)) 19 mp.figure('Bubbles',facecolor='lightgray') 20 mp.title('Bubbles',fontsize=20) 21 mp.xticks(()) 22 mp.yticks(()) 23 #用散点图画 24 #x轴:bubbles['position'][:,0];y轴:bubbles['position'][:,1], 25 #不能用s=数值,这么写所有气泡都一个大小了。 26 sc = mp.scatter(bubbles['position'][:,0], 27 bubbles['position'][:,1], 28 s=bubbles['size'], 29 c=bubbles['color']) 30 def update(number): 31 bubbles['size'] += bubbles['growth'] 32 #气泡破裂方法 33 #根据number数,让不同的气泡发生破裂。 34 #变成0-99之间的循环 做取余运算 让下标总是合理 35 burst = number % n_bubbles 36 bubbles['position'][burst] = np.random.uniform(0, 1, 2) 37 bubbles['size'][burst] = 0 #初始大小等于0 38 bubbles['growth'][burst] = np.random.uniform(30,150) #更新膨胀速度 39 bubbles['color'][burst] = np.random.uniform(0, 1, 4) 40 #修改位置的值 41 sc.set_offsets(bubbles['position']) 42 #修改颜色 ,破裂效果产生了 43 sc.set_facecolor(bubbles['color']) 44 45 sc.set_sizes(bubbles['size']) 46 #修改size里的值 47 sc.set_sizes(bubbles['size']) 48 anim = ma.FuncAnimation(mp.gcf(),update,interval=10) 49 mp.show()
2.第二种方式:多加一个生成器,把这个生成器当作一个可迭代对象取迭代。迭代中不断生成数据作为参数来调用。通过第二个函数传入的更新函数,由它完成渲染。通过一个函数产生的数据,另一个函数渲染数据,从设计结构上更合理,符合低耦合的设计原则。
低耦合的设计原则。
写法:
def 更新函数(生成值):
更新画面帧
def 生成器():
for XXX in YYY:
产生新数据
yield生成值
ma.FuncAnimation(图形对象,更新函数,生成器,interval=间隔时间)
实时信号产生动画:
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 import matplotlib.animation as ma 4 5 6 mp.figure('Signal',facecolor='lightgray') #创建图形窗口 7 mp.title('Signal',fontsize=20) 8 mp.xlabel('Time',fontsize=14) #水平轴x轴代表时间 9 mp.ylabel('Signal',fontsize=14) #垂直轴y轴代表信号值 10 #设置水平轴和垂直轴的坐标范围 11 12 ax=mp.gca() #当前轴 13 ax.set_ylim(-3,3) #设置y轴坐标范围 14 ax.set_xlim(0,10) #设置x轴坐标范围 15 mp.tick_params(labelsize=10) #设置坐标刻度的字体 16 mp.grid(linestyle=':') #加上网格线 17 18 #mp.show#生成空的图片 19 p1= mp.plot([],[],c='orangered')[0] #封装p1,必须拿最第0个元素 20 p1.set_data([],[]) #把x,y空数组对象保存起来 21 22 #data存的是数据,我们自己第一 23 def update(data): 24 #data里放的是时间和信息 25 #t,v是我新加点的坐标 26 t,v=data 27 x,y=p1.get_data() 28 x.append(t) #在现有坐标后面加上新的,做追加 29 y.append(v) 30 x_min,x_max=ax.get_xlim() #左右边界 31 if t >= x_max: 32 ax.set_xlim(t-(x_max-x_min),t) 33 #把新的t当做最大值,就是新范围 34 ax.figure.canvas.draw() #重新画 35 36 37 #告诉x,y我改了 38 p1.set_data(x,y) 39 #接下来写生成器函数 40 def generator(): 41 t=0 #时间容器,代表信号采集时间 42 while True: 43 #模拟 np.exp代表振幅 44 #振幅呈正归位变化的正弦函数 45 #np.sin(2**np.pi*t)高频信号; 46 #np.sin(0.2*np.pi*t)低频信号 47 v=np.sin(2**np.pi*t) *np.exp(np.sin(0.2*np.pi*t)) 48 49 50 #yield会把当前的帧保存下来 51 yield t,v 52 t+=0.05 53 54 anim=ma.FuncAnimation(mp.gcf(),update,generator,interval=5) 55 mp.show()
12.对数坐标
对数:值越小,放大的尺寸越大;
值越大,放大的尺寸越小。
我们称为非线性特征。
对数体现出了倍数。
半对数坐标:
mp.semilog(y,c=颜色,label="semilog")
为什么用对数:
等分坐标的缺点:当尺寸相差比较悬殊的时候。往往大尺寸变化率会把小尺寸变换率淹没了。
例:y值 1-1000小于1的几乎看不出区别。
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 y = np.array([1, 10, 100, 1000, 100, 10, 1]) 4 mp.figure('Normal & Log', facecolor='lightgray') 5 mp.subplot(211) 6 mp.title('Normal', fontsize=16) 7 mp.ylabel('y', fontsize=12) 8 ax = mp.gca() 9 ax.xaxis.set_major_locator( 10 mp.MultipleLocator(1)) 11 #多点定位器,主刻度间隔1 12 ax.xaxis.set_minor_locator( 13 mp.MultipleLocator(0.1)) 14 15 ax.yaxis.set_major_locator( 16 mp.MultipleLocator(250)) 17 18 ax.yaxis.set_minor_locator( 19 mp.MultipleLocator(50)) 20 mp.tick_params(labelsize=10) 21 #沿着主刻度来画标线 22 mp.grid(which='major',axis='both', 23 linewidth=0.75,linestyle='-', 24 color='lightgray') 25 mp.grid(which='minor',axis='both', 26 linewidth=0.25,linestyle='-', 27 color='lightgray') 28 mp.plot(y, 'o-', c='dodgerblue', label='plot') 29 mp.legend() 30 31 mp.subplot(212) 32 mp.title('Log', fontsize=16) 33 mp.xlabel('x', fontsize=12) 34 mp.ylabel('y', fontsize=12) 35 ax = mp.gca() 36 ax.xaxis.set_major_locator( 37 mp.MultipleLocator(1)) 38 #多点定位器,主刻度间隔1 39 ax.xaxis.set_minor_locator( 40 mp.MultipleLocator(0.1)) 41 42 mp.tick_params(labelsize=10) 43 #沿着主刻度来画标线 44 mp.grid(which='major',axis='both', 45 linewidth=0.75,linestyle='-', 46 color='lightgray') 47 mp.grid(which='minor',axis='both', 48 linewidth=0.25,linestyle='-', 49 color='lightgray') 50 51 mp.semilogy(y, 'o-', c='orangered', 52 label='semilog') 53 mp.legend() 54 55 mp.tight_layout() 56 mp.show()