数据可视化(matplotilb)
一,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=颜色)
例:
import numpy as np
import matplotlib.pyplot as mp
from numpy import pi x= np.linspace(-np.pi,np.pi,1000) #线性空间划分 1000个横坐标
#余弦曲线坐标
cos_y = np.cos(x)/2 #x是一个数组 numpy的cos可以接受数组,无需遍历矢量化
#正弦曲线坐标
sin_y = np.sin(x)
#x水平坐标,cos_y , sin_y 垂直坐标
# mp.plot((x,cos_y),color='limegreen')
mp.plot(x,cos_y,linestyle='--',linewidth=10,color='black')
mp.plot(x,sin_y)
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=箭头属性)
例:
import numpy as np
import matplotlib.pyplot as mp x =np.linspace(-np.pi,np.pi,1000) #线性空间划分 cos_y = np.cos(x)/2 #x是一个数组nupmy的cos可以接受数组,无需遍历矢量化
sin_y=np.sin(x)
xo=np.pi*3/4
yo_cos=np.cos(xo)/2
yo_sin = np.sin(xo) # mp.xlim(x.min(),x.max()) #取最小的值做x的左边界,最大值右边界
# mp.ylim(sin_y.min(),sin_y.max()) #乘上1.1,上下左右都空开距离
mp.xlim(x.min()*1.1,x.max()*1.1)
mp.ylim(sin_y.min()*1.1,sin_y.max()*1.1) mp.xticks([
-np.pi,-np.pi/2,0,np.pi/2,np.pi*3/4,np.pi],
[r'$-\pi$',r'$-\frac{\pi}{2}$',r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$']
)
mp.yticks([-1,-0.5,0,5,1]) ax = mp.gca()
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
ax.spines['right'].set_color('none') #设置为color=none就没有边框了
ax.spines['top'].set_color('none') #设置为color=none就没有边框了 mp.scatter([xo,xo],[yo_cos,yo_sin],s=60,
edgecolors='limegreen',facecolor='white',zorder=10
) mp.annotate(
r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$',
xy=(xo,yo_cos),xycoords='data',
xytext=(-90,-40),textcoords='offset points',
fontsize=14,
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) mp.annotate(
r'$sin(\frac{3\pi}{4})=-\frac{\sqrt{2}}{2}$',
xy=(xo,yo_sin),xycoords='data',
xytext=(20,20),textcoords='offset points',
fontsize=14,
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2')) mp.plot([xo,xo],[yo_cos,yo_sin],linestyle='--',linewidth=1,color='limegreen') mp.plot(x,cos_y,linestyle='-',linewidth=2,color='dodgerblue',label =r'$y=cos(x)$')
mp.plot(x,sin_y,linestyle='-',linewidth=2,color='orangered',label =r'$y=sin(x)$')
mp.legend(loc='upper left')
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=':')
例:
import numpy as np
import matplotlib.pyplot as mp x= np.linspace(-np.pi,np.pi,1000)
cos_y = np.cos(x)/2
sin_y=np.sin(x) mp.figure('Figuer Objecti 1',figsize=(6,4),dpi=120,facecolor='lightgray')
mp.title('Figure Objcet 1',fontsize=16) mp.xlabel('x',fontsize=12)
mp.xlabel('y',fontsize=12)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':') mp.figure('Figuer Objecti 2',figsize=(6,4),dpi=120,facecolor='lightgray')
mp.title('Figure Objcet 2',fontsize=16) mp.xlabel('x',fontsize=12)
mp.xlabel('y',fontsize=12)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':') mp.figure('Figuer Objecti 1') #再调用一下figuer o1,就会到1的窗口下绘画
mp.plot(x,cos_y,label=r'$y=\frac{1}{2}cos(x)$')
mp.legend()
mp.figure('Figuer Objecti 2') #再调用一下figuer o2,就会到2的窗口下绘画
mp.plot(x,sin_y,label=r'$y=sin(x)$')
mp.legend() 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() 紧凑 不空很多格 边距变窄
例:
import matplotlib.pyplot as mp
mp.figure(facecolor='lightgray')
for i in range(2): #2代表2行
for j in range(3): #3代表3列
k= i * 3+j+1
#mp.subplot(231) #2行3列第一张
mp.subplot(2,3,k)
mp.xticks(()) #不带刻度线
mp.yticks()
mp.text(0.5,0.5,str(k),ha='center',va='center',size=36,alpha=0.5) mp.tight_layout() #紧凑 不空很多格 边距变窄
mp.show()
2.栅格布局
先建立一个栅格布局器:
import matplotlib.gridspes as mg
gs = mg.GridSpes(行数,列数) <-栅格布局器
mp.subplot(gs[行,列])
栅格布局优势:布局均匀
例:
import matplotlib.pyplot as mp
import matplotlib.gridspec as mg mp.figure(facecolor='lightgray')
gs=mg.GridSpec(3,3) #生成栅格布局器,3行3列 九宫格
mp.subplot(gs[0,:2]) #gs[0,:2],0代表第0行,:2代表前两例
mp.xticks(())
mp.yticks(())
mp.text(0.5,0.5,'',ha='center',va='center',size=36,alpha=0.5) mp.subplot(gs[1:,0])
mp.xticks(())
mp.yticks(())
mp.text(0.5,0.5,'',ha='center',va='center',size=36,alpha=0.5) mp.subplot(gs[2,1:])
mp.xticks(())
mp.yticks(())
mp.text(0.5,0.5,'',ha='center',va='center',size=36,alpha=0.5) mp.tight_layout()
mp.show()
3.自由布局
mp.axes([左下角水平坐标,左下角垂直坐标,宽度,高度])
优点:所有尺寸参数都是相对比例
缺点:同时输入几个,最后一张图能在另一张里面
例:
import matplotlib.pyplot as mp mp.figure(facecolor='lightgray')
mp.axes([0.03,0.038,0.94,0.924])
mp.xticks(())
mp.yticks(())
mp.text(0.5,0.5,'',ha='center',va='center',size=36,alpha=0.5) mp.axes([0.63,0.076,0.31,0.308])
mp.xticks(())
mp.yticks(())
mp.text(0.5,0.5,'',ha='center',va='center',size=36,alpha=0.5) 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])' #指数定位器。
]
例:
import numpy as np
import matplotlib.pyplot as mp mp.figure() locators = [
'mp.NullLocator()',
'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])',
'mp.FixedLocator(locs=[0,2.5,5,7.5,10])',
'mp.AutoLocator()',
'mp.IndexLocator(offset=0.5,base=1.5)',
'mp.MultipleLocator()',
'mp.LinearLocator(numticks=21)',
'mp.LogLocator(base=2,subs=[1.0])'] n_locators = len(locators) for i, locator in enumerate(locators):
mp.subplot(n_locators,1,i+1)
mp.xlim(0,10)
mp.ylim(-1,1)
mp.yticks(())
mp.xticks(())
ax = mp.gca()
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position(('data',0)) #底轴放中间 因为1到-1,0在中间
ax.xaxis.set_major_locator(eval(locator)) #eval函数解释执行 产生类的对象,主刻度执行器
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))#此刻度定位 0.1为间隔
#上面做完但是没有图
mp.plot(np.arange(11),np.zeros(11),c='none') #zeros是全零 y坐标
mp.text(5,0.3, locator[3:], ha='center',size=12) mp.tight_layout()
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=透明度)
import numpy as np
import matplotlib.pyplot as mp n=1000
x=np.linspace(0,8*np.pi,n)#线性分隔
sin_y =np.sin(x)
cos_y=np.cos(x/2)/2 #周期短频率高 mp.figure('Fill',facecolor='lightgray')
mp.title('Fill',fontsize=20)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14)
mp.tick_params(labelsize=10) #标签文本的字体大小
mp.grid(linestyle=':') mp.plot(x,sin_y,c='dodgerblue',label=r'$y=sin(x)$') #线用plot来画
mp.plot(x,cos_y,c='orangered',label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
mp.fill_between(x,cos_y,sin_y,cos_y < sin_y,color='dodgerblue',alpha=0.5)
mp.fill_between(x,cos_y,sin_y,cos_y > sin_y,color='orangered',alpha=0.5)
mp.legend() mp.tight_layout()
mp.show()
4.柱状图
mp.bar(水平坐标数组,高度数组,ec=边缘颜色,fc=填充颜色,label=标签文本,alpha=透明度)
y1=np.random.uniform(0.5,1.0,n)
在0.5和1.0内产生n个随机数
例:
import numpy as np
import matplotlib.pyplot as mp n=12
x=np.arange(n) #生成整数数组
y1 =(1-x/n)*np.random.uniform(0.5,1.0,n)
y2 =(1-x/n)*np.random.uniform(0.5,1.0,n)
mp.figure('Bar',facecolor='lightgray')
mp.title('Bar',fontsize=20)
mp.ylim(-1.25,1.25)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14) #12个数字
mp.tick_params(labelsize=10)
mp.grid(axis='y',linestyle=':') #axis='y' 只有水平线的网格 for _x,_y in zip(x,y1):
#取矩形条的位置和高度
#显示文字,两位小数精度的浮点数来表示格式化占位符
mp.text(_x,_y,'%.2f'% _y,ha='center',va='bottom') #块在水平底下 for _x, _y in zip(x,y2):
#取矩形条的位置和高度
#显示文字,两位小数精度的浮点数来表示格式化占位符
mp.text(_x, -_y-0.015,'%.2f'% _y,ha='center',va='top') #块在水平底下 mp.bar(x,y1,ec='white',fc='dodgerblue',label='Sample 1')
mp.bar(x,-y2,ec='white',fc='dodgerblue',alpha=0.5,label='Sample 2')
mp.legend() mp.show()
5.饼图
mp.pie(值,间隙,标签,颜色,格式串,shadow=是否带阴影,startangle=起始角度)
例:
import numpy as np
import matplotlib.pyplot as mp valuse=[26,17,21,29,11]
spaces=[0.05,0.01,0.01,0.01,0.01] #偏移值,每个饼图之间的间距
labels=['Python','JavaScript','C++','Java','PHP']
colors=['dodgerblue','orangered','limegreen','violet','gold'] mp.figure('Pie',facecolor='lightgray')
mp.title('Pie',fontsize=20)
mp.pie(valuse,spaces,labels,colors,'%d%%',shadow=True,startangle=90)
mp.axis('equal') #等轴比例
mp.show()
6.等高线图
用途:用二维的图形来展示三维的数据,多用在地理中。
mp.contour(x,y,z,线数,colors=颜色,linewidth=线宽) #一根根线
mp.contourf(x,y,z,线数,cmap=颜色映射) #一根根色带线(颜色鲜明点)
|
V
N个线数,n个间隔,间隔越多,色带越密集。
例:
import numpy as np
import matplotlib.pyplot as mp n=1000
x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) #结果是一个空间曲面
z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) mp.figure('Contour',facecolor='lightgray')
mp.title('Contour',fontsize=20)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
#颜色填充等高线
mp.contourf(x,y,z,8,cmap='jet')
cntr= mp.contour(x,y,z,8,colors='black',linewidths=0.5) mp.clabel(cntr,inline_spacing=1,fmt='%.1f',fontsize=10) #填充数字
mp.show()
meshgrid函数:
适合于生成网格型数据,它可以接受两个一个数维组生成两个二维矩阵,对应两个数组中所有的(x,y)对。
meshgrid的作用是 根据传入的两个一维数组参数生成两个数组元素的列表。
如果第一个参数xarray,维度就是xdimension
如果第二个参数是yarray,维度就是ydimension
那么生成第一个二维数组是以xarray作为行,共ydimension行,而第二个二维数组以yarray的转置为列,共xdimension列的向量
例:
#meshgrid # 二维坐标,X轴取三个值1,2,3,Y轴取两个值7,8.
#思考:可以获得几个点的坐标
#6个坐标点
#(1,7)(2,7)(3,7)
#(1,8)(2,8)(3,8) import numpy as np
#坐标向量a
a=np.array([1,2,3])
#坐标向量b
b=np.array([7,8]) #从坐标中量中返回坐标矩阵
#返回一个list,第一个元素就是x轴的取值,第二个元素是y轴的取值
res=np.meshgrid(a,b)
print(res) a2=np.arange(4)
b2=np.arange(5) datalist=np.meshgrid(a2,b2)
# print(datalist)
x,y=datalist
print(x.shape)
print(x)
print("*"*123)
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轴方向
例:
import numpy as np
import matplotlib.pyplot as mp n=1000
x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) #结果是一个空间曲面
z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) mp.figure('Hot',facecolor='lightgray')
mp.title('Hot',fontsize=20)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':') mp.imshow(z,cmap='jet',origin='low') #origin是上下颠倒的顺序(没什么必要)
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=颜色映射)
例:
from mpl_toolkits.mplot3d import axes3d
import numpy as np
import matplotlib.pyplot as mp n=1000
x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) #结果是一个空间曲面
z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2) mp.figure('3d Wireframe')
ax = mp.gca(projection='3d') #生成ax 3d对象
mp.title('3d Wireframe',fontsize=20)
#3d图里不能再用mp画标签,mp是2d的
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
ax.plot_wireframe(x,y,z,rstride=30,cstride=30,linewidth=0.5,color='orangered')
#ax.plot_wireframe(x,y,z,rstride=30,cstride=30,cmap='jet')
mp.show()
9.三维三点图:
from mpl_toolkits.mplot3d import axes3d
ax=mp.gca(projection='3d') #创建三维效果的坐标轴
ax.scatter(x,y,z,s=大小,c=颜色,marker=点型)
例:
from mpl_toolkits.mplot3d import axes3d
import numpy as np
import matplotlib.pyplot as mp n=1500
x=np.random.normal(0,1,n)
y=np.random.normal(0,1,n)
z=np.random.normal(0,1,n)
d=np.sqrt( x **2+y**2+z**2) #距离正下方的点 空间原点距离 mp.figure('Scatter3D')
ax = mp.gca(projection='3d') #生成ax 3d对象
mp.title('Scatter3D',fontsize=20)
#3d图里不能再用mp画标签,mp是2d的
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10) #标签文本的字体 ax.scatter(x,y,z,s=60,c=d,cmap='jet_r',alpha=0.5,marker='*') #用距离来做颜色,cmap颜色映射,颜色就和距离对应起来
#jet_c 0对应深红,最大值对应深蓝;marker='*' 五角星 marker="s"方块,marker="D"菱形
mp.show()
10.极坐标系
ax=mp.gca(Projection='Polar') #二维
mp.plot...(画曲线)
mp.scatter...
x,y(x代表极角,y代表极径)
六元回归线 六片花瓣
六元回归线 表达由线尺寸和角度尺寸之间的函数关系 比较容易角度作极角,线性尺寸作极径。它往往是一个简单的线性方程,使整个操作个能简单化。
例:
from mpl_toolkits.mplot3d import axes3d
import numpy as np
import matplotlib.pyplot as mp t = np.linspace(0,2 * np.pi,1001)#线性等分 0,2pi 一圈
r_spiral=0.8*t #螺旋线方程
r_rose=5*np.sin(6*t)#玫瑰线 六元回归线 六瓣
mp.figure('Polar',facecolor='lightgray')
mp.gca(projection='polar')
mp.title('Polar',fontsize=20)
mp.xlabel(r'$\theta$',fontsize=14)
mp.ylabel(r'$\rho$',fontsize=14)
mp.tick_params(labelsize=10) #标签文本的字体
mp.grid(linestyle=':')
mp.plot(t,r_spiral,c='dodgerblue',label=r'$\rho=0.8\theta$') mp.plot(t,r_rose,c='orangered',label=r'$\rho=5sin(6\theta)$')
mp.legend()
mp.show()
11.简单动画
引入库:import matplotlib.animation as ma
1.第一种方式:给定一个函数,自己不调取,让别人调取
Eg.:def 更新函数(顺序号): #()这个函数不调取;这步完成一个图像生成器,按照一定的频率去刷新显示。每刷新一次,图形变化一次,产生动画效果)
更新画面帧 #给FuncAnimation调取
ma.FuncAnimation(图形对象,更新函数,interval=间隔时间(毫秒),)
#作用:每间隔多少毫秒,就会调取这个更新函数。
注:一定要绑定anim = ma.FuncAnimation(mp.gcf(),update,interval=10)
例:
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.animation as ma n_bubbles=100
#自定义结构 每个数组就是每个气泡(气泡数组)
#dtype自定义符合结构
bubbles = np.zeros(n_bubbles,dtype=[
('position',float, 2),
('size',float,1),
('growth',float,1),
('color',float,4)])
#初始化位置数组
#np.random.uniform均匀分布随机数(最小值)
bubbles['position']=np.random.uniform(0,1,(n_bubbles,2))
bubbles['size']=np.random.uniform(50,750,n_bubbles)
bubbles['growth']=np.random.uniform(30,150,n_bubbles)
bubbles['color']=np.random.uniform(0,1,(n_bubbles,4))
mp.figure('Bubbles',facecolor='lightgray')
mp.title('Bubbles',fontsize=20)
mp.xticks(())
mp.yticks(())
#用散点图画
#x轴:bubbles['position'][:,0];y轴:bubbles['position'][:,1],
#不能用s=数值,这么写所有气泡都一个大小了。
sc = mp.scatter(bubbles['position'][:,0],
bubbles['position'][:,1],
s=bubbles['size'],
c=bubbles['color'])
def update(number):
bubbles['size'] += bubbles['growth']
#气泡破裂方法
#根据number数,让不同的气泡发生破裂。
#变成0-99之间的循环 做取余运算 让下标总是合理
burst = number % n_bubbles
bubbles['position'][burst] = np.random.uniform(0, 1, 2)
bubbles['size'][burst] = 0 #初始大小等于0
bubbles['growth'][burst] = np.random.uniform(30,150) #更新膨胀速度
bubbles['color'][burst] = np.random.uniform(0, 1, 4)
#修改位置的值
sc.set_offsets(bubbles['position'])
#修改颜色 ,破裂效果产生了
sc.set_facecolor(bubbles['color']) sc.set_sizes(bubbles['size'])
#修改size里的值
sc.set_sizes(bubbles['size'])
anim = ma.FuncAnimation(mp.gcf(),update,interval=10)
mp.show()
2.第二种方式:多加一个生成器,把这个生成器当作一个可迭代对象取迭代。迭代中不断生成数据作为参数来调用。通过第二个函数传入的更新函数,由它完成渲染。通过一个函数产生的数据,另一个函数渲染数据,从设计结构上更合理,符合低耦合的设计原则。
低耦合的设计原则。
写法:
def 更新函数(生成值):
更新画面帧
def 生成器():
for XXX in YYY:
产生新数据
yield生成值
ma.FuncAnimation(图形对象,更新函数,生成器,interval=间隔时间)
实时信号产生动画:
代码:
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.animation as ma mp.figure('Signal',facecolor='lightgray') #创建图形窗口
mp.title('Signal',fontsize=20)
mp.xlabel('Time',fontsize=14) #水平轴x轴代表时间
mp.ylabel('Signal',fontsize=14) #垂直轴y轴代表信号值
#设置水平轴和垂直轴的坐标范围 ax=mp.gca() #当前轴
ax.set_ylim(-3,3) #设置y轴坐标范围
ax.set_xlim(0,10) #设置x轴坐标范围
mp.tick_params(labelsize=10) #设置坐标刻度的字体
mp.grid(linestyle=':') #加上网格线 #mp.show#生成空的图片
p1= mp.plot([],[],c='orangered')[0] #封装p1,必须拿最第0个元素
p1.set_data([],[]) #把x,y空数组对象保存起来 #data存的是数据,我们自己第一
def update(data):
#data里放的是时间和信息
#t,v是我新加点的坐标
t,v=data
x,y=p1.get_data()
x.append(t) #在现有坐标后面加上新的,做追加
y.append(v)
x_min,x_max=ax.get_xlim() #左右边界
if t >= x_max:
ax.set_xlim(t-(x_max-x_min),t)
#把新的t当做最大值,就是新范围
ax.figure.canvas.draw() #重新画 #告诉x,y我改了
p1.set_data(x,y)
#接下来写生成器函数
def generator():
t=0 #时间容器,代表信号采集时间
while True:
#模拟 np.exp代表振幅
#振幅呈正归位变化的正弦函数
#np.sin(2**np.pi*t)高频信号;
#np.sin(0.2*np.pi*t)低频信号
v=np.sin(2**np.pi*t) *np.exp(np.sin(0.2*np.pi*t)) #yield会把当前的帧保存下来
yield t,v
t+=0.05 anim=ma.FuncAnimation(mp.gcf(),update,generator,interval=5)
mp.show()
12.对数坐标
对数:值越小,放大的尺寸越大;
值越大,放大的尺寸越小。
我们称为非线性特征。
对数体现出了倍数。
半对数坐标:
mp.semilog(y,c=颜色,label="semilog")
为什么用对数:
等分坐标的缺点:当尺寸相差比较悬殊的时候。往往大尺寸变化率会把小尺寸变换率淹没了。
例:y值 1-1000小于1的几乎看不出区别。
例:
import numpy as np
import matplotlib.pyplot as mp
y = np.array([1, 10, 100, 1000, 100, 10, 1])
mp.figure('Normal & Log', facecolor='lightgray')
mp.subplot(211)
mp.title('Normal', fontsize=16)
mp.ylabel('y', fontsize=12)
ax = mp.gca()
ax.xaxis.set_major_locator(
mp.MultipleLocator(1))
#多点定位器,主刻度间隔1
ax.xaxis.set_minor_locator(
mp.MultipleLocator(0.1)) ax.yaxis.set_major_locator(
mp.MultipleLocator(250)) ax.yaxis.set_minor_locator(
mp.MultipleLocator(50))
mp.tick_params(labelsize=10)
#沿着主刻度来画标线
mp.grid(which='major',axis='both',
linewidth=0.75,linestyle='-',
color='lightgray')
mp.grid(which='minor',axis='both',
linewidth=0.25,linestyle='-',
color='lightgray')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend() mp.subplot(212)
mp.title('Log', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
ax = mp.gca()
ax.xaxis.set_major_locator(
mp.MultipleLocator(1))
#多点定位器,主刻度间隔1
ax.xaxis.set_minor_locator(
mp.MultipleLocator(0.1)) mp.tick_params(labelsize=10)
#沿着主刻度来画标线
mp.grid(which='major',axis='both',
linewidth=0.75,linestyle='-',
color='lightgray')
mp.grid(which='minor',axis='both',
linewidth=0.25,linestyle='-',
color='lightgray') mp.semilogy(y, 'o-', c='orangered',
label='semilog')
mp.legend() mp.tight_layout()
mp.show()
数据可视化(matplotilb)的更多相关文章
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- 手把手教你用FineBI做数据可视化
前些日子公司引进了帆软商业智能FineBI,在接受了简单的培训后,发现这款商业智能软件用作可视分析只用一个词形容的话,那就是“轻盈灵动”!界面简洁.操作流畅,几个步骤就可以创建分析,获得想要的效果.此 ...
- 数据可视化案例 | 如何打造数据中心APP产品
意识到数据探索带来的无尽信息,越来越多的企业开始建立自有的数据分析平台,打造数据化产品,实现数据可视化. 在零售商超行业,沃尔玛"啤酒与尿布"的故事已不再是传奇.无论是大数据还是小 ...
- 数据可视化 echarts3
初识 echarts ECharts,一个纯 Javascript 的数据可视化图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefo ...
- 数据可视化-EChart2.0使用总结1
图表是企业级Web开发必不可少的一个功能点.也是“数据可视化的一个具体呈现”.今天看到阮一峰翻译的“数据可视化:基本图表”一文,同时梳理一下公司现在项目使用的EChart2.0类库.阮一峰的文章同时也 ...
- 百度数据可视化图表套件echart实战
最近我一直在做数据可视化的前端工作,我用的最多的绘图工具是d3.d3有点像photoshop,功能很强大,例子也很多,但是学习成本也不低,做项目是需要较大人力投入的.3月底由在亚马逊工作的同学介绍下使 ...
- 前端数据可视化echarts.js使用指南
一.开篇 首先这里要感谢一下我的公司,因为公司需求上面的新颖(奇葩)的需求,让我有幸可以学习到一些好玩有趣的前端技术,前端技术中好玩而且比较实用的我想应该要数前端的数据可视化这一方面,目前市面上的数据 ...
- [原创.数据可视化系列之五]韩国"萨德"系统防御图
自从7月8日美国和韩国共同宣布将在韩国部署萨德反导系统后,韩国国内对此事的巨大争议以及本地区一些国家的强烈不满情绪在持续发酵.“萨德”(THAAD)全称“末段高空区域防御系统”,是美国导弹防御局和美国 ...
随机推荐
- 在线暴躁:<script />问题
这个问题是今天发现的,以前都没注意到这个问题: <script src="./vue/vue.min.js" /> <script src="./vue ...
- MaxCompute问答整理之9月
本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.如何查看information_schema的tables? 在使用OD ...
- MaxCompute 表(Table)设计规范
表的限制项 表(Table)设计规范 表设计主要目标 表设计的影响 表设计步骤 表数据存储规范 按数据分层规范数据生命周期 按数据的变更和历史规范数据的保存 数据导入通道与表设计 分区设计与逻辑存储的 ...
- 解析Tomcat之HttpServlet详解
解析Tomcat之HttpServlet详解 Servlet的框架是 由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所 ...
- SecureRandom的正确使用
目录 1. 什么是安全的随机数? 2. 怎么得到安全的随机数 3. SecureRandom最佳实践 3.1 基本用法 3.2 关于种子的设置 3.3 熵源不足时阻塞问题 4. 小结 1. 什么是安全 ...
- 往github上上传项目
点击start a project 新建 下面部分传送http://blog.csdn.net/s740556472/article/details/55000019 如图: 这里我们有一个步骤需要做 ...
- Python:获取当前py的文件名
采用pathlib库 from pathlib import Path Path(__file__).name
- linux使用nmon监控、分析系统性能
linux使用nmon监控.分析系统性能 一.概述 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的, ...
- 记录一次MySQL数据库CPU负载异常高的问题
1.起因 某日下午18:40开始,接收到滕讯云短信报警,显示数据库CPU使用率已超过100%,同时慢查询日志的条数有1500条左右. 正常情况下:CPU使用率为30%-40%之间,慢查询日志条数为0. ...
- 《创新者》读书笔记 PB16110698 第五周(~4.5)
本周我阅读了某同学推荐的<创新者>,这本书实际上是两个世纪以来信息技术的编年史,从巴贝奇的差分机到如今互联网时代的超级计算机,作者通过各个时代里一位位杰出的创新者,将计算机诞生.发展.崛起 ...