Python数据可视化 课件 04章Matplotlib统计图表绘制_第1页
Python数据可视化 课件 04章Matplotlib统计图表绘制_第2页
Python数据可视化 课件 04章Matplotlib统计图表绘制_第3页
Python数据可视化 课件 04章Matplotlib统计图表绘制_第4页
Python数据可视化 课件 04章Matplotlib统计图表绘制_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python数据可视化第4章Matplotlib统计图形绘制教师:xxx2024.07第1节

箱线图第4章Matplotlib统计图形绘制第2节

极线图第3节

误差棒图第4节

等高线图第5节

3D绘图数据可视化是以图形的方式展示数据。好的图表自己会“说话”,正所谓“一图抵千言”。由于数据和需求的多样性,越来越多的统计图表被运用到可视化领域。本章介绍matplotlib中的一些统计图表,这些图表有不同的适用场合。例如,箱线图描述数据分布的情况,极线图展示数据的多个维度,误差图展示数据的不确定性,等高线图反映等值数据的投影曲线,3D图展示数据之美。统计图形绘制箱线图箱线图结构箱线图绘制方法极线图极线图绘制方法极线图参数设置误差棒图绘制误差棒图带误差棒的柱状图和条形图等高线图等高线概述等高线绘制方法3D绘图3D散点/柱状图3D曲面/投影图箱线图用于展示数据分布,由一个箱体和一对箱须构成,箱体下边沿是下四分位数Q1、上边沿是上四分位数Q3,箱体内的横线对应中位数Q2。箱须表示数据的范围,在箱须末端之外的数值被视为离群值,一般用小圆圈标注这些异常值。箱线图一目了然地反映了数据的大致分布,可以粗略地看出数据是否具有对称性及分布的离散程度等信息。第1节

箱线图一、

箱线图概述二、

箱线图绘制plt.plot()用于绘制箱线图,语法格式如下,主要参数如表4-1所示。plt.boxplot(x,

sym=None,

whis=None,

widths=None,

patch_artist=None,...)参数名说明参数名说明x数据序列widths设置箱体宽度vertTrue纵向,False横向patch_artist是否给箱体设置颜色showmeans默认False不显示,True则显示均值线meanline默认False均值用点表示,True均值用线表示labels刻度标签sym离群点的标记样式whis四分位间距的倍速,确定箱须包含数据的范围,默认值1.5importmatplotlib.pyplotasplt x=[1,21,2,3,5,39,13,1,34,55,8,89]#meanline表示均值用线表示(默认用点),如右图plt.boxplot(x,showmeans=True,meanline=True) 二、

绘图示例如上图所示,箱线图主要由箱体、箱须和离群值等部分组成。其中,箱体的范围由下四分位数Q1和上四分位数Q3界定。箱线图涉及分位数的计算,公式W=1+(n-1)*QS用于计算分位数的位置。其中n是数据个数,QS是分位点,例如Q1、Q2和Q3对应的分位点为0.25、0.5和0.75。本例中,Q1=2+(3-2)*0.75=2.75;Q3=34+(39-34)*0.25=35.25。(详细计算过程见教材)上面的计算结果可以用numpy的分位数函数percentile验证如下:importnumpyasnp x=[1,21,2,3,5,39,13,1,34,55,8,89]print(np.percentile(x,[25,50,75])) #计算25%,50%,75%分位数,注意参数是整数格式输出:[2.7510.535.25]

多组数据可以同时绘制多个箱线图,以便对比分析。例如绘制某班两门课程的成绩对比,代码如下:np.random.seed(7)y1=np.random.randint(70,100,50) #成绩1y2=np.random.randint(40,95,50) #成绩2data=[y1,y2]labels=['python数据可视化','数据挖掘']

#课程名colors=['#FFF68F','#9999ff']whis=0.4 #箱须系数,由默认值1.5调整为0.4widths=0.5 #箱体宽度box=plt.boxplot(data,whis=whis,widths=widths,sym='*',labels=labels,patch_artist=True)forpatch,colorinzip(box['boxes'],colors): #遍历box['boxes'],设置不同的箱体颜色patch.set_facecolor(color)plt.axhline(np.mean(y1),c='#FFF68F')

#均值水平参考线plt.axhline(np.mean(y2),c='#9999ff')plt.xticks(fontsize=16)plt.ylabel('分数',fontsize=14)plt.title('课程成绩箱线图',fontsize=16) 二、箱线图绘制极线图是绘制在极坐标系上的图形,通过极角和极径来对比数据的差异。极线图上可同时绘制多个数据序列,每个数据序列的点用线条连接,各个点可能代表某个数据指标,例如对企业经营的收益性、生产性、流动性、安全性和成长性等方面的评分。多根线条组合在一起形似雷达形状,因此极线图也称为雷达图。极坐标系中点的坐标用弧度(theta)和极径(r)描述,绘制极线图需提供两个相同长度的参数数组theta和r,对应极角和极径。极线图的绘制有如下两种方法:第2节

极线图#方法一使用函数plt.polar()theta=np.linspace(0,2*np.pi,6) #极角,弧度#注意,为封闭图形,序列末尾应再加上第一个数据r1=[3,4,5,5.5,4,3]#A企业5项评分r2=[4,5,5,4.5,3,4]#B企业5项评分labels=['收益性','生产性','流动性','安全性','成长性','收益性']plt.polar(theta,r1,c='g',marker='*',markerfacecolor='b',markersize=15,lw=2) plt.polar(theta,r2,c='y',marker='d',markerfacecolor='r',markersize=10,lw=2)plt.thetagrids(theta*180/np.pi,labels) #外圈标签,参数以角度为单位plt.legend(['A','B'],fontsize=14) 一、极线图概述二、绘制方法#方法二创建子图时设置projection='polar'或polar=True的参数#theta、r1和r2与上面代码一样ax=plt.subplot(111,projection='polar') #创建极坐标子图ax.plot(theta,r1,c='g',marker='*',mfc='b',ms=15,lw=2)ax.plot(theta,r2,c='y',marker='d',mfc='r',ms=10,lw=2) 说明:以上两种方法绘图效果相同。第二种方法使用的绘图函数是ax.plot(),该方法原本是绘制折线图,但因为ax采用极坐标系,所以原来的x和y位置的参数被理解为了极角和极径。参数mfc、ms和lw分别是markerfacecolor、markersize和linewidth的简写。类似上面的绘制方法,还可以将数据样本以辐射柱形图展示出来。ax.bar()命令原本用于绘制直角坐标系下的柱状图,需要的参数为x和height。当ax子图采用极坐标系后,x位置的参数被视为极角,height位置的参数被视为极径,width参数指定扇形的弧度,此处width宽度一般没有实际意义。二、绘制方法ax=plt.subplot(polar=True)#创建极坐标系子图theta1=np.linspace(0,2*np.pi,5,endpoint=False) #A极角theta2=np.linspace(0.35,2*np.pi+0.35,5,endpoint=False) #B从0.35弧度开始,与A错开r1=[3,4,5,5.5,4]#A企业的5项评分r2=[4,5,5,4.5,3]#B企业的5项评分ax.bar(theta1,r1,color='b',width=0.3,alpha=0.4) #极坐标系中ax.bar绘制辐射柱形图ax.bar(theta2,r2,color='r',width=0.3,alpha=0.4)plt.legend(['A','B'],fontsize=14) 巧妙设置极角和极径可以在极坐标系中绘制出很多美观的几何图形,下面试举两例,代码如下:三、极坐标参数设置theta=np.arange(0,2*np.pi,0.02)r=1.2*np.ones_like(theta) #r为全1数组plt.subplot(121,polar=True) #左子图plt.plot(theta,r,lw=2) #r数组的值都相同,极径一样,绘制圆plt.plot(theta,theta/4,'--',lw=2)

#渐开曲线plt.rgrids([]) #清空,圆内不标注极径数字plt.subplot(122,polar=True) #右子图plt.plot(theta,1.4*np.cos(7*theta),'--',lw=2) #绘制7个花瓣plt.rgrids([0.3,1],angle=45) #在45度角的线上标注极径0.3和1plt.thetagrids([0,45]) #图见下页左图绘制了一个整圆和渐开的曲线,同时清空了圆内的标注数字。plt.rgrids()设置同心栅格的极径大小和文字标注的角度,因此右图中的虚线圆圈只有两个,极径为0.3和1,圆圈上的标注沿45°线排列。函数plt.thetagrids()设置放射线栅格的角度,因此右图中只有两条放射线,角度为0°和45°。三、极坐标参数设置在可视化实验数据时,可以在图形上增加误差棒以表示客观存在的测量偏差。误差棒以被测量值的算术平均值为中点,向上下两端各画出一条线段,该误差线段表示被测量数据可能以某一置信度的概率落在棒上区间内。误差棒的计算方法有很多种:单一数值、置信区间、标准差和标准误等。其可视化样式可分为:水平误差棒、垂直误差棒、对称误差棒和非对称误差棒等。第3节

误差棒图plt.errorbar()用于绘制误差棒图,主要参数说明如下:x、y:数据的x坐标和y坐标yerr:y轴方向的误差xerr:x轴方向的误差ecolor:errorbar颜色elinewidth:errorbar线宽capsize:errorbar头部小横线的宽度errorevery:指定间隔。例如为3,则每3个点绘制一个errorbar一、误差棒概述plt.errorbar(x,y,yerr=None,xerr=None,ecolor=None,elinewidth=None,capsize=None,**kwargs)。代码1中参数yerr=0.15指定y轴方向的误差,上下误差默认是对称的,因此误差棒总长度为0.3。参数xerr指定x轴方向的误差。代码2演示了非对称误差的例子。#代码1x=np.linspace(0.1,0.8,10)y=np.exp(x)plt.errorbar(x,y,fmt="ro:",yerr=0.15,xerr=0.03) 二、绘制误差棒图#代码2x=np.linspace(0.1,0.8,10)y=np.exp(x)error=0.02+0.2*xlower_error=errorupper_error=0.4*error

#上误差小一些error_limit=[lower_error,upper_error]

#下误差和上误差plt.errorbar(x,y,yerr=error_limit,fmt=':*b',ecolor='y',elinewidth=4,ms=5,mfc='c',mec='r',capsize=6,capthick=2)

#非对称误差棒绘制带误差棒的柱状图,可使得柱状图反映的信息更加丰富。绘制带误差棒柱状图的关键是指定bar()函数中的参数yerr。同时,误差棒的属性由关键字参数error_kw指定,下图对误差棒的线宽、颜色和误差帽的长度做了设置。三、带误差棒的柱状图x=np.arange(7)y=[79,26,89,68,82,39,60]std_error=[7,3,2,2,3,2,6]label=['小米','魅族','华为P40','荣耀','华为nove','三星','苹果']#误差棒的格式参数error_attri=dict(elinewidth=2,ecolor='b',capsize=4)#带误差棒的柱状图

plt.bar(x,y,yerr=std_error,width=0.5,align='center',ecolor='r',color='cyan',error_kw=error_attri,tick_label=label) plt.ylabel('销售额(万元)')#刻度标签倾斜20度plt.xticks(rotation=20,fontsize=14) plt.grid(axis='y',ls=':',color='gray',alpha=0.5)plt.title('商场一季度手机销售额',fontsize=16) 与带误差棒的柱状图类似,在条形图函数barh()中也可以通过参数xerr设置误差。x=np.arange(6)y1=[100,68,79,61,72,56]std_err1=[7,2,6,5,5,3]y2=[120,75,70,78,85,80]std_err2=[5,1,4,8,9,2]tick_label=['计算机','财经','金融','工商管理','保险学','新媒体']bar_width=0.4error_attri=dict(elinewidth=2,ecolor='black',capsize=3)plt.barh(x,y1,bar_width,color='cyan',tick_label=tick_label,align='center',xerr=std_err1,error_kw=error_attri,label='广西')plt.barh(x+bar_width,y2,bar_width,color='m',tick_label=tick_label,align='center',xerr=std_err2,error_kw=error_attri,label='广东')plt.legend()plt.ylabel('图书类型',fontsize=14)plt.title('不同地区不同类型图书销量额(万元)',fontsize=16) 四、带误差棒的条形图数据分析中绘制等高线图的主要目的并不是画地图,而是用等高线及着色反映绘图区域内数值的变化情况。数据分析中的等高线图用于反映数值的变化,其本质就是绘制函数z=f(x,y)的变化。x和y是横纵坐标,通过函数映射得到z,将z值相等的各点连成平滑曲线投影到平面图形中。第4节

等高线图一、等高线图概述绘等高线图经常需要先使用np.meshgrid命令生成平面网格坐标。例如x可取值[0,1,2],y可取值[1,2,3,4],

命令“X,Y

=

np.meshgrid([0,1,2],[1,2,3,4])”将返回如下图所示的矩阵。这样X和Y两个矩阵配对,可表示这一平面范围内各点的(x,y)坐标,代入公式z=f(x,y)计算,可得到z。importnumpyasnpx=[0,1,2]y=[1,2,3,4]X,Y=np.meshgrid(x,y)函数contour()用于绘制等高线,contourf()用于填充区域颜色。一个等高线图的示例代码如下。二、绘制等高线图#1.定义函数z=f(x,y)deff(x,y):return(1-x/2+x**5+y**3)*np.exp(-x**2-y**2)#高度值#2.定义两个坐标的一维向量delta=0.25 #网格间距a=np.arange(-3.0,3.0,delta) #一维数组(长度24)b=np.arange(-2.5,2.5,delta) #一维数组(长度20)#3.获得网格坐标矩阵X,Y=np.meshgrid(a,b)#将向量a和b映射为网格,X和Y是二维网格矩阵,均为20行24列#4.画等高线c=plt.contour(X,Y,f(X,Y),10,colors='k')#5.在等高线旁标注数值plt.clabel(c,inline=True,fontsize=10)#6.填充颜色plt.contourf(X,Y,f(X,Y),3,cmap=plt.cm.spring,alpha=0.3)plt.axis('off') #不显示数轴等高线反映数值的变化,也可称为等值线。等值线可以直观的表示二元函数的变化趋势,例如在等值线密集的地方表示函数值在此区域变化较快。二、绘制等高线图deff(x,y,w=5,sigma=2):returnnp.sin(w*x)**2*np.sin(w*y)**2*np.exp((x+y)/sigma)n=256a=np.linspace(0,3,n)b=np.linspace(0,3,n)X,Y=np.meshgrid(a,b)C=plt.contour(X,Y,f(X,Y),8,colors='black')

#等高线plt.contourf(X,Y,f(X,Y),8,alpha=0.3)

#着色plt.clabel(C,fontsize=10)

#标注数值等高线图可用于机器学习算法中的决策区域绘制,contour()绘制决策边界线,contourf()给决策区域着色。例如,假定有一个分类问题已求解出分类的判断公式为y=2x1+x2+3,x1和x2是两组自变量。如果公式计算结果大于等于0则归为1类,计算结果小于0则归为-1类,绘制决策区域如下二、绘制等高线图deff(x1,x2):returnnp.where(2*x1+x2+3>=0,1,-1)n=300a=np.linspace(-3,3,n)b=np.linspace(-3,3,n)X,Y=np.meshgrid(a,b)C=plt.contour(X,Y,f(X,Y),colors='b') #f()只有1和-1两个值,将只绘制1条等高线plt.contourf(X,Y,f(X,Y),alpha=0.3) #整个区域只有两种值,着色后分为两部分plt.text(-2.8,-2,'y=-1负类',fontsize=16)plt.text(0.5,1,'y=1正类',fontsize=16)plt.text(-1,-0.9,'$y=2x1+x2+3$',fontsize=16) 绘制3D图表需要将Axes子图设为三维坐标系,主要有两种设置方法。一种是创建子图时指定参数projection='3d',另一种是先导入mpl_toolkits.mplot3d模块中的Axes3D对象,然后利用Axes3D对象将画布转为3D模式。第5节

3绘图D#

方法一、利用'3d'参数ax=plt.subplot(projection='3d') #创建子图时指定3d参数(d为小写字母)#

方法二、利用Axes3D类frommpl_toolkits.mplot3dimportAxes3Dfig=plt.gcf()

#获取当前画布figax=Axes3D(fig,auto_add_to_figure=False) #将fig转为3D,返回一个Axesfig.add_axes(ax) #将ax加入fig在3D空间绘制散点图也使用scatter()函数,在x轴和y轴坐标之后再添加z轴坐标,使用三元有序数对在3D空间内定位散点。一、3D散点图和3D折线图ax=plt.subplot(projection="3d") #创建3d子图xs=np.random.rand(100)*10 #随机数据点坐标ys=np.random.rand(100)*10+20zs1=np.random.rand(100)*10zs2=np.sqrt(xs**2+ys**2)#第一组3D散点图ax.scatter(xs,ys,zs=zs1,zdir="z",c="b",marker="D",s=40,alpha=0.5)#第二组3D散点图ax.scatter(xs,ys,zs=zs2,zdir="z",c="cyan",marker="*",s=40)ax.set_xlabel('X',fontsize=16) #设轴标签ax.set_ylabel('Y',fontsize=16)ax.set_zlabel('Z',fontsize=16) 一、3D散点图和3D折线图frommpl_toolkits.mplot3dimportAxes3D#导入Axes3Dz=np.linspace(0,13,1000)x=5*np.sin(z)y=5*np.cos(z)zd=13*np.random.random(100)xd=5*np.sin(zd)yd=5*np.cos(zd)fig=plt.figure(figsize=(8,6)) #新建画布#创建一个3DAxes,这是mpl3.5版的建议写法ax=Axes3D(fig,

auto_add_to_figure=False) fig.add_axes(ax) #将ax加入figax.plot3D(x,y,z,c='gray') #绘3D曲线ax.scatter3D(xd,yd,zd,c='purple')

#绘3D散点图 多组数据的柱状图可以在平面空间对比,也可在三维空间中对比。可以将多组数据的柱状图投射到平面上,投射时借助z轴将柱状图分层。以下代码在深轴方向上绘制了三排柱形,每排上都含有8根柱子,这样就产生了3D的效果,代码如下:二、3D柱状图np.random.seed(7)ax=plt.subplot(projection='3d')forzinrange(3):xs=range(1,9)ys=15*np.random.rand(8)ax.bar(xs,ys,zs=z,zdir='y') #3D柱状图zdir='y'zdir='x'说明:参数xs指定每排数据有八个柱体,参数ys表示每个柱体的高度。参数zdir取值不同,观察图形的角度也不同。如果设置zdir='x'的参数,则结果如右子图所示。事实上,从图形及对应的坐标轴刻度可以看出zdir的变化仅仅改变了观察图形的角度,并没有改变图形本身。3D曲面用于绘制函数z=f(x,y)的图形,其中(x,y)是坐标,z值视为高度。三维曲面可以按曲面高度涂上不同的颜色,还可添加颜色标尺,说明数值和颜色的对应关系。例如,假定在机器学习中定义了一个函数z(x,y)=x2+y2+x*y+x+y+1,这个函数的图像绘制如下:代码使用函数plot_surface(x,y,z,rstride=1,cstride=1)绘制3D曲面,x和y是坐标网格,z对应曲面高度。rstride和cstride参数控制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论