不论是数据挖掘还是数学建模,都免不了数据可视化的问题。对于Python来说,matplotlib是最著名的绘图库,它主要用于二维绘图,当然也可以进行简单的三维绘图。它不但提供了一整套和Matlab相似但更为丰富的命令,让我们可以非常快捷地用python可视化数据。
#安装pipinstallmatplotlib
两种绘图风格:
MATLAB风格:
基本函数是plot,分别取x,y的值,然后取到坐标(x,y)后,对不同的连续点进行连线。
面向对象:
创建一个图形fig和一个坐标ax。
示例:
importmatplotlib.pyplotaspltimportnumpyasnp#图形显示风格plt.style.use('seaborn-whitegrid')#创建fig和axfig=plt.figure()ax=plt.axes()x=np.linspace(0,10,100)#显示sin函数图形plt.plot(x,np.sin(x))#显示cos函数图形plt.plot(x,np.cos(x))plt.show()
这就是利用面向对象的方式绘图,在交互模式中可以看到,每画一个图就是产生一个对象,最后再显示出来。
绘图样式
#调整坐标轴上下限plt.xlim([xmin,xmax])plt.ylim([ymin,ymax])plt.axis([xmin,xmax,ymin,ymax])#参数:tight:把图形设置成紧凑模式,不留多余的部分#equal:图形显示分辨率为1:1
文字设置
图形标题:plt.title
坐标轴标题:plt.xlabel,plt.ylabel
基础图例:plt.legend
注意:对中文不友好,需要额外方法,尽量使用英文
#示例importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(1,10,100)plt.plot(x,np.sin(x))plt.title('sin-function')plt.xlabel('x-value')plt.ylabel('y-label')plt.show()
图例
通过legend可以设置图例,同时通过参数的调整可以细腻的设置图例的位置、形式等。参数主要包括:
#示例importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(1,10,100)fig,ax=plt.subplots()ax.plot(x,np.sin(x),color='red',label='sin-function')ax.plot(x,np.cos(x),color='blue',label='cos-function')ax.legend(loc='upperright',frameon=True,shadow=True,framealpha=0.2)#设置图例位置为右上,有边框,有阴影,且透明度为0.2plt.show()
颜色条
importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(1,10,100)I=np.sin(x)*np.cos(x[:,np.newaxis])plt.imshow(I)plt.colorbar()plt.show()
散点图基础
散点图主要以点为主,数据是不连续的数据,通过设置线的型号来完成。型号包括‘o'、‘+'、‘*'、‘1'、‘h'、‘D'等等,具体使用探索一下就好,用不到太多。
importmatplotlib.pyplotaspltimportnumpyasnp#图形显示风格plt.style.use('seaborn-whitegrid')x=np.linspace(0,10,30)y=np.sin(x)#通过设置线型为点来完成散点图的绘制plt.plot(x,y,'o',color='blue')plt.show()
如果设置线型为点线结合,那么将绘制出连续的线,对应点处为所设置的点型。
画散点图还可以使用scatter函数来画,他有很多更细节的描述,用法与plot类似,对于数据量较大的可视化时,plot的效率更高一些。
误差线
importmatplotlib.pyplotaspltimportnumpyasnp#图形显示风格plt.style.use('seaborn-whitegrid')x=np.linspace(0,10,30)dy=x*0.5y=np.sin(x)+dyplt.errorbar(x,y,yerr=dy,fmt='.k',ecolor='blue')plt.show()
连续误差线表示的是连续量,可以使用plt.plot和plt.fill_between来画出。
importmatplotlib.pyplotaspltimportnumpyasnp#图形显示风格plt.style.use('seaborn-whitegrid')x=np.linspace(0,10,30)ysin=np.sin(x)ycos=np.cos(x)plt.plot(x,ysin,color='red')plt.plot(x,ycos,color='blue')plt.fill_between(x,ysin,ycos,color='gray',alpha=0.2)plt.show()
等高线(密度)
等高线绘制方法:z=f(x,y),z表示高度。当只有一个颜色绘图时,虚线表示负值,实线表示正值。meshgrid可以将一维数据变成二维网格数据。
importmatplotlib.pyplotaspltimportnumpyasnpdeff(x,y):returnnp.sin(x)**10+np.cos(10+y*x)*np.cos(x)x=np.linspace(0,5,50)y=np.linspace(0,5,40)#得到网格点矩阵x,y=np.meshgrid(x,y)#计算z轴的值z=f(x,y)#绘制图形plt.contour(x,y,z,colors='green')#plt.contour(x,y,z,50,cmap='RdGy')#更改配色,值50等分,红灰配色plt.show()
plt.contourf(x,y,z,50,cmap='RdGy')#改为contourf,自动填充颜色,则变为连续的
基本画法:plt.hist可以直接画直方图,参数主要包括:
importmatplotlib.pyplotaspltimportnumpyasnpdata=np.random.randn(1000)plt.hist(data,bins=30,alpha=0.3,histtype='stepfilled',color='blue',edgecolor='none')plt.show()
程序中random.randn与random.rand相比,randn表示随机生成的数符合正态分布,因此画出图来是如上图所示。
plt.subplot(2,1,1)#子图,(2,1,1)代表,创建2*1的画布,并且定位于画布1;等效于plt.subplot(211),即去掉逗号#subplots可以同时创建多个子图figure,ax=plt.subplots(2,3)#这是一个灵活创建子图的方法,可以创建任意组合的图形,不必一一对齐,以下为示例:grid=plt.GridSpec(2,3,wspace=0.3,hspace=0.2)plt.subplot(grid[,:2])plt.subplot(grid[1,1:3])
文字注释
通过不同的坐标变换,可以把文字放在不同的位置:
importmatplotlib.pyplotaspltimportnumpyasnpfig,ax=plt.subplots()ax.axis=([0,1,0,1])ax.text(0.5,0.5,"Data:(0.5,0.5)",transform=ax.transData)ax.text(0.5,0.1,"Axes:(0.5,0.1)",transform=ax.transAxes)plt.show()
箭头注释
importmatplotlib.pyplotaspltimportnumpyasnpfig,ax=plt.subplots()x=np.linspace(0,20,1000)ax.plot(x,np.cos(x))ax.axis('equal')ax.annotate("max",xy=(6.28,1),xytext=(10,4),arrowprops=dict(facecolor='black',shrink=0.05))ax.annotate('min',xy=(5*np.pi,-1),xytext=(2,-6),arrowprops=dict(arrowstyle="->",connectionstyle='angle3,angleA=0,angleB=-90'))plt.show()
基础三维图
matplotlib中绘制三维图用到mplot3d包。导入mplot3d包后,可以利用projection参数,控制绘制三维图。
importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkitsimportmplot3dfig=plt.figure()ax=plt.axes(projection='3d')plt.show()
三维图中当然包含三个轴,x,y,z。画线ax.plot3D,画点ax.scatter3D。为了三维效果,它会自动将远处的点颜色变浅。
importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkitsimportmplot3dfig=plt.figure()ax=plt.axes(projection='3d')z=np.linspace(0,15,100)x=np.sin(z)y=np.cos(z)ax.plot3D(x,y,z,'red')ax.scatter3D(x,y,z,'blue')plt.show()三维等高线
importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkitsimportmplot3dfig=plt.figure()ax=plt.axes(projection='3d')deff(x,y):returnnp.sin(np.sqrt(x**2+y**2))x=np.linspace(-6,6,30)y=np.linspace(-6,6,30)X,Y=np.meshgrid(x,y)Z=f(X,Y)ax.contour3D(X,Y,Z,50)plt.show()
图形绘制出来后,可以通过ax.view_init来控制观察的角度,便于理解。
Series绘图
#这是一个小栗子s1=Series(np.random.randint(1000).cumsum())#创建series,cumsum()是指叠加求和,本位数是前几项之和s1.plot()#series有自己的plot函数,里面可以写入想要的参数DataFrame绘图
df=DataFrame(np.random.randint(1,10,40).reshape(10,4),columns=['A','B','C','D'])df.plot()#dataframe也有自己的plot,按列画出来,参数包含ax,选择输出的画布#参数:stacked=True,表示一个堆叠的情况,同一个index下,columns一不同颜色叠在一起