信息可视化是数据分析中一个重要的部分。它也可能是探索数据的一部分,比如,帮助我们找到离群点或需要进行变换的数据,或帮助我们思考选择哪种模型更合适。Python有很多库能用来制作统计或动态可视化,但这里我们重点关注matplotlib pandas searborn等库。Matplotlib是一个非常强大的画图工具,对数据的可视化起着很大的作用。Maplotlib可以画图线图,散点图,等高线图,条形图,柱形图,3D图形,图形动画等。
import matplotlib.pyplot as plt import numpy as npimport pandas as pd
x=np.linspace(-1 ,1 ,50 ) #定义x y1=2 *x+1 #定义y数据范围 y2=x**2 plt.figure() #定义图像窗口 plt.plot(x,y1) #画出曲线 plt.plot(x,y2) plt.show() #显示图像
x=np.linspace(-3 ,3 ,50 ) #在(-3,3)之间生成50个样本数 y1=2 *x+1 y2=x**2 plt.figure(num=1 ,figsize=(8 ,5 )) #定义编号为1,大小为(8,5) plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ) #颜色线宽及格式 plt.plot(x,y2) plt.show()
x=np.linspace(-3 ,3 ,50 ) #在(-3,3)之间生成50个样本数 y1=2 *x+1 y2=x**2 plt.figure(num=1 ,figsize=(8 ,5 )) #定义编号为1,大小为(8,5) plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ) plt.plot(x,y2) plt.xlim(-1 ,2 ) #x轴的范围 plt.ylim(-2 ,3 ) #y轴的范围 plt.xlabel('x轴' ) plt.ylabel('y轴' ) plt.show()
x=np.linspace(-3 ,3 ,50 ) #在(-3,3)之间生成50个样本数 y1=2 *x+1 y2=x**2 plt.figure(num=2 ,figsize=(8 ,5 )) #定义编号为2,大小为(8,5) plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ) plt.plot(x,y2) plt.xlim(-1 ,2 ) #x轴的范围 plt.ylim(-2 ,3 ) #y轴的范围 plt.xlabel('x轴' ) plt.ylabel('y轴' ) new_ticks=np.linspace(-1 ,2 ,5 ) #-1到2分成5段,包含端点 print(new_ticks) plt.xticks(new_ticks) #进行替换新下标 plt.yticks([-2 ,-1 ,0 ,1 ,2 ,], [r'$really\ bad$' ,'$bad$' ,'$0$' ,'$well$' ,'$really\ well$' ]) plt.show()
[-1. -0.25 0.5 1.25 2. ]
x=np.linspace(-3 ,3 ,50 ) #在(-3,3)之间生成50个样本数 y1=2 *x+1 y2=x**2 plt.figure(num=2 ,figsize=(8 ,5 )) #定义编号为2,大小为(8,5) plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ) plt.plot(x,y2) plt.xlim(-1 ,2 ) #x轴的范围 plt.ylim(-2 ,3 ) #y轴的范围 plt.xlabel('x轴' ) plt.ylabel('y轴' ) new_ticks=np.linspace(-1 ,2 ,5 ) #-1到2分成5段,包含端点 print(new_ticks) plt.xticks(new_ticks) #进行替换新下标 plt.yticks([-2 ,-1 ,0 ,1 ,2 ,], [r'$really\ bad$' ,'$bad$' ,'$0$' ,'$well$' ,'$really\ well$' ]) ax=plt.gca() #get current axis ax.spines['right' ].set_color('none' ) #边框属性设置为None 不显示 ax.spines['top' ].set_color('none' ) plt.show()
[-1. -0.25 0.5 1.25 2. ]
x=np.linspace(-3 ,3 ,50 ) #在(-3,3)之间生成50个样本数 y1=2 *x+1 y2=x**2 plt.figure(num=2 ,figsize=(8 ,5 )) #定义编号为2,大小为(8,5) plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ) plt.plot(x,y2) plt.xlim(-1 ,2 ) #x轴的范围 plt.ylim(-2 ,3 ) #y轴的范围 plt.xlabel('x轴' ) plt.ylabel('y轴' ) new_ticks=np.linspace(-1 ,2 ,5 ) #-1到2分成5段,包含端点 print(new_ticks) plt.xticks(new_ticks) #进行替换新下标 plt.yticks([-2 ,-1 ,0 ,1 ,2 ,], [r'$really\ bad$' ,'$bad$' ,'$0$' ,'$well$' ,'$really\ well$' ]) ax=plt.gca() #get current axis ax.spines['right' ].set_color('none' ) #边框属性设置为None 不显示 ax.spines['top' ].set_color('none' ) ax.xaxis.set_ticks_position('bottom' ) #设置x坐标刻度数字或名称的位置,所有属性为:top,bottom,both,default,none ax.spines['bottom' ].set_position(('data' ,0 )) # 设置.spines边框x轴,设置.set_position设置边框的位置,y=0位置;位置所有属性有outward,axes,data ax.yaxis.set_ticks_position('left' ) ax.spines['left' ].set_position(('data' ,0 )) #坐标中心点在(0,0)位置 plt.show()
[-1. -0.25 0.5 1.25 2. ]
x=np.linspace(-3 ,3 ,50 ) y1=2 *x+1 y2=x**2 plt.figure(num=2 ,figsize=(8 ,5 )) plt.xlim(-1 ,2 ) plt.ylim(-2 ,3 ) new_ticks=np.linspace(-1 ,2 ,5 ) plt.xticks(new_ticks) plt.yticks([-2 ,-1 ,1 ,2 ,], [r'$really\ bad$' ,'$bad$' ,'$well$' ,'$really\ well$' ]) l1,=plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ,label='linear line' ) l2,=plt.plot(x,y2,label='square line' ) plt.legend(loc='best' ) #显示在最好的位置,自动分配 plt.show() #显示图
x=np.linspace(-3 ,3 ,50 ) y1=2 *x+1 y2=x**2 plt.figure(num=2 ,figsize=(8 ,5 )) plt.xlim(-1 ,2 ) plt.ylim(-2 ,3 ) new_ticks=np.linspace(-1 ,2 ,5 ) plt.xticks(new_ticks) plt.yticks([-2 ,-1 ,1 ,2 ,], [r'$really\ bad$' ,'$bad$' ,'$well$' ,'$really\ well$' ]) l1,=plt.plot(x,y1,color='red' ,linewidth=2 ,linestyle='--' ,label='linear line' ) l2,=plt.plot(x,y2,label='square line' ) #单独修改label的信息 plt.legend(loc='best' ,handles=[l1,l2],labels=['up' ,'down' ]) #显示在最好的位置,自动分配 plt.show() #显示图
loc中的参数:
best upper right upper left lower left lower right right center right lower center upper center center
x=np.linspace(-3 ,3 ,50 ) y=2 *x+1 plt.figure(num=1 ,figsize=(8 ,5 )) plt.plot(x,y)#移动坐标轴 ax=plt.gca() ax.spines['right' ].set_color('none' ) ax.spines['top' ].set_color('none' ) ax.xaxis.set_ticks_position('bottom' ) ax.spines['bottom' ].set_position(('data' ,0 )) ax.yaxis.set_ticks_position('left' ) ax.spines['left' ].set_position(('data' ,0 ))#标注信息 x0=1 y0=2 *x0+1 plt.scatter(x0,y0,color='b' ) plt.plot([x0,x0],[y0,0 ],'k--' ,lw=2.5 ) #连接两个点,k表示黑色,lw=line weight 线粗细 plt.annotate(r'$2x0+1=%s$' % y0,xy=(x0,y0),xycoords='data' ,xytext=(+30 ,-30 ),textcoords='offset points' ,fontsize=16 , arrowprops=dict(arrowstyle='->' ,connectionstyle='arc3,rad=.2' ))#xycoords='data' 基于数据的值来选位置,xytext=(+30,-30),对于标注位置的描述,textcoords='offset points',xy偏差值,arrowprops对图中箭头类型设置 plt.text(-3.7 ,3 ,r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$' ,fontdict={'size' :16 ,'color' :'r' }) plt.show()
x=np.linspace(-3 ,3 ,50 ) y=0.1 *x plt.figure() plt.plot(x,y,linewidth=10 ,zorder=1 ) plt.ylim(-2 ,2 )#移动坐标轴 ax=plt.gca() ax.spines['right' ].set_color('none' ) ax.spines['top' ].set_color('none' ) ax.xaxis.set_ticks_position('bottom' ) ax.spines['bottom' ].set_position(('data' ,0 )) ax.yaxis.set_ticks_position('left' ) ax.spines['left' ].set_position(('data' ,0 ))#label.set_fontsize(12) 重新调整字体的大小,bbox设置目的内容透明度相关系数,facecolor调节box景色 #edgecolor设置边框 ,alpha设置透明度,zorder设置图层顺序 for label in ax.get_xticklabels()+ax.get_yticklabels(): label.set_fontsize(12 ) label.set_bbox(dict(facecolor='red' ,edgecolor='None' ,alpha=0.7 ,zorder=2 )) plt.show()
n=1024 X=np.random.normal(0 ,1 ,n) Y=np.random.normal(0 ,1 ,n) T=np.arctan2(Y,X) #arctan2返回给定的X和Y值的反正切值 #scatter画散点图,size=75,颜色为T,透明度为50%,利用xticks函数来隐藏x坐标轴 plt.scatter(X,Y,s=75 ,c=T,alpha=0.5 ) plt.xlim(-1.5 ,1.5 ) plt.xticks(()) #忽略xticks plt.ylim(-1.5 ,1.5 ) plt.yticks(()) #忽略yticks plt.show()
8.2 Bar条形图 n=12 X=np.arange(n) Y1=(1 -X/float(n))*np.random.uniform(0.5 ,1 ,n) Y2=(1 -X/float(n))*np.random.uniform(0.5 ,1 ,n) plt.bar(X,+Y1,facecolor='#9999ff' ,edgecolor='white' ) plt.bar(X,-Y2,facecolor='#ff9999' ,edgecolor='white' )#标记值 for x,y in zip(X,Y1): #zip表示可以传递两个值 plt.text(x+0.4 ,y+0.5 ,'%.2f' %y,ha='center' ,va='bottom' ) #ha表示横向对齐,bottom表示向下对齐 for x,y in zip(X,Y2): plt.text(x+0.4 ,-y-0.05 ,'%.2f' %y,ha='center' ,va='top' ) plt.xlim(-0.5 ,n) plt.xticks(()) plt.ylim(-1.25 ,1.25 ) plt.yticks(()) plt.show()
8.3 Contours等高线图 n=256 x=np.linspace(-3 ,3 ,n) y=np.linspace(-3 ,3 ,n) X,Y=np.meshgrid(x,y) #从坐标向量返回坐标矩阵 #函数用来计算高度值,利用contour函数把颜色加进去,位置参数依次为x,y,f(x,y),透明度为0.75,并将f(x,y)的值对应到camp之中 def f (x,y) : return (1 -x/2 +x**5 +y**3 )*np.exp(-x**2 -y**2 ) plt.contourf(X,Y,f(X,Y),8 ,alpha=0.75 ,cmap=plt.cm.hot) #8表示等高线分成多少份,alpha表示透明度,cmap表示color map C=plt.contour(X,Y,f(X,Y),8 ,colors='black' ,linewidth=0.5 ) plt.clabel(C,inline=True ,fontsize=10 ) plt.xticks(()) #隐藏坐标轴 plt.yticks(()) plt.show()
import matplotlib.pyplot as pltimport numpy as np a = np.array([0.313660827978 , 0.365348418405 , 0.423733120134 , 0.365348418405 , 0.439599930621 , 0.525083754405 , 0.423733120134 , 0.525083754405 , 0.651536351379 ]).reshape(3 ,3 ) plt.imshow(a, interpolation='nearest' , cmap='bone' , origin='lower' ) plt.show()
interpolation_methods: 可以更改看看效果 <[None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
#利用matplotlib打印出图像 a=np.array([0.313660827978 ,0.365348418405 ,0.423733120134 , 0.365348418405 ,0.439599930621 ,0.525083754405 , 0.423733120134 ,0.525083754405 ,0.651536351379 ]).reshape(3 ,3 ) plt.imshow(a,interpolation='nearest' ,cmap='bone' ,origin='lower' ) #origin='lower'代表就是选择原点位置 plt.colorbar(shrink=.92 ) #shrink参数是将图片长度变为原来的92% plt.xticks(()) plt.yticks(()) plt.show()
<IPython .core.display.Javascript object >
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D #需要导入模块Axes3D fig=plt.figure() #定义图像窗口 ax=Axes3D(fig) #在窗口上添加3D坐标轴 #将x和y值编织成栅格 X=np.arange(-4 ,4 ,0.25 ) Y=np.arange(-4 ,4 ,0.25 ) X,Y=np.meshgrid(X,Y) R=np.sqrt(X**2 +Y**2 ) Z=np.sin(R) #高度值 #将colormap ranbow填充颜色,之后将三维图像投影到XY平面做等高线图,其中rstride和cstride表示row和column的宽度 ax.plot_surface(X,Y,Z,rstride=1 ,cstride=1 ,cmap=plt.get_cmap('rainbow' )) #rstride表示图像中分割线的跨图 #添加XY平面等高线 投影到Z平面 ax.contourf(X,Y,Z,zdir='z' ,offset=-2 ,cmap=plt.get_cmap('rainbow' )) #把图像进行投影的图形 offset表示比0坐标轴低两个位置 ax.set_zlim(-2 ,2 ) plt.show()
11.1 多合一显示 均匀图中图:MatPlotLib可以组合许多的小图在大图中显示,使用的方法叫做subplot.
plt.figure() plt.subplot(2 ,2 ,1 ) #表示将整个图像分割成2行2列,当前位置为1 plt.plot([0 ,1 ],[0 ,1 ]) #横坐标变化为[0,1] 竖坐标变化为[0,2] plt.subplot(2 ,2 ,2 ) plt.plot([0 ,1 ],[0 ,2 ]) plt.subplot(2 ,2 ,3 ) plt.plot([0 ,1 ],[0 ,3 ]) plt.subplot(2 ,2 ,4 ) plt.plot([0 ,1 ],[0 ,4 ]) plt.show()
不均匀图中图 plt.figure() plt.subplot(2 ,1 ,1 ) #表示将整个图像分割成2行1列,当前位置为1 plt.plot([0 ,1 ],[0 ,1 ]) #横坐标变化为[0,1] 竖坐标变化为[0,2] plt.subplot(2 ,3 ,4 ) plt.plot([0 ,1 ],[0 ,2 ]) plt.subplot(2 ,3 ,5 ) plt.plot([0 ,1 ],[0 ,3 ]) plt.subplot(2 ,3 ,6 ) plt.plot([0 ,1 ],[0 ,4 ]) plt.show()
11.2 分格显示 方法一 import matplotlib.gridspec as gridspec #引入新模块 plt.figure()#使用plt.subplot2grid创建一个小图,(3,3)表示将整个图像分割成三行三列,(0,0)表示从第0行0列开始作图, #colspan=3表示列的跨度为3.colspan和rowspan缺省时默认跨度为1 ax1=plt.subplot2grid((3 ,3 ),(0 ,0 ),colspan=3 ) ax1.plot([1 ,2 ],[1 ,2 ]) ax1.set_title('ax1_title' ) #设置图的标题 #将图像分割成3行3列,从第1行0列开始作图,列的跨度为2 ax2=plt.subplot2grid((3 ,3 ),(1 ,0 ),colspan=2 )#将图像分割成3行3列,从第1行2列开始作图,行的跨度为2 ax3=plt.subplot2grid((3 ,3 ),(1 ,2 ),rowspan=2 )#将图像分割成3行3列,从第2行0列开始作图,行与列的跨度默认为1 ax4=plt.subplot2grid((3 ,3 ),(2 ,0 )) ax4.scatter([1 ,2 ],[2 ,2 ]) ax4.set_xlabel('ax4_x' ) ax4.set_ylabel('ax4_y' ) ax5=plt.subplot2grid((3 ,3 ),(2 ,1 )) plt.show()
方法二 plt.figure() gs=gridspec.GridSpec(3 ,3 ) #将图像分割成三行三列 ax6=plt.subplot(gs[0 ,:]) #gs[0:1]表示图占第0行和所有列 ax7=plt.subplot(gs[1 ,:2 ]) #gs[1,:2]表示图占第1行和前两列 ax8=plt.subplot(gs[1 :,2 ]) #gs[1,:]表示图占后两行的最后一列 ax9=plt.subplot(gs[-1 ,0 ]) ax10=plt.subplot(gs[-1 ,-2 ]) #gs[-1,-2]表示这个图占倒数第一行和倒数第2列 plt.show()
方法三 #建立一个2行2列的图像窗口,sharex=True表示共享x轴坐标,sharey=True表示共享y轴坐标, #((ax11,ax12),(ax13,ax14))表示从左到右一次存放ax11,ax12,ax13,ax14 f,((ax11,ax12),(ax13,ax14))=plt.subplots(2 ,2 ,sharex=True ,sharey=True ) ax11.scatter([1 ,2 ],[1 ,2 ]) #坐标范围x为[1,2],y为[1,2] plt.tight_layout() #表示紧凑显示图像 plt.show()
fig=plt.figure()#创建数据 x=[1 ,2 ,3 ,4 ,5 ,6 ,7 ] y=[1 ,3 ,4 ,2 ,5 ,8 ,6 ]#绘制大图:假设大图的大小为10,那么大图被包含在由(1,1)开始,宽8高8的坐标系之中 left,bottom,width,height=0.1 ,0.1 ,0.8 ,0.8 ax1=fig.add_axes([left,bottom,width,height]) #main axes ax1.plot(x,y,'r' ) #绘制大图,颜色为red ax1.set_xlabel('x' ) #横坐标名称为x ax1.set_ylabel('y' ) ax1.set_title('title' ) #图名称为title #绘制小图,注意坐标系位置和大小的改变 ax2=fig.add_axes([0.2 ,0.6 ,0.25 ,0.25 ]) ax2.plot(y,x,'b' ) #颜色为bule ax2.set_xlabel('x' ) ax2.set_title('title inside 1' )#绘制第二个小图 plt.axes([0.6 ,0.2 ,0.25 ,0.25 ]) plt.plot(y[::-1 ],x,'g' ) #将y进行逆序 plt.xlabel('x' ) plt.ylabel('y' ) plt.title('title inside 2' ) plt.show()
x=np.arange(0 ,10 ,0.1 ) y1=0.5 *x**2 y2=-1 *y1 fig,ax1=plt.subplots() ax2=ax1.twinx() #镜像显示 ax1.plot(x,y1,'g-' ) ax2.plot(x,y2,'b-' ) ax1.set_xlabel('x data' ) ax1.set_ylabel('Y1 data' ,color='g' ) #第一个y坐标轴 ax2.set_ylabel('Y2 data' ,color='b' ) #第二个y坐标轴 plt.show()
from matplotlib import pyplot as pltfrom matplotlib import animationimport numpy as np fig, ax = plt.subplots()#我们的数据是一个0~2π内的正弦曲线 x = np.arange(0 , 2 *np.pi, 0.01 ) line, = ax.plot(x, np.sin(x))#接着,构造自定义动画函数animate,用来更新每一帧上各个x对应的y坐标值,参数表示第i帧 def animate (i) : line.set_ydata(np.sin(x + i/10.0 )) return line,#然后,构造开始帧函数init def init () : line.set_ydata(np.sin(x)) return line,#接下来,我们调用FuncAnimation函数生成动画。参数说明: #fig 进行动画绘制的figure #func 自定义动画函数,即传入刚定义的函数animate #frames 动画长度,一次循环包含的帧数 #init_func 自定义开始帧,即传入刚定义的函数init #interval 更新频率,以ms计 #blit 选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显示动画 ani = animation.FuncAnimation(fig=fig, func=animate, frames=100 , init_func=init, interval=20 , blit=False ) plt.show()#图中效果为一曲线向左移动 # 当然,你也可以将动画以mp4格式保存下来,但首先要保证你已经安装了ffmpeg 或者mencoder # ani.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
下载1:OpenCV-Contrib扩展模块中文版教程