Python数据可视化 课件 07章Seaborn绘图库_第1页
Python数据可视化 课件 07章Seaborn绘图库_第2页
Python数据可视化 课件 07章Seaborn绘图库_第3页
Python数据可视化 课件 07章Seaborn绘图库_第4页
Python数据可视化 课件 07章Seaborn绘图库_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

Python数据可视化第7章Seaborn统计数据可视化教师:xxx2024.07第1节Seaborn简介第7章Seaborn统计数据可视化第2节

可视化分类数据第3节

可视化统计关系第4节

可视化变量分布第5节

其他方法本章介绍Python平台下另一最常用的绘图库Seaborn,在官网/上注明了Seaborn的目标就是实现统计数据可视化(statisticaldatavisualization)。该库提供了更精美的绘图效果和更方便快捷的数据可视化方法,目前最新版本是0.13.2(2024年07月)。新版和旧版在某些参数名上有变动,读者学习本章时请升级到新版(pipinstallseaborn==0.12.2)。其0.9版本的中文文档网址为

。本章代码在0.12.2版下测试通过,各代码段首部默认包含下述语句。为节省版面,后续代码段不再列出。第1节Seaborn简介importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassns #引入seaborn,按惯例命名为snsplt.rcParams['font.sans-serif']='SimHei' #设置中文字体plt.rcParams['axes.unicode_minus']=False #设置负号显示正常sns.__version__#0.12.2,查看seaborn版本一、Seaborn绘图特点Seaborn建立在Matplotlib基础之上,用很少的代码就可以实现精美的绘图效果,其改进主要体现在以下方面:1.Seaborn对原Matplotlib的很多方法和参数进行了包装,调用更加方便,并对图形进行了符合现代绘图风格的美化修饰。2.Seaborn绘图时可设置语义元素(hue),将不同类别的数据自动用多子图、不同颜色、不同符号进行区分,不需要额外编写代码控制。3.Seaborn可以对数据自动汇总计算并利用结果作图。例如对统计数据自动分类、求均值、计数,极大减少了用户的编码量。4.Seaborn和Pandas的DataFrame对象紧密集成,只需指定列名即可绘图。Seaborn的函数接口高度统一,可以由数个高级函数仅通过变动kind图形类型参数来调用低一级的绘图函数,诸如散点图、条形图、箱线图等都可以用同一条绘图命令设置不同的kind参数完成。注意:Seaborn不是用于取代matplotlib,很多绘图细节仍需借助plt进行设置,两者配合工作。Seaborn用于快速成图,plt用于设置图形细节。Seaborn的API参考链接:/api.html#categorical-api

。下面以titanic(泰坦尼克)数据集为例初步展示Seaborn绘图效果。Seaborn包含了若干示例数据,详见/mwaskom/seaborn-data,示例数据在使用时可实时下载。如因网络原因无法下载,可将本书资源中的seaborndata.rar内的所有.csv文件解压至某目录,在使用sns.load_dataset()读数据时指定该目录即可。本章主要使用其中的titanic、tips、iris和anscombe等数据集演示。本节代码见资源包

"07.1.ipynb"文件,可用该文件配合演示。绘制客舱平均生还率对比图如下:importseabornassns #设置绘图主题为ticks(白色背景、无网格线、有刻度线)sns.set_style('ticks') #从seaborndata子目录读取titanic文件,返回DataFrame数据框tit=sns.load_dataset('titanic',data_home='./seaborndata')sns.catplot(x='pclass',y='survived',kind='bar',data=tit)#右图二、绘图示例说明:(1)survived生还列,0未生还,1生还;pclass客舱等级列,有1、2、3三个等级。seaborn自动按x列分组,对每组的y列求均值。相当于y列先求所有1的和,再除以数据总条数得到平均生还率。1类舱旅客生还率最高。(2)柱状图上的小黑条是误差棒,表示数据的置信区间。(3)tit=pd.read_csv('./seaborndata/titanic.csv')#用pd读数据亦可上图只使用了一条catplot命令就完成了按客舱分类、均值计算和绘图的功能,由此可见Seaborn的高效。上面的命令在统计时没有区分性别,如果想按性别分类统计,可在命令中增加hue='sex'参数。hue在Seaborn中被称为语义,可视为类别区分,不同语义的数据自动用不同颜色表示,这样可将每类客舱中的男性和女性分开求平均生还率。ci=None表示不绘制误差条。下图可见女性生还率远高于男性。sns.catplot(x='pclass',y='survived',kind='bar',hue='sex',ci=None,data=tit)#左图,注意hue二、绘图示例改变kind参数可绘制不同类型的图形。绘制各客舱旅客的年龄箱线图如下:sns.catplot(x='pclass',y='age',kind='box',col='sex',data=tit)#右图,kind='box'箱线图,col参数(分列子图)如果kind='strip'(此为默认值)则绘制散点图,见左下图。绘制时每类客舱有很多旅客,Seaborn将旅客的年龄值分散显示,各散点尽量不相互覆盖,以便于观察点的分布。与之相对,如果用plt命令画年龄散点图,可以看到很多点是聚集在一起的,无法分辨,见右下图。sns.catplot(x='pclass',y='age',data=tit)#年龄散点图,左图,不设kind时默认为kind='strip'型散点plt.figure() #创建新画布plt.scatter(x=tit.pclass,y=tit.age)#右图,用plt命令绘散点图会重叠覆盖二、绘图示例主题是预定义的样式集合。Seaborn有五个预设主题:darkgrid、whitegrid、dark、white和ticks。darkgrid是默认主题,灰色背景带网格线。whitegrid白色背景带网格线,dark和white主题则无网格线。ticks主题是白色背景无网格线,但显示刻度标记。主题可用sns.set(style='样式名')或sns.set_style('样式名')切换。sns.set_style('darkgrid') #darkgrid主题。该主题是默认主题,因此亦可简写为sns.set()三、主题样式切换主题时会覆盖Matplotlib的参数,设置后sns和plt的绘图命令都会受主题影响。设主题时字体会改为英文字体,导致中文显示错误。因此设置后,应再执行plt.rcParams['font.sans-serif']='SimHei'语句重设中文字体。sns.set_style('ticks',{'font.sans-serif':'Simhei'})#或在设置主题时同时设置中文字体绘图命令执行后会自动设置坐标轴标签、图例和轴线。如需直接控制图形的四边轴线是否显示可使用sns.despine()命令,该命令应在绘图命令之后执行,默认将屏蔽顶部和右侧轴线,只显示底部和左侧轴线。x=np.linspace(-2*np.pi,2*np.pi,100)df=pd.DataFrame({'x':x,'y':np.sin(x)})#创建绘图所需的DataFrame对象sns.set_style('white')sns.relplot(x='x',y='y',data=df,kind='scatter')sns.despine(left=True,bottom=True) #所有轴线都不显示,True:屏蔽,False:显示,左图

sns.despine(top=False,bottom=False,left=False,right=False)#显示所有轴线,右图三、主题样式数据中包含很多类别(category)数据,例如性别、职称、质量等级等。在可视化时,通常需要按类别分类绘制对比图形,Seaborn绘制分类数据主要使用catplot()命令。本节代码见"07.2.ipynb"文件。第2节

可视化分类数据catplot()是一条高级命令,通过指定x或y参数为一个列名实现自动分类。常用参数如下表所示。一、catplot()命令总览参数名描

述参数名描

述x/yx或y轴数据列名(必须为字符串)row/col分行/分列子图(字符串列名)hue语义列(字符串)col_wrap每行最大子图数(整数)data数据源(必须参数且为DataFrame对象)ciNone:不绘制误差条order字符串列表,规定X轴的分类数据顺序kind图形类型(字符串)height子图高度(英寸)aspect子图的宽度/高度之比(浮点数)orient方向('v':垂直,'h':水平)palette调色板legendTrue显示图例,False不显示legend_out默认True:图例显示在外侧hue_order字符串列表,规定语义类别的顺序col_order字符串列表,规定按列生成子图的顺序seaborn绘图命令主要分为figure-level图级和axes-level轴级两类。图级命令通过设定kind参数调用低级的轴级命令完成实际绘图。下面两条命令完成的绘图效果基本相同,实际上就是catplot()图级命令通过kind='bar'的参数调用了低一级的barplot()轴级命令完成条形图绘制。一、catplot()命令总览sns.catplot(x='pclass',y='survived',hue='sex',kind='bar',ci=None,data=tit)#figure-levelsns.barplot(x='pclass',y='survived',hue='sex',ci=None,data=tit) #axes-levelsns.catplot(x='列名',y='列名',hue='语义列',col='列名',kind='图形类型',data=df)可设定的kind:kind='strip':默认参数,strip型散点图,调用sns.stripplot()完成kind='swarm':swarm型散点图,调用sns.swarmplot()完成kind='box':箱线图,调用sns.boxplot()完成kind='boxen':增强型箱线图,调用sns.boxenplot()完成kind='violin':小提琴图,调用sns.violinplot()完成kind='point':点图,调用sns.pointplot()完成kind='bar':条形图,调用sns.barplot()完成kind='count':条形计数图,调用sns.countplot()完成要注意的是catplot()图级命令必须含有data参数,且必须是DataFrame类型,x和y参数必须是列名字符串。图级命令支持kind(图形类型)、col(分列子图)、row(分行子图)、height(子图高度)和aspect(子图宽度高度之比)等参数,图级命令可产生多子图。对比下面两条命令。一、catplot()命令总览g=sns.catplot(x='pclass',y='age',kind='box',data=tit)

#正确g=sns.catplot(x=tit.pclass,y=tit.age,kind='box',data=tit)#错误,x/y参数类型错误,必须是字符串列名轴级命令(如stripplot()、boxplot()等)中的x和y参数可以是DataFrame数据框的字符串列名,也可以是列表或numpy数组,data参数不是必须的,支持hue参数,但不支持kind、col、row、height和aspect等和子图有关的参数,轴级命令返回的ax对象就是plt中的Axes类型。对比下面三条命令。ax=sns.boxplot(x=tit.pclass,y=tit.age) #正确,x/y参数可以是Series。返回对象为Axessns.boxplot(x='pclass',y='age',data=tit) #正确,x/y参数为字符串列名或数组均可sns.boxplot(x='pclass',y='age',col='sex',kind='box',data=tit)#错误,轴级命令不支持col和kind参数图级命令执行后的返回对象g的类型是axisgrid.FacetGrid,此类对象可包含若干图形单元格,是由多个子图构成的一种组合图形对象。g.fig属性得到的就是Matplotlib中的Figure对象,如有需要,可引用g.fig并利用plt命令进一步修饰图形。初步观察数据时最常使用散点图。分类散点图主要呈现某个类别中数据的聚集情况。下面以sns中最常用的tips小费数据集为例演示分类散点图。sns.catplot(x="day",y="total_bill",data=tips)#右图,默认kind='strip'二、分类散点图tips=sns.load_dataset('tips',

data_home='./seaborndata')

#加载tips数据集tips.sample(2) #随机抽取2条数据Out: total_bill tip sex smoker day time size106 20.49 4.06 Male Yes Sat Dinner 2125 29.80 4.20 Female No Thur Lunch 6数据集tips共7列,3个数值列和4个类别列,依次为total_bill(账单金额)、tip(小费)、sex(性别)、smoker(是否吸烟)、day(星期几,只含星期四/五/六/日)、time(用餐时段Dinner/Lunch)、size(用餐人数)。数据在x轴上按星期几分为4类,每类都有多笔账单金额,这些数据自动采用随机“抖动”以分散点的位置。如下轴级命令将产生类似的效果。sns.stripplot(x="day",y="total_bill",data=tips,jitter=0.1)参数jitter控制分散程度,值越大越分散。注意,分类散点图用于展示某类的数据点分布,x是类别变量,1个x值对应多个y值。如要展示x和y的一对一函数关系应使用7.3节介绍的relplot()命令。catplot命令还支持kind='swarm'型散点图,并支持col等多子图参数。如下命令中col='smoker'参数将数据分为吸烟和不吸烟两列子图,更便于分类观察。如将参数换成

row='smoker'则得到分行子图。sns.catplot(x="day",y="tip",kind="swarm",col="smoker",data=tips) #swarm型散点图,分列多子图二、分类散点图图中可见星期六/日的散点数明显比星期四/五多,小费金额也高一些。星期六有几笔小费金额最高。上面命令绘图时,"smoker=Yes"子图排在前面。如果想将"smoker=No"子图排在前面,可加入col_order参数指定分列时的子图顺序。图略,见代码文件。sns.catplot(x="day",y="tip",kind='swarm',col='smoker',col_order=["No","Yes"],data=tips)#指定列序二、分类散点图下面命令中order=["No","Yes"]指定在x轴上"No"非吸烟类数据排在前面。sns.catplot(x="smoker",y="tip",order=["No","Yes"],data=tips) #order指定x轴数据顺序g=sns.catplot(x="total_bill",y="day",kind="swarm",data=tips)#横向散点图print(type(g.ax)) #输出信息<class'matplotlib.axes._axes.Axes''>ax=g.ax #g.ax对应当前子图对象axesax.set_title('横向散点图示例',fontsize=16) #设置titleax.set_yticklabels(['星期四','星期五','星期六','星期日']) #设置y轴刻度标签有时可将命令中的x/y参数互换,将类别列指定为y轴以绘制出横向散点图,尤其适用于类别名称较长或类别数较多的情况。catplot()这类figure-level图级函数不能直接设定图形大小,只能设定子图的高度height和宽高比aspect,绘图时将根据子图数量自动设定图形大小。绘制后,各子图之间的间距还可用如下指令调整。sns.catplot(x="day",y="tip",col='smoker',row='time',data=tips,height=2,aspect=0.8)plt.subplots_adjust(wspace=0.5,hspace=0.3) #调整子图间水平和垂直间距,图略二、分类散点图上例中ax=ax参数指定stripplot()在已设定大小的ax上绘图,该参数仅适用轴级函数,对图级函数无效。如要精确控制图形大小,可将plt和axes-level轴级函数配合,如下所示。fig,ax=plt.subplots(figsize=(6,4)) #设定图形大小,图略sns.stripplot(x="day",y="tip",data=tips,ax=ax) #ax=ax,指定stripplot()在此ax上绘图另一种设置图形默认大小的方式是使用sns.set()命令,如下所示。设置后,plt函数和单独的轴级函数的图形尺寸以此设置为默认值。sns.set(rc={"figure.figsize":(6,4)}) #设置图形默认大小,影响axes-level级函数和plt函数catplot()支持两种箱线图,参数kind='box'绘制普通箱线图,调用boxplot()命令完成。参数kind='boxen'绘制增强箱线图,调用boxenplot()命令完成。sns.catplot(x="day",y="tip",kind='box',data=tips,height=4,aspect=1.2,palette='Set1')#左图,箱线图sns.catplot(x="day",y="tip",kind='boxen',data=tips,height=4,aspect=1.2) #右图,增强箱线图三、分类箱线图和小提琴图指令中x='day'将数据在x轴上按星期几分为4类。普通箱线图标注25%,50%,75%三个分位点,增强型箱线图在两端扩展,标注1/8、1/16、1/32等更多分位点,适合大数据集。设置kind='violin'参数可将箱线图和核概率密度图结合起来,构成小提琴图。小提琴图内部的细的黑色柱体是原来的箱体,中间的白点是中位数,外侧的曲线是概率密度曲线,两侧曲线是对称的。整个图形比较宽的区域表示此区域数据较密集,较窄的区域表示数据较稀疏。sns.catplot(x="day",y="tip",kind='violin',hue='smoker',data=tips,height=4,aspect=1.2)#小提琴图三、分类箱线图和小提琴图命令中如添加split=True参数,则将每个小提琴分为两半,左侧显示吸烟者核密度曲线,右侧显示非吸烟者核密度曲线,以更好地对比两者的密度分布。如上面右图所示。catplot()命令中参数kind='bar'绘制条形图,调用barplot()命令完成。g=sns.catplot(x="sex",y="survived",hue="class",kind="bar",data=tit,height=4,aspect=1.2,ci=None)ax=g.ax #返回当前子图forpinax.patches: #遍历图中所有条形,ha:水平居中,va:垂直底部对齐,'%.2f'2位小数

ax.text(p.get_x()+p.get_width()/2,p.get_height(),'%.2f'%p.get_height(),fontsize=12,color='blue',ha='center',va='bottom') #在条形上端标注数值ax.set_title('sex-pclasssurviedrate',fontsize=16)四、分类条形图上例计算并标注了每类客舱中男性/女性的平均生还率。先遍历ax.patches得到每个条形对象p,通过p.get_x()和p.get_height()得到每个条的x轴位置和y轴高度(y数值),再使用ax.text()将数值标注在条的顶部,p.get_x()+p.get_width()/2调整标注的x位置。相关计算和统计工作由Seaborn自动完成,由此见Seaborn特别适合统计类数据绘图。同时,应将Seaborn和Matplotlib配合以实现更精准的图形控制。将上面命令的参数改为kind='count',并删除y参数,可绘制计数条形图,统计每类客舱男女生还人数。g=sns.catplot(x="sex",hue="class",kind="count",data=tit,height=4,aspect=1.2,ci=None)ax=g.axforpinax.patches: #遍历图中所有条形,ax.text(x坐标,y坐标,y值,字号,颜色,…)ax.text(p.get_x()+p.get_width()/2,p.get_height(),p.get_height(),fontsize=12,color='blue',ha='center',va='bottom')ax.set_title('sex-pclasscount',fontsize=16) 四、分类条形图增加col='survived'参数则可分开统计每类客舱中男性/女性生还和未生还的人数。g=sns.catplot(x="sex",hue="class",kind="count",col='survived',data=tit,ci=None)forindex,axinenumerate(g.axes.ravel()): #ravel()将g.axes二维数组转为一维数组

ifindex==0:c='blue' #"生还"蓝色

title='Survived'else:c='red' #"未生还"红色

title='Notsurvived'forpinax.patches:#在条形顶端标注数值ax.text(p.get_x()+p.get_width()/2,p.get_height(),p.get_height(),fontsize=14,color=c,ha='center',va='bottom')ax.set_title(title,fontsize=16) 四、分类条形图catplot()命令参数kind='point'绘制点图,调用pointplot()命令完成。g=sns.catplot(x="sex",y="survived",hue="class",kind="point",data=tit,height=4,aspect=1.5)ax=g.axforindexin[0,2]: #只标注第0和第2根线。为避免数据覆盖,未标注第1根线

c=ax.collections[index] #ax.collections属性包含所有的线,按index序号取某根线

forpinc.get_offsets(): #每根线含首/尾两点,遍历时p代表一个点的(x,y)坐标

ax.annotate("%.2f"%p[1],(p[0]-0.15,p[1]))#p[0]:x坐标,p[1]:y坐标五、分类点图点图可反映数据在不同类别中的均值变化情况。右图按x="sex"分为两个大类,每类又按hue="class"分为3个小类,y="survived"参数将计算各类别的平均生还率。最上方的蓝色线(第0根)表示1类客舱中平均生还率由男性对应值0.37跃升到女性对应值0.97,中间的棕黄色线表示2类客舱中平均生还率由男性对应值0.14左右跃升到女性对应值0.9左右。点图体现了按sex和class分类后,每类数据的均值变化。本节讨论可视化数据集中的两个或多个变量间的相互关系。数据是纷繁复杂的,我们希望借助图形给出的提示帮助我们快速理清数据之间的关联(relevant)。本节介绍另一个常用的图级命令relplot(),其通过设定如下kind参数完成绘图。本节代码见"07.3.ipynb"文件。第3节

可视化统计关系kind="scatter":默认类型散点图,调用sns.scatterplot()完成kind="line":折线图,调用sns.lineplot()完成relplot()是一条图级命令,用于反映数据间的相关关系。下面绘制账单额和小费额散点图。tips=sns.load_dataset("tips",data_home='./seaborndata')sns.relplot(x="total_bill",y="tip",data=tips,kind="scatter",height=4,aspect=1.2) 一、relplot散点图图中可见小费额密集的区域在(2,4)之间,图形右上角的大额小费笔数很少。随着账单额的增加,小费的总体趋势也是增加的,两者是一种正相关关系。此散点图不同于7.2节的分类散点图,此散点图体现的是x和y之间一对一的关系。x='total_bill'有很多不同取值,此处的x不是类别数据。7.2节catplot()命令中的x和y是一对多关系,x是类别。实际使用时,这两种散点图应选择适用的场景。relplot()是一条功能强大的绘图命令,可对散点进行语义颜色、标记符号和大小的映射,体现出数据之间复杂的关联。执行下面的语句。sns.relplot(x="total_bill",y="tip",hue="smoker",style="sex",size="size",sizes=(60,120),col="time",data=tips)一、relplot散点图参数col="time"将数据分为午餐和晚餐2个子图,hue="smoker"将是否吸烟用两种颜色区分,style="sex"将男性和女性的点用不同形状区分,size="size"按就餐人数映射为不同大小的点,再加上x和y属性,上图中的每个点可以从6个属性进行区分。绘图时只需指定列名即可,不需要类似Matplotlib还要编码实现。与之对比,7.2节介绍的catplot()命令不支持style和size参数。relplot()是figure-level图级函数,支持col和row等子图参数。sns.relplot(x="total_bill",y="tip",col="day",col_wrap=2,data=tips,height=3) #左图sns.relplot(x="total_bill",y="tip",col="time",row="smoker",data=tips,height=3) #右图一、relplot散点图左图设置col="day"参数,星期四至星期日共4类,col_wrap=2参数指定每行2个子图,所以绘制出2行2列的子图。右图设置了col="time"和row="smoker",分别都是2种,因此也产生2行2列的子图。relplot()命令参数kind='line'绘制折线图,调用sns.lineplot()命令完成。折线图适合反映数据在某段时间或某个序列中的连续变化。x=np.linspace(-2*np.pi,2*np.pi,100)df=pd.DataFrame({'x':x,'y':np.sin(x)})sns.relplot(x='x',y='y',data=df,kind='line') #kind='line'折线图#sns.lineplot(x='x',y='y',data=df) #效果同上,使用轴级函数sns.lineplot()二、relplot折线图np.random.seed(7) x=np.repeat(np.arange(40),20) #产生000..111…393939序列a=np.random.uniform(9.1,9.7,size=x.size) #A产品数据b=np.random.uniform(8.5,9.2,size=x.size)#B产品数据pid=['A']*x.size+['B']*x.size #产品类型AAA…BBBdf=pd.DataFrame({'x':np.concatenate((x,x)),'y':np.concatenate((a,b)),'pid':pid})#df含xypid三列

sns.relplot(x='x',y='y',hue='pid',data=df,kind='line',height=4,aspect=2)二、relplot折线图上面指令通过hue='pid'语义将数据分为A/B两组。每种产品每天的数据有20个,sns自动计算每天的数据均值,此处的折线实际上由数据的均值点构成。折线两侧的阴影表示的是均值在95%置信区间的取值范围。上页代码中x和y是一对一关系,这种简单折线图还无法体现Seaborn折线图的特色。日常很多统计和实验数据中x和y是一对多的关系。例如连续若干天的实验数据,而每天的实验数据又包含多个观测值。下面模拟一个实验数据集,包含A、B两种产品,每个产品含40天数据,每天数据由20个随机值构成。Seaborn数据集一般应为长(long)数据集,有的书中也称为整洁(tidy)格式,不应采用宽(wide)格式。例如上面的实验数据,A和B的数据应纵向连接,而不应横向连接。数据列应组织为['x','y','pid']的形式,而不应组织为['x','A','B']的形式。长格式才便于指定hue、style、col和row等分类参数。绘图时,宽数据集可使用Pandas的melt命令转换为长数据集,如下所示。三、长-宽数据集np.random.seed(7) x=np.repeat(np.arange(40),20) #产生000..111…393939序列a=np.random.uniform(9.1,9.7,size=x.size) #A数据b=np.random.uniform(8.5,9.2,size=x.size) #B数据dfw=pd.DataFrame({'x':x,'A':a,'B':b}) #dfw是宽数据集,有'x','A','B'三列df2=pd.melt(dfw,id_vars=['x'],value_vars=['A','B'],var_name='pid',value_name='y')#转为长数据集

pd.melt命令中,id_vars参数对应数据集中不需要转换的列,value_vars参数对应需要转换的列,var_name是转换后的类型列的新列名,value_name是转换后数值列的新列名。宽转长时,将要转换的列依次取出,以“不转换的列的值+转换列的列名+转换列的值”的形式构成新的一行,在纵向不断插入新行。dfw原有800行数据,转为长格式df2后有1600行数据。反映变量的分布情况是统计数据绘图中很重要的一类可视化任务。本节代码见"07.4.ipynb"文件。第4节

可视化变量分布一、distplot单变量分布单变量分布聚焦于考察一个变量的分布(distribution)情况,前面章节介绍的plt.hist()命令绘制单变量分布直方图。在Seaborn中,使用distplot()命令可视化单变量分布,参数如下表所示。参数名描

述参数名描

述a单变量数据序列fit_kws密度曲线字典参数bins直方图分组数(整数)color颜色hist默认值True,显示直方图vertical默认值False,变量值在x轴上kde默认值True,显示密度曲线norm_histTrue时直方图显示频率而不是频数rug默认值False,不显示地毯图axlabelx轴标签(如为False则不显示)hist_kws直方图字典参数label图例字符串rug_kws地毯图字典参数ax指定绘制在某个axes上下面考察tips数据集中tip列的分布情况。distplot()默认显示hist直方图和kde核密度曲线,如设置rug=True参数,还将在底部轴线上显示地毯图,如下图所示。图形显示小费数据主要集中在(2,4)区间段,(8,10)区间的高额小费很少。注:本教材付印时distplot命令在新版seaborn中将逐步废弃,不推荐使用。推荐使用displot()这一图级函数。一、distplot单变量分布tips=sns.load_dataset('tips',data_home='./seaborndata')sns.distplot(a=tips.tip,rug=True)#默认会显示hist和kde,rug=True增加地毯图显示

底部轴线上的地毯图小黑线标注了数据出现的位置,线条的密度表现了该区域数据的密集程度。图形中的直方图和密度曲线可分别通过hist和kde参数控制是否显示。如设置kde=False则不显示密度曲线,此时y轴也变为频数,而不是频率。distplot()是一个axes-level轴级函数,用于绘制单变量分布,因此没有x、y和data参数。数据参数只有一个a参数,传入一个数组。直方图还可通过bins参数设定分组的数目。绘制单变量概率密度曲线还可使用kdeplot()命令,该命令只绘制密度曲线,不绘制直方图,但包含很多密度曲线的调整参数。sns.kdeplot(tips.tip,shade=True) #shade=True密度曲线下面填充阴影,左图sns.kdeplot(tips.tip,cumulative=True) #cumulative=True累积密度曲线,右图一、distplot单变量分布双变量分布考察两个变量间的概率密度分布关系,例如广告费和销售额的关系,身高和体重的关系。可视化双变量分布可使用kdeplot()命令(kerneldensityestimation核密度估计),常用参数如下表所示。二、kdeplot双变量分布参数名描

述参数名描

述x第1个变量序列label图例y第2个变量序列color密度曲线颜色shadeFalse,不显示填充阴影legend默认值True,显示图例verticalFalse,单变量时数值对应在x轴上cumulative默认False,不累计密度曲线(适用单变量)kernel密度曲线核(默认高斯核gau)cbarFalse,双变量时设为True显示颜色映射条bw密度曲线带宽cbar_kwscbar字典参数n_levels等高线图的轮廓数(适用双变量)ax绘制在某个axes上kdeplot()命令如只提供一个数值序列则绘制单变量分布(如7.4.1节所示),提供两个数值序列则绘制双变量分布。上面的参数表要注意区分是针对单变量还是双变量。注意,新的0.12版中该命令的形参名是x和y,旧版中的形参名是data和data2,不兼容。双变量概率密度曲线绘制的结果是一个等高线图,等高线的中心区域是两个变量联合概率密度分布最密集的区域,越往外侧则密度越低。下面左图反映单笔账单金额注意集中在(8,20)区域,单笔小费集中在(1.5,4)区域。二、kdeplot双变量分布tips=sns.load_dataset('tips',data_home='./seaborndata')sns.kdeplot(data=tips,x='total_bill',y='tip')#左图,账单额和小费额联合分布sns.kdeplot(data=tips,x='total_bill',y='tip',shade=True,cbar=True)#右图,阴影并显示颜色映射条

绘双变量图时如设置shade=True添加阴影,此时就变成类似热力图的形式,通过颜色深浅反映密度值。双变量分布可视化的另一常用命令是jointplot(),命令参数如下表所示。三、jointplot双变量分布参数名描

述参数名描

述x/y两个变量序列(字符串或数组形式)kwargs绘图字典参数data可选参数,应为DataFramecolor颜色kind图形类型(scatter/kde/hex/reg/resid)dropna如为True则移除x和y中的缺失值height图形高度(此图为正方形)space中心和侧边轴的间隔(浮点数)ratio中心轴高度与侧边轴高度之比(小数)

jointplot()默认将绘制两个变量的散点图和各自的直方图,并将三个图形结合在一起,如下图所示。图形中间是散点图,上侧是x变量直方图,右侧是y变量直方图。该命令不是图级函数,也不是轴级函数,绘图后返回的对象类型是seaborn.axisgrid.JointGrid。三、jointplot双变量分布g=sns.jointplot(x='total_bill',y='tip',data=tips)print(type(g)) #返回的对象类型是<class'seaborn.axisgrid.JointGrid'>jointplot()命令支持5种kind,默认值kind="scatter"表示中间的图形绘制散点图。kind='kde'绘制等高线密度曲线,kind='hex'绘制六边型密度图,kind='reg'绘制回归线图,kind='resid'绘制残差图。kind='kde'绘制等高线密度曲线。如果图中的散点很密集,此时可选择kind='hex'六边形图。这种图是直方图的一种变体,在图中划分六边形,计算落入其中的散点数目,点数越多颜色越深。三、jointplot双变量分布sns.jointplot(x='total_bill',y='tip',kind='kde',data=tips)#kind='kde'绘制密度曲线,左图sns.jointplot(x='total_bill',y='tip',kind='hex',data=tips)#hex六边形图,右图因为账单金额total_bill和小费tip很明显有正相关关系,通过kind='reg'参数可绘制一条线性回归直线。三、jointplot双变量分布sns.jointplot(x='total_bill',y='tip',kind='reg',data=tips)#kind='reg'回归线图,左图sns.jointplot(x='total_bill',y='tip',kind='resid',data=tips)#kind='resid'残差图,右图设置kind='resid'可绘制出在此回归线下的残差,即回归值和真实值之间的差值,如右图所示。残差图中的y轴不再是小费,而是误差值。图中间是代表误差值为0的细线,图左侧可见小额账单和小费对应的误差值较小,距离0线较近;图右侧区域大额账单和小费对应的误差值较大,偏离0线较多,说明这条回归直线在账单金额较小时预测较好,但大额情况下表现较差。前面小节绘制了一对数据的可视化图形,如果有多对数据要交叉比较,可使用pairplot()命令。下面以鸢尾花iris数据集为例,该数据集有150条记录,共三种鸢尾花。每条数据包含花萼(sepal)长度、宽度,花瓣(petal)长度、宽度4个特征值,加上花的类型共5个数据项。现在将花的4个特征值两两成对比较。四、pairplot绘制数据集成对关系iris=sns.load_dataset('iris',data_home='./seaborndata') sns.pairplot(iris,hue='species',markers=["^","v","o"])#散点图矩阵4个特征值列,两两比较,产生16个子图。对角线上是某个特征值和自己比较,同时又加入了hue='species'语义,因此对角线上就绘制每个特征值三类花的密度曲线。非对角线上的子图就绘制某特征值和另外三个特征值两两配对的散点图。markers=["^","v","o"]参数为三类花指定不同的散点形状。图中蓝色点(上三角形)代表的setosa类花和另外两种花基本可以区分开。另两种花中大部分的点可以区分,但有少量点混杂在一起。这样的图可快速选择最相关的特征或供机器学习辅助选择适合的特征值。回归分析(regressionanalysis)是数据分析中的一种重要方法,回归分析试图找出自变量和因变量之间的函数关系。Seaborn提供了regplot()和lmplot()两个命令来解决回归分析的可视化问题。其中,前者是轴级函数,后者是图级函数。五、回归分析tips=sns.load_dataset("tips",data_home='./seaborndata')sns.regplot(x="total_bill",y="tip",data=tips)#账单额和小费间的回归分析左图中绘制了一条回归直线,反映账单金额和小费之间的回归关系。直线两侧的阴影表示此回归方程下y的95%置信区间范围,即均值有95%概率落在该区间内。下面再以统计学中有名的anscombe四重奏数据集为例继续讨论回归分析。该数据集含4组数据,每组11条,每组中的x和y值不尽相同,但通过精心构造,这4组数据x和y的均值和标准差均相同。五、回归分析anscombe=sns.load_dataset('anscombe',data_home='./seaborndata')#四重奏数据集sns.lmplot(x='x',y='y',data=anscombe,col='dataset',col_wrap=2,height=3,aspect=1.2)数据集4组数据的组编号为I、II、III和IV。regplot()是轴级函数,不能设置col参数,无法自动分类。要同时分组画出四类数据集,可选择lmplot()这个图级函数。该示例表明在研究数据时不可尽信统计值,这4组数据虽然均值和标准差一样,但实际上差别巨大,这个例子也说明了数据可视化的重要性。(见下页)至此,我们学习了catplot、relplot和lmplot这三条图级命令。掌握这三条命令并配合kind参数,绘图将非常快捷。新版seaborn中又增加了displot()这一图级函数。#检查每组的均值和标准差是否相同,applymap保留2位小数anscombe.groupby('dataset').agg([('均值',np.mean),('标准差',np.var)]).applymap(lambdax:'%.2f'%x)下面左图可见四组数据明显不同。第I组数据点比较均匀地分布在回归直线两侧,回归效果较好。第II组数据点明显对应二次曲线,但用线性一次回归,效果很差。第III组最上方有一个离群点,该点导致回归直线向上偏移。第IV组数据10个点的x值相同,只有一个点的x值不同,因为x值相同,该组数据不适用回归分析。第II组数据从散点图上看是二次曲线,可增加order=2的参数按二次曲线回归。第III组数据有一个异常点,导致回归直线向上偏移,设置robust=True和ci=None参数,表示采用健壮回归,回归时剔除异常值的影响。五、回归分析sns.regplot(x='x',y='y',data=anscombe.query('dataset=="II"'),order=2,label='dataIIorder=2')#中图,二次曲线sns.regplot(x='x',y='y',data=anscombe.query('dataset=="III"'),robust=True,ci=None)#右图,健壮回归本节介绍sns中使用调色版、颜色和热力图等命令。本节代码见"07.5.ipynb"文件。第5节

其他方法一、设置调色板Seaborn提供了一系列的颜色管理工具帮助使用者选择最优的配色方案。color_palette()用于生成调色板。参数palette是配色方案名或其它颜色表达形式。n_colors指定调色板中的颜色数目,默认值6。desat和色彩饱和度有关,取值范围0~1,默认值1对应的颜色最深。不提供参数时,该函数返回当前调色板。pal=sns.color_palette(palette=None,n_colors=None,desat=None)#生成调色板palplot()显示调色板,参数pal是要显示的调色板对象,size是色块大小。sns.palplot(pal,size=1)#显示调色版set_palette()将palette设置为当前调色板,设置后所有的绘图命令都受此调色板的影响。sns.set_palette(palette,n_colors=None,desat=None)#将palette设为当前使用的调色板一、设置调色板下面输出观察默认调色板。sns.set() #此时默认主题为darkgrid,默认调色板为deepcur_palette=sns.color_palette() #color_palette()不带参数时,返回当前调色板deepprint(cur_palette) #调色板其实是由RGB元组构成的列表sns.palplot(cur_palette) #显示deep调色板,有10种颜色如果使用plt命令绘制多根线条,不指定线条颜色,则各线条颜色就从默认调色板中依次选择。plt和Seaborn的颜色都受当前调色板的控制。调色板内容较多,请读者在jupyternotebook中运行本节配套的示例代码。dfa=pd.DataFrame({'x':range(1,11),'y':range(4,14)})#共10个数sns.barplot(x='x',y='y',data=dfa) #10个条形默认选用当前调色板中的10种颜色

如绘图时所需颜色超过默认的10种且未指定调色板,此时Seaborn会弃用当前调色板,自动选用一种渐变调色板以区分众多的条形。一、设置调色板调色板可以先用color_palette()函数创建,然后在绘图命令中引用,也可用set_palette()命令设置为全局调色板,示例如下。pal=sns.color_palette("Blues",6) #自定义含6个渐变色(由浅到深)的Blues调色板palsns.barplot(x='x',y='y',data=dfa,palette=pal)#引用pal调色板,dfa数据框见上页定义。下图所示sns.set_palette(pal) #设置pal为全局调色板plt.plot([1,2],[3,4],[2,2],[3,5]) #绘2根线条,颜色受pal调色板控制。图略一、设置调色板Seaborn预定义了140余种配色方案(在配套代码文件中已列出),同时还支持RGB颜色和HTML网页颜色。常用的调色板配色方案有:Set1、Set2、Set3、cool、spring、summer、autumn、winter、Blues、Greens、Oranges、cubehelix、Paired、gnuplot2、hls、husl、deep和bright等。在官方文档中,将调色板大致分为三类:分类型(qualitative)、顺序型(sequential)和发散型(diverging)。palstyle=['deep','muted','pastel','bright','dark','colorblind'] #输出6个默认分类调色板forpalinpalstyle:print(pal)sns.palplot(sns.color_palette(pal))(一)分类型调色板当数据没有明显地主次或重点非重点区分时,适合使用分类型调色板。例如tips中的吸烟和非吸烟者、午餐和晚餐,鸢尾花中的三类花等。分类色板只需用对比鲜明的颜色将数据区分开即可。1.6个默认的分类调色板上述6个调色板每个包含10种颜色。每次执行sns.set_style()切换主题后,默认的调色板会重设为deep。deep色板较深,pastel色板饱和度较低,bright颜色最亮,colorblind对色弱人士最友好。一、设置调色板pal=sns.color_palette("hls",15,desat=.9) #.9代表0.9饱和度,15种sns.palplot(pal)2.hls和husl分类调色板另一种常用的分类色板是hls,这是一种简单的RGB颜色变体。上面的命令创建并显示了内含15种颜色的hls色板。desat是饱和度,取值0~1,默认值1对应颜色最深。颜色设置中"0.9"常简写为".9"。hls的意思就是色度、亮度和饱和度。Seaborn还提供了一个husl色板,使颜色、亮度和饱和度的间隔更加均匀,如下所示。pal=sns.palplot(sns.color_palette("husl",8))#husl色板

sns.palplot(pal)一、设置调色板sns.set_style('ticks',rc={'font.sans-serif':'Simhei'})city=pd.DataFrame({'城市':['株洲','长沙','洛阳','郑州','珠海','广州'],'数值':range(10,16)})pal=sns.color_palette("Paired",6) #用Paired配对色板生成含3对6个颜色值的色板sns.barplot(x='城市',y='数值',data=city,palette=pal) #指定pal调色板3.Paired配对调色板分类色板中还有一种Paired配对色板,用来强调一对一对的数据。例如现有6个城市,每2个城市来自同一个省。下图中来自同一省份的2个城市会用同一色系的深浅两种颜色绘制,体现城市之间的内在关联。一、设置调色板palstyle=['cool','spring','summer'] #三种预定义的顺序调色板forpalinpalstyle:print(pal)sns.palplot(sns.color_palette(pal))#每个调色板内含6种颜色(二)顺序型调色板当要展示的数据有主次或重点非重点区分时,适合使用顺序调色板。该类调色板一般色调变化幅度较小,但亮度和饱和度变化较大,生成同一色系或相近色系由明到暗或由暗到明的颜色,适合对应数据由不重要到重要的变化,将人们的注意力自然吸引到数据中相对重要的部分。例如等高线密度曲线图的中心使用深色,边缘使用浅色以体现密度变化。表示疫情数据时,严重的地区用深色表示,不严重的地区用浅色表示。更多内容详见配套代码文件。一、设置调色板sns.palplot(sns.color_palette("BrBG",7)) #两个发散型调色板,颜色数一般为奇数sns.palplot(sns.color_palette("RdBu",7)) (三)发散型调色板当数据集的低值和高值都很重要,且数据集有明确定义的中心点时,可选择使用发散型调色板。此类调色板的中间颜色最淡(深),向两端颜色逐渐加深(变浅),两端的颜色具有相似的亮度和饱和度。例如,使用此类调色板可以很好地展示温度相对于基准温度0的上升或下降。二、set_context设置上下文参数sns.set_context() #省略参数时默认上下文是notebooksns.set_context("talk") #设为talk,文字和线条默认是notebook的1.3倍sns.set_context("poster") #设为poster,文字和线条默认是notebook的1.6

温馨提示

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

评论

0/150

提交评论