版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python数据可视化第9章
Poltly交互可视化库教师:xxx2024.07第1节Poltly概述第9章
Poltly交互可视化库第2节基本图形第3节新式图形第4节统计类图形与地图前面章节介绍了Matplotlib、Seaborn和Pyecharts三个可视化库。Matplotlib历史久远,使用广泛,它可以对图形做精细控制,但设置命令较繁琐,图形类型有限;Seaborn用于统计数据绘图,支持语义着色,可自动生成分类多子图,两者绘制的都是静态图片。Pyecharts生成动态交互网页,可绘制诸如漏斗图、树图和地图等新颖图形,但不支持Numpy和Pandas的数据类型。Poltly集成了上述软件的优点,生成动态网页交互图形,支持Pandas数据结构,支持类似Seaborn的统计绘图,可以说Poltly是目前Python平台下功能最强大的可视化库。第1节Poltly概述本章代码在plotly5.9版下测试通过。本节代码见"09.1.ipynb"文件。各代码段首部默认含有以下语句,后续部分代码段为节省空间不再列出下列语句。Poltly支持多种编程语言接口,例如Python、R和JavaScript等,这些接口都基于poltly.js库,而poltly.js又基于d3.js这个最强大的JavaScript可视化库。本章介绍的是其中针对Python接口的部分。在Anaconda平台中已包含poltly,如需升级可在命令行上执行pipinstall-Upoltly。其官网为/python。该库目前中文资料较少,学习主要依靠其完备的英文在线文档。importnumpyasnpimportpandasaspdimportplotly.expressaspx #引入plotly的px接口importplotly.graph_objectsasgo #引入plotly的go接口(一)绘图示例Poltly产生的图形是交互网页,代码应在jupyternotebook中运行。下面是简单柱状图示例。importpandasaspdimportplotly.expressaspx #引入px接口df=pd.DataFrame({"x":["A","B","C"],"y1":[4,1,2],"y2":[2,4,5]}) #构造数据框fig=px.bar(df,x="x",y=["y1","y2"],barmode="group") #利用px和df生成簇状柱形图fig.update_layout(width=500,height=360,title="Bar图") #设置图形宽、高、标题fig.show() #默认在notebook中显示图形一、Poltly简介点击图例"y1y2"或移动鼠标可观察到图形变换。右图只显示了“y1”,隐藏了“y2”。图形可以在notebook中显示,也可生成网页再显示,如下所示。生成的网页文件较大,约有3M,这是因为其中直接包含了所需的javascript可视化库。fig.write_html("bar1.html",auto_open=True) #生成网页bar1.html并弹出浏览器显示一、Poltly简介(二)代码格式Poltly的版本迭代较快,不同版本的代码格式变化较大。以前3.x版包含线上和线下两种模式,线上模式将代码放在plotly云端运行。代码如要在线下运行需写为plotly.offline的形式。2019年7月发布的4.0版做了重大改变,将线上模式剥离,单独放在chartstudio库中,plotly仅保留线下模式。读者参考网上代码时,含有offline字样的是旧版3.x格式,不要采用旧格式。4.0版提供了express高级接口,使图形生成更简洁。目前5.x版代码主要使用plotly.graph_objects和plotly.express这两个接口,后者是高级接口,对前者进行了再包装。有少量图形会使用第三种接口plotly.figure_factory创建。接上页:Plotly支持多种图形构造方法,目前官方推荐使用plotly.express接口。导入接口后命名为px,接口支持直接使用Pandas的DataFrame对象。上例在px.bar()中使用df数据框,指定x轴对应“x”列,y轴对应“y1,y2”两列,这种语法类似seaborn。柱状图模式为“group”簇状图,如不设置则产生堆叠图。fig.update_layout()是后续学习中常见的命令,用于修改图形外观。下面的代码使用较低级的go接口重写了上例的柱状图,代码关键之处是go.Figure()。此处将生成一个图形对象,创建时通过“data=[bar1,bar2]”加入两个Bar对象,这表明plotly是通过Figure对象组织图形的。importplotly.graph_objectsasgo #引入graph_objects命名为gox=["A","B","C"]bar1=go.Bar(x=x,y=[4,1,2],name="y1") #先创建bar1对象,name是图例bar2=go.Bar(x=x,y=[2,4,5],name="y2") #bar2对象fig=go.Figure(data=[bar1,bar2]) #创建Figure对象时加入bar1,bar2fig.update_layout(width=500,height=360,title="Bar图",barmode="group")#宽、高、标题、group组模式fig.show() #图略,图形和上例柱状图一样一、Poltly简介有时我们还会看到如下写法:x=["A","B","C"]bar1=go.Bar(x=x,y=[4,1,2],name="y1")fig=go.Figure(data=bar1) #创建Figure并加入bar1fig.add_trace(go.Bar(x=x,y=[2,4,5],name="y2")) #用add_trace()再添加一个Barfig.update_layout(width=500,height=360,title="Bar图",barmode="group")fig.show() #图略,图形和上例柱状图一样在一个Figure中可添加多个trace,例如柱状图、折线图等,这样可将不同的图形组合在一起,这是Plotly和其它可视化库在管理多图形对象上存在较大差异的地方。Figure对象很重要,所有操作都依赖于此。代码fig=px.bar()利用px接口产生的fig变量也是Figure对象,只是创建更方便,代码更精简。一、Poltly简介(三)
作图步骤(概括为如下5步)(1).准备数据。Poltly支持列表、元组及Numpy和Pandas中的数据类型。一般可用Pandas处理数据,然后将DataFrame传递给绘图函数作图。(2).创建Figure对象,利用px或go接口均可。importplotly.expressaspx fig=px.bar(x=["A","B"],y=[3,5]) #利用px接口创建Figure类型的对象figimportplotly.graph_objectsasgofig=go.Figure() #利用go接口创建空白Figure(3).添加图形子对象bar1=go.Bar(x=["A","B"],y=[4,2],name="y1") #先创建bar1,bar1可视为tracefig.add_trace(bar1) #再在fig中添加bar1fig.add_trace(go.Bar(x=["A","B"],y=[2,3],name="y2")) #或直接添加一个Bar接上页:上述加入的对象被视为trace轨迹,可以用update_traces()修改。下面的命令设置了fig内所有柱体的颜色、柱体边线颜色、边线宽度和整个图形的不透明度opacity,opacity为0~1间的小数,取1时颜色最深。一、Poltly简介(4).设置图形layout,update_layout()可集中设置多个参数,不像Matplotlib需使用多条命令分设各个参数。fig.update_traces(marker_color='#FFFF00',marker_line_color='rgb(8,48,107)',marker_line_width=1.5,opacity=0.6) #颜色用HTML格式或rgb格式均可(5).输出图形fig.update_layout(width=500,height=360,title="Bar图",barmode="group")#宽、高、标题、模式fig.show() #默认在notebook中显示fig.write_html('网页.html',auto_open=True) #或在浏览器中显示网页Plotly支持多种渲染输出环境,还可输出为图片或PDF,详见教材和官网。学习Plotly主要通过阅读官方文档,读者可先查看/python/首页的“Fundamentals”部分。其中“TheFigureDataStructure”解释了图形对象的内部数据结构。Figure对象可近似认为是一个嵌套字典,对象以json格式包装在网页中。下面创建一个Figure对象并输出内部结构。二、图形对象的数据结构Figure({'data':[{'alignmentgroup':'True','marker':{'color':'#636efa'},'name':'','orientation':'v','showlegend':False,'textposition':'auto','type':'bar','x':array(['A','B'],dtype=object),'xaxis':'x','y':array([3,5]),'yaxis':'y'},{'name':'y2','type':'bar','x':['A','B'],'y':[2,3]}],'layout':{'barmode':'relative','height':400,'legend':{'tracegroupgap':0},'template':'...','width':600,'xaxis':{'anchor':'y','domain':[0.0,1.0],'title':{'text':'x'}},'yaxis':{'anchor':'x','domain':[0.0,1.0],'title':{'text':'y'}}}})importplotly.expressaspxfig=px.bar(x=["A","B"],y=[3,5],width=600,height=400) #创建内含一个Bar的Figurefig.add_trace(go.Bar(x=["A","B"],y=[2,3],name="y2")) #再添加一个Barprint(fig) #输出fig对象的内部结构,如下所示Figure内有三个顶级数据属性:data、layout和frames。data是列表,内含各个trace子轨迹,例如“fig=px.bar()”先创建了一个bar,后续用add_trace()添加了一个bar,因此data列表中含两个柱状图。layout包含窗口参数,例如宽度、高度和标题。图形设置主要就是设置data和layout属性。要注意区分Figure和trace,只有Figure对象具有上述属性,可以设置标题等内容,trace对象没有这些属性。第三个顶级属性frames只在动画图形中出现,代表帧,本例未包含。Figure对象内部的数据是多层嵌套字典,plotly提供了称之为魔术下划线(magicunderscore)的表达形式,用“_”下划线将字典各层连接起来作为形参名,这样参数名很简洁,不用表达为多层嵌套字典。设置时也可以直接设置属性的值,读者可对比下面三行效果相同的命令。二、图形对象的数据结构fig.update_layout(xaxis_title_font_size=20) #设置X轴标签文字大小,采用魔术下划线语法fig.update_layout(xaxis=dict(title=dict(font=dict(size=20)))) #功能同上,使用嵌套字典语法,很繁琐fig.layout.xaxis.title.font.size=20 #功能同上,使用属性直接设置fig.data[0].name="y1" #将上例中的第0个Bar命名为y1,name即图例fig.data[0].showlegend=True #True显示图例fig.layout.barmode="group" #柱状图由默认的relative改为group(簇状)#下面两条命令等效,配置时直接修改字典或用update_layout()修改均可fig.layout.title="标题"fig.update_layout(title="标题")接上页:了解Figure的内部结构有助于理解各种图形设置命令,设置图形时常常设置data和layout属性。表9.1中某些图形被同时归入多个类别,有些图形绘图效果相似,只是命令名不同。官网有各种图形的详尽示例,一般先给出px接口编码,再给出go接口编码。“FigureReference”页面详细解释了图形函数的参数。三、图形类型importplotly.ioaspioprint(pio.templates) #显示所有模板名pio.templates.default="plotly_white" #设置为默认模板plotly.graph_objects接口(简称go)内含40余种图形,plotly.express接口(简称px)对go接口进行了再包装,支持其中绝大多数类型。Plotly官方建议首选使用px接口,对于px不支持的图形类型才使用go接口,例如某些3D图形。教材表9.1列出了当前版本支持的大多数图形类型。四、模板和配置每个可视化库都可以设置主题风格,Plotly中的主题(theme)也被称为模板(template)。模板除具有传统主题的功能,还兼具一些自定义内容,例如图形大小、图形水印等。执行下面的命令可显示Plotly中的所有模板。系统常用模板有:plotly、ggplot2、seaborn、simple_white、plotly_white、plotly_dark和none等。默认使用“plotly”模板,如设为“none”则禁用模板。绘图时选用模板示例如下。fig=px.line(x=[1,2,3],y=[3,6,5],template='ggplot2') #选用ggplot2模板importplotly.graph_objectsasgomytpl=dict(layout=go.Layout(title="标题",title_font_size=20,width=400,height=300))mytpl2=dict(layout_title="标题",layout_title_font_size=20,layout_width=400,layout_height=300)四、模板和配置模板对象的类型是Template类,Template类又是从plotly.graph_objects.layout类派生的。该类对象拥有layout和data这两个顶级属性,设置这两个属性即可自定义模板。自定义模板示例如下。上面两条语句定义了两个同样效果的模板mytpl和mytpl2,都包含了标题、标题字号、图形宽度和高度的定义。fig=px.line(x=[1,2,3],y=[3,6,5],template=mytpl2) #使用自定义模板mytpl2fig.show() #左下图
该模板代码见"09.1.ipynb"。importplotly.expressaspxx=np.random.random(50)y=np.random.random(50)fig=px.scatter(x=x,y=y) #散点图config={'displayModeBar':True,'scrollZoom':True} #配置:显示工具箱,滚动缩放fig.show(config=config) #输出时可设置config配置四、模板和配置除了模板设置,在图形输出时还可定义config配置项,设定图形的显示方式,如下所示。图形原本默认只有当鼠标移到图形上时才显示工具箱,经过上面的config配置,就将一直显示工具箱,同时还支持鼠标滚轮滚动缩放图形。更多设置参考官网如下链接:设置字体/标题/图例/轴标签
设置图形大小子图
坐标轴
图例legend配置图形对象
提示框信息(hovertext)设置坐标轴刻度
点和线的样式本节介绍几种读者熟悉的基本图形,借此说明Poltly的一些常用设置参数和方法。某些图形会分别给出go和px接口的示例,读者可对比两种接口的异同。第2节基本图形散点图是常见的二维图形,用go或px接口均可创建。两个接口的函数名有大小写上的差异,分别是go.Scatter()和px.scatter(),在内部的参数名上也有不同。importplotly.graph_objectsasgosca=go.Scatter(x=[0,1,2,3,4],y=[0,1,4,9,16],mode="lines+markers",marker={'size':8})fig=go.Figure(data=sca,layout_width=400,layout_height=400)fig.show() 一、散点图go接口创建散点图时可指定mode参数,其值可设为"markers"(点)、"lines"(线)或"lines+markers"(线+点)。散点数超过20个时默认为"lines"模式,点数小于20时默认为"lines+markers"模式。使用px接口生成散点图的代码如下。px.scatter不支持mode和marker参数,但可以在后续的fig.update_traces()中设置。importplotly.expressaspxfig=px.scatter(x=[0,1,2,3,4],y=[0,1,4,9,16],width=400,height=400)fig.update_traces(mode="markers",marker={"size":8}) #设置散点mode和大小fig.add_annotation(x=2,y=5,text="markers模式") #在(2,5)处添加标注文字fig.show() #左下图
一、散点图本章开头提到Plotly支持类似Seaborn的绘图方式,如下所示。为演示方便,px.data中自带一些数据集,help(px.data)可查看帮助,其中就包含常见的iris和tips数据集。iris=px.data.iris() #获取iris数据集,返回DataFrame对象fig=px.scatter(iris,x="sepal_width",y="sepal_length",color="species")#按species分类着色fig.show() #见上图
上例中px.scatter()直接使用iris数据框,利用花萼宽度和长度做散点图,并按sepcies类型将散点分为三种颜色。很显然,命令中的color参数等同于Seaborn中的hue语义参数。如果用go接口完成同样的工作则代码要复杂一些,go接口不直接支持color参数,必须在散点标记中自行完成类型到颜色的转换映射,示例如下。importplotly.graph_objectsasgoiris=px.data.iris() #获取iris数据集,返回DataFrame对象iris["color"]=iris.species.map({'setosa':0,'versicolor':1,'virginica':2})#将三种类型转为0,1,2数值sca=go.Scatter(x=iris["sepal_width"],y=iris["sepal_length"],mode="markers",marker={"color":iris["color"]}) #散点颜色,颜色不能直接用类型名,要转为数值fig=go.Figure(sca)fig.show() 一、散点图从上面对比可知,go接口不支持直接使用DataFrame及其列名字符串做参数,不支持color参数,px接口对DataFrame支持良好,使用方便,因此涉及数据框时一般使用px接口。px接口也支持类似Seaborn中的分行分列多子图参数,以tips数据集为例,请读者体会facet_row和facet_col参数的作用。df=px.data.tips() #tips小费数据集fig=px.scatter(df,x="total_bill",y="tip",color="smoker",
facet_row="time",facet_col="day", #分行、分列
category_orders={"day":["Thur","Fri","Sat","Sun"], #类目排列顺序
"time":["Lunch","Dinner"]})fig.show() 一、散点图px接口还支持类似Seaborn中的抖动散点图,此处x轴是类目数据,每个x值对应多个y值。如果用普通散点图,很多点会重合在一起,使用抖动散点图则自动做微小抖动,分离散点。go接口不支持抖动散点图。fig=px.strip(df,x="day",y="tip",color="smoker") #px.strip抖动散点图,df同上(小费集)fig.show() #图略
柱状图是二维图形,x轴可以是类目或数值型数据,y轴一般是数值数据,以柱体高度表示数值大小。下面的代码利用go接口创建柱状图。fruits=['桔子','苹果','香蕉']ya=[18,10,20]yb=[12,12,17]fig=go.Figure(data=[go.Bar(name='商家A',x=fruits,y=ya,width=0.3,text=ya,textposition='inside'),go.Bar(name='商家B',x=fruits,y=yb,width=0.3,text=yb,textposition='outside'),])fig.update_layout(barmode='group',width=600,height=400) #group簇状柱形图fig.show() 二、柱状图go.Bar()中的width设置柱体宽度0.3,此处是相对大小。x轴共3类货品,每类占据x轴的1/3,设置柱体宽度为该类宽度的0.3倍,因此单个柱体宽度为x轴总长的1/10。“text=ya”设定标记文字,并可以规定文字在柱体的里面(inside)或外面(outside),当有多组柱体时,可设置barmode模式,共有四种取值:'stack'堆叠,'group'簇状,'overlay'覆盖模式(后一组覆盖到前一组之上),'relative'相对模式(正负数据会分别绘制在y轴的正负半轴)。fromplotly.subplotsimportmake_subplotsfruits=['桔子','苹果','香蕉']fig=go.Figure(data=[go.Bar(name='商家A',x=fruits,y=[18,-10,22],width=0.3),go.Bar(name='商家B',x=fruits,y=[12,-8,26],width=0.3)])formodein['stack','group','overlay','relative']:#演示四种barmodefig.update_layout(barmode=mode,width=600,height=400,title="barmode--"+mode)fig.show() 二、柱状图目前做数据分析经常使用Pandas库。Pandas默认的图形后台是Matplotlib,但可重设图形后台。如下代码将Pandas的图形后台调整为“plotly”,这样pandas作图时就默认调用plotly,程序中可以不再显式引入plotly。参见官网中“PandasPlottingBackend”说明。importpandasaspddfw=pd.DataFrame({'fruits':['桔子','苹果','香蕉'],'商家A':[18,10,20],'商家B':[12,12,17]})dfw.set_index('fruits',inplace=True) #为绘图方便,将fruits设置为索引pd.options.plotting.backend="plotly" #将pandas的图形后台设为plotlyfig=dfw.plot(kind="bar") #pandas绘柱状图,后台将自动调用plotly,返回Figure对象fig.update_layout(barmode='group',width=600,height=400)fig.show() 二、柱状图饼图只需一维数据,提供一组数据和标签即可。饼图常用的修饰效果有分离状和圆环状。importplotly.graph_objectsasgolabels=['氧气','氢气','二氧化碳','氮气']values=[4500,2500,1053,500] fig=go.Figure(data=go.Pie(labels=labels,values=values,pull=[0,0,0.2,0]),#pull定义分离扇形 layout_width=500,layout_height=400)fig.show() #左下图
三、饼图#hole内圆半径fig=go.Figure(data=go.Pie(labels=labels,values=values,hole=.4),layout_width=500,layout_height=400)fig.update_layout(annotations=[dict(text='圆环饼图',x=0.5,y=0.5,font_size=14,showarrow=False),])fig.show()#
annotations增加文字标注,位置“x=0.5,y=0.5”表示图形正中央
与饼图比较相似的是旭日图,旭日图可以反映多层次的比例关系。Pyecharts中也有旭日图,但其数据定义较麻烦,Plotly的旭日图数据定义相对简单,如下所示。fig=go.Figure(go.Sunburst(labels=["衣物","食品","电子类","女装","男装","童装","饮料","肉食","手机","电脑"],parents=["","","","衣物","衣物","衣物","食品","食品","电子类","电子类"],values=[10, 12,8,4, 4,2,5,7,5,3],branchvalues="total", #表示扇区比例严格按数值匹配))fig.update_layout(width=400,height=400,margin=dict(t=0,l=0,r=0,b=0)) #四边空白都为0fig.show() 三、饼图上例定义了三个一级类目“衣物、食品、电子类",一级类目对应的parents列表应为空,而其它子类则填写其父类名称。由于设定了branchvalues="total"的参数,因此在values中要注意数值匹配,子类数据之和应等于父类的数据,如不匹配,则无法绘图。如不设置branchvalues参数,则不要求values值严格匹配。旭日图表现了数据的多层次的比例关系,类似按多个字段进行分组统计。下面的代码对tips数据集绘制旭日图,指定先按“day”分类,再依次按“time”和“sex”分类,将字段“total_bill”用于数值比例计算,得到下图。从图中可大致看出各层次的比例关系,“Sat”和“Sun”只含“Dinner”,而“Fri”和“Thur”则同时包含“Dinner”和“Lunch”。修改path参数中的字段顺序可得到不同的层次划分。df=px.data.tips()fig=px.sunburst(df,path=['day','time','sex'],values='total_bill') #注意path和values参数fig.show() 三、饼图左图反映的比例关系和df.groupby(['day','time','sex']).total_bill.sum()的统计结果是一致的本节介绍几种新式图形,以前章节中已介绍过多种图形类型,这些图形均可参考Plotly官网示例。各种可视化库实现的图形效果有类似之处,只是在数据格式、参数名、配置项上有不同的要求。第3节新式图形importplotly.figure_factoryasff #引入图形工厂接口fftasks=[dict(Task="任务A",Start='2021-01-01',Finish='2021-01-05',Complete=100),dict(Task="任务B",Start='2021-01-03',Finish='2021-02-04',Complete=60),dict(Task="任务C",Start='2021-02-01',Finish='2021-03-03',Complete=20)]fig=ff.create_gantt(tasks,index_col='Complete',show_colorbar=True,width=600,height=400)fig.show() 甘特图(Ganttchart)又称横道图,以图形创建人亨利.甘特的名字命名。甘特图通过条状图来显示项目及其时间进度安排,常见于项目管理中。一、甘特图和表图上例定义了三个任务的起始和截止时间,“Complete”表示完成百分比,通过“index_col='Complete'”映射为不同的颜色。点击图上方的“1w”或“1m”按钮则可显示任务最后截止日期前一周或前一月的日期。“YTD”是“yeartodate”的简写,将显示任务截止日这一年的日期。这个图形用plotly.figure_factory接口创建,不是用px接口。前面介绍的都是各类图形,如果有一些表格数据希望以整齐的格式显示在图形上,则可以使用表图(Tablechart),如下所示。importplotly.graph_objectsasgotable=go.Table(header=dict(values=['货品名','单价','数量']),#定义表头和表格单元格cellscells=dict(values=[["上衣","毛衣","西装","卫衣"],[95,185,505,55],[10,20,15,30]]),)fig=go.Figure(data=table,layout_width=600)fig.show() #左图
一、甘特图和表图df=px.data.medals_wide() #px自带的奖牌榜演示数据fig=go.Figure(data=[go.Table(header=dict(values=list(df.columns),fill_color='#80FFFF',align='center',height=40,font_size=18,), cells=dict(values=[df.nation,df.gold,df.silver,df.bronze],fill_color='#C4E1FF',align='left',height=30,)) ])fig.update_layout(width=600)fig.show() #右图
利用表图及make_subplots多子图函数可以将图与表显示在同一张图上。fromplotly.subplotsimportmake_subplots #多子图布局df=pd.DataFrame({'水果':['桔子','苹果','香蕉'],'商家A':[18,10,20],'商家B':[12,12,17]})bar1=go.Bar(name='商家A',x=df.水果,y=df.商家A,width=0.3)bar2=go.Bar(name='商家B',x=df.水果,y=df.商家B,width=0.3)table=go.Table(header=dict(values=list(df.columns),fill_color='#97CBFF'),cells=dict(values=[df.水果,df.商家A,df.商家A],fill_color='#F0F0F0'),)#创建2行1列的多子图布局对象。注意定义各子图坐标轴的类型fig=make_subplots(rows=2,cols=1,specs=[[{"type":"xy"}],[{"type":"domain"}]],)fig.add_trace(bar1,row=1,col=1) #bar1添加在第1行第1列fig.add_trace(bar2,row=1,col=1) #bar2也添加在第1行第1列fig.add_trace(table,row=2,col=1) #表图在第2行第1列fig.update_layout(width=600,title="图表结合",title_x=0.5,title_y=0.9)fig.show() 一、甘特图和表图上例利用make_subplots()方法创建2行1列的多子图对象fig。柱状图是传统的xy轴坐标系,表图不是xy轴坐标系,要特别指定其坐标系为domain,详情参阅官网“Subplots”页面说明。利用add_trace()将bar1和bar2添加在第1行第1列子图,将表图添加在第2行第1列子图。make_subplots()命令可用于创建多子图,下面是另一个多子图示例。importnumpyasnpfromplotly.subplotsimportmake_subplotsfig=make_subplots(rows=2,cols=2) #2x2子图,本例都是xy坐标系,可省略specs类型指定forindexinrange(4):row=index//2+1 #注意加1,行列从1开始编号,不是从0开始
col=index%2+1sca=go.Scatter(x=np.random.randn(10),y=np.random.randn(10)) #随机散点图
fig.add_trace(sca,row=row,col=col) #将sca添加在指定的row/col子图中fig.update_layout(width=600,title="多子图示例",title_x=0.5)fig.show() 一、甘特图和表图还可用make_subplots()做双Y轴图形,代码见"09.3.ipynb"文件。树图(Treemap)用嵌套的矩形框反映数据之间的层次关系,采用前面旭日图的层次数据做树图如下。代码中的labels、parents和values定义和以前类似,通过parents表明层次关系。图中所示有三个顶级数据,各自包含一些子类。values数据不是必须的,如果提供了values值,则矩形面积反映数值之间的比例关系。importplotly.graph_objectsasgolabels=["衣物","食品","电子类","女装","男装","童装","饮料","肉食","猪肉","羊肉","手机","电脑"]parents=["","","","衣物","衣物","衣物","食品","食品","肉食","肉食","电子类","电子类"]values=[10,12,8,4,4,2,5,7,2,5,5,3]fig=go.Figure(go.Treemap(labels=labels,parents=parents,values=values)) #树图fig.show() 二、树图和瀑布图瀑布图(WaterfallChart)用于表示一组连续数据的相对及其总量的变化,因为形似瀑布流水而得名。importplotly.graph_objectsasgofig=go.Figure(go.Waterfall(measure=["relative","relative","total","relative","relative","total"],#相对和绝对类型
x=["工资收入","投资收入","收入总计","房贷","生活费用","结余"],text=["+20","+10","+30","-15","-8","+7"], #自定义标记文字
y=[20,10,0,-15,-8,0], #只需填relative量,total对应的数填0textposition="outside",))fig.update_layout(title="2020年收入支出大类图")fig.show() 二、树图和瀑布图左图表现了一年中的收入和支出的情况,“relative”代表相对变化量,填入正或负数;“total”代表累积总量,填入0即可,实际的累积总量在绘图时会自动计算。图中对应正数、负数和累积总量的柱体自动用不同颜色区分。极坐标系的点坐标表示为(r,θ),r极径,θ极角。下图定义了极坐标系中的100个点,绘制螺旋曲线图。importplotly.graph_objectsasgofig=go.Figure(data=go.Scatterpolar( #散点极坐标图
r=np.linspace(0,6,100), #极径
theta=np.linspace(0,360*4,100), #极角(单位:度)mode='lines+markers', #线+点模式
marker=dict(size=4,color='#00A3A3') #点的大小,颜色
))fig.update_layout(showlegend=False) #不显示图例fig.show() 三、极坐标图和指示器图极坐标图中还有一种柱状图,相比上图增加了width参数,定义每个扇区的圆心角,这样可以表示r、theta和width三个维度的信息。importplotly.graph_objectsasgofig=go.Figure(go.Barpolar( #极坐标柱状图
r=np.linspace(1,6,6),theta=np.linspace(30,300,6), #半径/极角
width=[30,15,15,20,30,40], #扇区圆心角(度数)marker_color=["#E4FF87",'#709BFF','#709BFF','#FFAA70','#FFAA70','#FFDF70'],marker_line_color="black",marker_line_width=2,opacity=0.8,))fig.update_layout(template=None,#半径轴刻度polar=dict(radialaxis=dict(range=[0,6],showticklabels=True,ticks='inside'),
angularaxis=dict(showticklabels=True,ticks='outside') #外圈圆刻度
))fig.show() 三、极坐标图和指示器图指示器图(Indicatorchart)类似Pyecharts中的水球图,用于显示单个数值,但表现形式更丰富,并可配合其他图形一起显示。指示器图需设置的属性有:value-待显示的值、mode-显示的模式和domain-图形布局。importplotly.graph_objectsasgofig=go.Figure()fig.add_trace(go.Indicator(value=200, #待显示的值
delta={'reference':160}, #自定义参照值,因此变化量为200-160=40gauge={'axis':{'visible':True}}, #显示仪表盘外圈的刻度值(默认设置)domain={'row':0,'column':0})) #布局在0行0列fig.add_trace(go.Indicator(mode="number+delta", #只显示"数值+变化量"(不显示仪表盘)value=300, delta={'reference':250}, #参照值250,因此变化量为300-250=50domain={'row':0,'column':1})) #布局在0行1列#后续代码略,详见"09.4.ipynb"文件
三、极坐标图和指示器图指示器图可搭配其他图形显示,下面在折线图上添加一个指示器图,指示了最大值和最小值之间的增量变化。index=pd.date_range('2021-01-01',periods=40)df=pd.DataFrame(np.random.randint(10,30,40),index=index,columns=['A'])fig=px.line(df) #折线图fig.add_trace(go.Indicator( #指示器图
mode="number+delta", #只显示"数值+变化量"(不显示仪表盘)value=df.A.max(), #显示最大值
delta={'reference':df.A.min()}, #参照值为最小值,因此变化量=最大值-最小值
domain={'x':[0.2,0.5],'y':[0.5,0.9]})) #定义子图在大图中的位置及其大小(相对坐标)fig.update_layout(width=600,height=400)fig.show() 三、极坐标图和指示器图桑基图在Pyecharts中介绍过,Plotly也可绘制桑基图,数据定义比Pyecharts要简洁。importplotly.graph_objectsasgofig=go.Figure(data=[go.Sankey(node=dict(#图中条形的间距,宽度,外边缘线,颜色pad=15,thickness=20,line=dict(color="white",width=1),color="blue",#定义各节点名称
label=["苹果","华为","小米","男","女","年龄40以上","年龄25-40","年龄25以下"],),link=dict(source=[0,0,1,1,2,2,3,3,3,4,4,4],#源,对应label中的索引号(从0开始)target=[3,4,3,4,3,4,5,6,7,5,6,7],#目标
value=[100,120,150,50,40,55,80,150,60,60,125,40]))])#定义标题、标题文字大小,标题x轴位置,y轴位置,普通文字大小fig.update_layout(title="桑基图",title_font_size=20,title_x=0.5,title_y=0.85,font_size=12)fig.show() 四、桑基图和平行类目图本例中,node参数定义节点,link参数定义节点间的边。每条边由(source,target,value)三部分构成,例如(0,3,100)表示("苹果","男",100)的数据对应关系,边的宽度由value决定。有时我们想展示多组相关数据,但这些数据的度量标准不同,无法简单地在同一个坐标系中展示,此时可使用平行类目图。下例构造了一个城市空气质量数据表,使用平行类目图进行展示。df=pd.DataFrame({'城市':['北京','广州','上海'],'PM2.5':[100,30,80],'CO':[1.5,0.8,0.9],'NO2':[100,40,70],'等级':['中','优','良']})fig=px.parallel_categories(df,dimensions=['城市','PM2.5','CO','NO2','等级']) #注意参数fig.update_layout(title='平行类目图',title_x=0.5,width=600,height=300)fig.show() 四、桑基图和平行类目图上一章介绍的Pyecharts库支持交互图形,但在统计图形方面比较薄弱。Plotly集中了Seaborn和Pyecharts的优点,绘制统计类图形非常方便。下面用px接口绘制鸢尾花的花萼宽度和长度散点图。第4节统计类图形与地图importplotly.expressaspxdf=px.data.iris()fig=px.scatter(df,x="sepal_width",y="sepal_length",color="species",marginal_y="violin",marginal_x="box",trendline="ols",template="simple_white")fig.show() 从上面命令可见,px接口直接使用数据框对象绘图非常方便,只需指定df、x、y和color等参数。更进一步,增加marginal_y、marginal_x和trendline参数,可以绘制单变量的小提琴图和箱线图,并指定拟合趋势线。一、统计类图形与Seaborn类似,px接口也只需一行代码即可绘制出鸢尾花4种属性的散点图矩阵。df=px.data.iris()fig=px.scatter_matrix(df,dimensions=["sepal_width","sepal_length","petal_width","petal_length"],color="species")fig.show() #左图
使用px.histogram()函数可绘制单变量分布直方图。df=px.data.tips()fig=px.histogram(df,x="total_bill",nbins=20) #nbins分组数fig.update_layout(width=600,height=400)fig.show() #右图
一、统计类图形下面的代码绘制tips数据集中的tip字段直方图,通过color参数将数据分为男性和女性两类,并在上方分别绘制了小费的地毯图(rug),将每一笔小费用细的竖线标记。“hover_data=df.columns”表示信息框中显示所有列的数据。df=px.data.tips()fig=px.histogram(df,x="tip",color="sex",marginal="rug",hover_data=df.columns)fig.show() #左图
统计类图形中的箱线图可用px.box()函数绘制。鼠标移到箱框上时会显示25%、50%和75%分位点值。df=px.data.tips()fig=px.box(df,x="day",y="total_bill",color="smoker") #箱线图fig.show() #右图
一、统计类图形将箱线图和密度曲线图结合可得到小提琴图,使用px.violin()函数绘制。df=px.data.tips() #小费数据集fig=px.violin(df,y="tip",x="smoker",color="sex",box=True,points="all",hover_data=df.columns)fig.show() #左图
下面的代码绘制两个变量的密度分布图,图形上方是直方图和密度曲线,下方是地毯图。importplotly.figure_factoryasff #引入ff接口np.random.seed(7)x=np.random.randn(200);y=np.random.randn(200) #标准正态分布数组x和yhist_data=[x,y] #待绘图的变量数组group_labels=['x','y'] #图例(必须参数)fig=ff.create_distplot(hist_data,group_labels) #密度分布图fig.show() #右图
一、统计类图形Plotly支持两种类型的地图:Geo地图和Mapbox地图。Geo型绘制地图轮廓线(outline-based),类似Pyecharts中的Map和Geo图。Mapbox型类似百度地图,但功能更丰富,可以支持多种不同的地图渲染样式。Geo地图可参考官网链接/python/map-configuration/。Plotly包含若干种地图绘制函数,函数名中带有“geo”字样的为Geo类绘图函数。绘制时默认的地图轮廓是世界地图,如下代码所示。importplotly.graph_objectsasgofig=go.Figure(go.Scattergeo(lon=[30.2,80,130],lat=[50.1,10.2,30.55],#某点的(数值,经度,纬度)
hovertext=['地点A','地点B','地点C'],marker_size=12))fig.update_traces(mode="lines+markers")fig.update_geos(projection_type="equirectangular") #投射类型:equirectangular为默认值fig.show() 上例定义了三个点的经纬度,并设置模式为“lines+marker”,因此在地图上标注了三个点并连线。projection_type参数表示地图投影类型,如将代码改为projection_type="orthographic"可实现球形地图效果。二、地图(一)
Geo地图Plotly有很多参数值,初次使用时难免设错,一般在返回的错误信息中就包含了正确的可设置参数值。例如投影参数可设置的值有'equirectangular'、'mercator'、'orthographic'、'naturalearth'等。Plotly自带的Geo图可以设定地图范围"scope",可设置的值有:world、usa、europe、asia、africa、northamerica等,下面的代码设定scope为'asia'。分辨率resolution只能设为110和50两个值,地图中设定了显示海岸线、陆地、湖泊和河流等信息。importplotly.graph_objectsasgofig=go.Figure(go.Sc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度年福建省高校教师资格证之高等教育法规模拟考试试卷A卷含答案
- 中国消费者食品添加剂认知调查报告 2023
- 2024年数控高精度内外圆磨床项目资金申请报告代可行性研究报告
- 2024年xx村10月驻村工作总结
- 二年级数学(上)计算题专项练习
- 2024年度影视制作费用协议范本
- 第七届进博会隆重开幕感悟心得
- 2024年商业广告承揽协议规范格式
- 2024年产蜜蜂购买协议
- 2024年零星建筑施工项目协议范本
- 采购主管岗位招聘笔试题与参考答案(某大型国企)2024年
- 短视频运营及带货逻辑课件
- 2024年中国陶茶具市场调查研究报告
- 2022年江苏省普通高中学业水平测试生物试卷
- 第4章 跨境电商选品与定价
- 《介绍教室》(教案)-2024-2025学年一年级上册数学北师大版
- 2024年检察院招录书记员考试法律基础知识及答案
- 《犯罪心理学(马皑第3版)》章后复习思考题及答案
- 青骄第二课堂2021年禁毒知识答题期末考试答案(初中组)
- 2024-2030年中国射频芯片行业市场发展趋势与前景展望战略分析报告
- 华电线上测评
评论
0/150
提交评论