Python數(shù)據可視化 課件 09章Poltly交互可視化庫_第1頁
Python數(shù)據可視化 課件 09章Poltly交互可視化庫_第2頁
Python數(shù)據可視化 課件 09章Poltly交互可視化庫_第3頁
Python數(shù)據可視化 課件 09章Poltly交互可視化庫_第4頁
Python數(shù)據可視化 課件 09章Poltly交互可視化庫_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python數(shù)據可視化第9章

Poltly交互可視化庫教師:xxx2024.07第1節(jié)Poltly概述第9章

Poltly交互可視化庫第2節(jié)基本圖形第3節(jié)新式圖形第4節(jié)統(tǒng)計類圖形與地圖前面章節(jié)介紹了Matplotlib、Seaborn和Pyecharts三個可視化庫。Matplotlib歷史久遠,使用廣泛,它可以對圖形做精細控制,但設置命令較繁瑣,圖形類型有限;Seaborn用于統(tǒng)計數(shù)據繪圖,支持語義著色,可自動生成分類多子圖,兩者繪制的都是靜態(tài)圖片。Pyecharts生成動態(tài)交互網頁,可繪制諸如漏斗圖、樹圖和地圖等新穎圖形,但不支持Numpy和Pandas的數(shù)據類型。Poltly集成了上述軟件的優(yōu)點,生成動態(tài)網頁交互圖形,支持Pandas數(shù)據結構,支持類似Seaborn的統(tǒng)計繪圖,可以說Poltly是目前Python平臺下功能最強大的可視化庫。第1節(jié)Poltly概述本章代碼在plotly5.9版下測試通過。本節(jié)代碼見"09.1.ipynb"文件。各代碼段首部默認含有以下語句,后續(xù)部分代碼段為節(jié)省空間不再列出下列語句。Poltly支持多種編程語言接口,例如Python、R和JavaScript等,這些接口都基于poltly.js庫,而poltly.js又基于d3.js這個最強大的JavaScript可視化庫。本章介紹的是其中針對Python接口的部分。在Anaconda平臺中已包含poltly,如需升級可在命令行上執(zhí)行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]}) #構造數(shù)據框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月發(fā)布的4.0版做了重大改變,將線上模式剝離,單獨放在chartstudio庫中,plotly僅保留線下模式。讀者參考網上代碼時,含有offline字樣的是舊版3.x格式,不要采用舊格式。4.0版提供了express高級接口,使圖形生成更簡潔。目前5.x版代碼主要使用plotly.graph_objects和plotly.express這兩個接口,后者是高級接口,對前者進行了再包裝。有少量圖形會使用第三種接口plotly.figure_factory創(chuàng)建。接上頁:Plotly支持多種圖形構造方法,目前官方推薦使用plotly.express接口。導入接口后命名為px,接口支持直接使用Pandas的DataFrame對象。上例在px.bar()中使用df數(shù)據框,指定x軸對應“x”列,y軸對應“y1,y2”兩列,這種語法類似seaborn。柱狀圖模式為“group”簇狀圖,如不設置則產生堆疊圖。fig.update_layout()是后續(xù)學習中常見的命令,用于修改圖形外觀。下面的代碼使用較低級的go接口重寫了上例的柱狀圖,代碼關鍵之處是go.Figure()。此處將生成一個圖形對象,創(chuàng)建時通過“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") #先創(chuàng)建bar1對象,name是圖例bar2=go.Bar(x=x,y=[2,4,5],name="y2") #bar2對象fig=go.Figure(data=[bar1,bar2]) #創(chuàng)建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) #創(chuàng)建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對象,只是創(chuàng)建更方便,代碼更精簡。一、Poltly簡介(三)

作圖步驟(概括為如下5步)(1).準備數(shù)據。Poltly支持列表、元組及Numpy和Pandas中的數(shù)據類型。一般可用Pandas處理數(shù)據,然后將DataFrame傳遞給繪圖函數(shù)作圖。(2).創(chuàng)建Figure對象,利用px或go接口均可。importplotly.expressaspx fig=px.bar(x=["A","B"],y=[3,5]) #利用px接口創(chuàng)建Figure類型的對象figimportplotly.graph_objectsasgofig=go.Figure() #利用go接口創(chuàng)建空白Figure(3).添加圖形子對象bar1=go.Bar(x=["A","B"],y=[4,2],name="y1") #先創(chuàng)建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間的小數(shù),取1時顏色最深。一、Poltly簡介(4).設置圖形layout,update_layout()可集中設置多個參數(shù),不像Matplotlib需使用多條命令分設各個參數(shù)。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支持多種渲染輸出環(huán)境,還可輸出為圖片或PDF,詳見教材和官網。學習Plotly主要通過閱讀官方文檔,讀者可先查看/python/首頁的“Fundamentals”部分。其中“TheFigureDataStructure”解釋了圖形對象的內部數(shù)據結構。Figure對象可近似認為是一個嵌套字典,對象以json格式包裝在網頁中。下面創(chuàng)建一個Figure對象并輸出內部結構。二、圖形對象的數(shù)據結構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) #創(chuàng)建內含一個Bar的Figurefig.add_trace(go.Bar(x=["A","B"],y=[2,3],name="y2")) #再添加一個Barprint(fig) #輸出fig對象的內部結構,如下所示Figure內有三個頂級數(shù)據屬性:data、layout和frames。data是列表,內含各個trace子軌跡,例如“fig=px.bar()”先創(chuàng)建了一個bar,后續(xù)用add_trace()添加了一個bar,因此data列表中含兩個柱狀圖。layout包含窗口參數(shù),例如寬度、高度和標題。圖形設置主要就是設置data和layout屬性。要注意區(qū)分Figure和trace,只有Figure對象具有上述屬性,可以設置標題等內容,trace對象沒有這些屬性。第三個頂級屬性frames只在動畫圖形中出現(xiàn),代表幀,本例未包含。Figure對象內部的數(shù)據是多層嵌套字典,plotly提供了稱之為魔術下劃線(magicunderscore)的表達形式,用“_”下劃線將字典各層連接起來作為形參名,這樣參數(shù)名很簡潔,不用表達為多層嵌套字典。設置時也可以直接設置屬性的值,讀者可對比下面三行效果相同的命令。二、圖形對象的數(shù)據結構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”頁面詳細解釋了圖形函數(shù)的參數(shù)。三、圖形類型importplotly.ioaspioprint(pio.templates) #顯示所有模板名pio.templates.default="plotly_white" #設置為默認模板plotly.graph_objects接口(簡稱go)內含40余種圖形,plotly.express接口(簡稱px)對go接口進行了再包裝,支持其中絕大多數(shù)類型。Plotly官方建議首選使用px接口,對于px不支持的圖形類型才使用go接口,例如某些3D圖形。教材表9.1列出了當前版本支持的大多數(shù)圖形類型。四、模板和配置每個可視化庫都可以設置主題風格,Plotly中的主題(theme)也被稱為模板(template)。模板除具有傳統(tǒng)主題的功能,還兼具一些自定義內容,例如圖形大小、圖形水印等。執(zhí)行下面的命令可顯示Plotly中的所有模板。系統(tǒng)常用模板有: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類派生的。該類對象擁有l(wèi)ayout和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)設置坐標軸刻度

點和線的樣式本節(jié)介紹幾種讀者熟悉的基本圖形,借此說明Poltly的一些常用設置參數(shù)和方法。某些圖形會分別給出go和px接口的示例,讀者可對比兩種接口的異同。第2節(jié)基本圖形散點圖是常見的二維圖形,用go或px接口均可創(chuàng)建。兩個接口的函數(shù)名有大小寫上的差異,分別是go.Scatter()和px.scatter(),在內部的參數(shù)名上也有不同。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接口創(chuàng)建散點圖時可指定mode參數(shù),其值可設為"markers"(點)、"lines"(線)或"lines+markers"(線+點)。散點數(shù)超過20個時默認為"lines"模式,點數(shù)小于20時默認為"lines+markers"模式。使用px接口生成散點圖的代碼如下。px.scatter不支持mode和marker參數(shù),但可以在后續(xù)的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中自帶一些數(shù)據集,help(px.data)可查看幫助,其中就包含常見的iris和tips數(shù)據集。iris=px.data.iris() #獲取iris數(shù)據集,返回DataFrame對象fig=px.scatter(iris,x="sepal_width",y="sepal_length",color="species")#按species分類著色fig.show() #見上圖

上例中px.scatter()直接使用iris數(shù)據框,利用花萼寬度和長度做散點圖,并按sepcies類型將散點分為三種顏色。很顯然,命令中的color參數(shù)等同于Seaborn中的hue語義參數(shù)。如果用go接口完成同樣的工作則代碼要復雜一些,go接口不直接支持color參數(shù),必須在散點標記中自行完成類型到顏色的轉換映射,示例如下。importplotly.graph_objectsasgoiris=px.data.iris() #獲取iris數(shù)據集,返回DataFrame對象iris["color"]=iris.species.map({'setosa':0,'versicolor':1,'virginica':2})#將三種類型轉為0,1,2數(shù)值sca=go.Scatter(x=iris["sepal_width"],y=iris["sepal_length"],mode="markers",marker={"color":iris["color"]}) #散點顏色,顏色不能直接用類型名,要轉為數(shù)值fig=go.Figure(sca)fig.show() 一、散點圖從上面對比可知,go接口不支持直接使用DataFrame及其列名字符串做參數(shù),不支持color參數(shù),px接口對DataFrame支持良好,使用方便,因此涉及數(shù)據框時一般使用px接口。px接口也支持類似Seaborn中的分行分列多子圖參數(shù),以tips數(shù)據集為例,請讀者體會facet_row和facet_col參數(shù)的作用。df=px.data.tips() #tips小費數(shù)據集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軸是類目數(shù)據,每個x值對應多個y值。如果用普通散點圖,很多點會重合在一起,使用抖動散點圖則自動做微小抖動,分離散點。go接口不支持抖動散點圖。fig=px.strip(df,x="day",y="tip",color="smoker") #px.strip抖動散點圖,df同上(小費集)fig.show() #圖略

柱狀圖是二維圖形,x軸可以是類目或數(shù)值型數(shù)據,y軸一般是數(shù)值數(shù)據,以柱體高度表示數(shù)值大小。下面的代碼利用go接口創(chuàng)建柱狀圖。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?!皌ext=ya”設定標記文字,并可以規(guī)定文字在柱體的里面(inside)或外面(outside),當有多組柱體時,可設置barmode模式,共有四種取值:'stack'堆疊,'group'簇狀,'overlay'覆蓋模式(后一組覆蓋到前一組之上),'relative'相對模式(正負數(shù)據會分別繪制在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() 二、柱狀圖目前做數(shù)據分析經常使用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() 二、柱狀圖餅圖只需一維數(shù)據,提供一組數(shù)據和標簽即可。餅圖常用的修飾效果有分離狀和圓環(huán)狀。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='圓環(huán)餅圖',x=0.5,y=0.5,font_size=14,showarrow=False),])fig.show()#

annotations增加文字標注,位置“x=0.5,y=0.5”表示圖形正中央

與餅圖比較相似的是旭日圖,旭日圖可以反映多層次的比例關系。Pyecharts中也有旭日圖,但其數(shù)據定義較麻煩,Plotly的旭日圖數(shù)據定義相對簡單,如下所示。fig=go.Figure(go.Sunburst(labels=["衣物","食品","電子類","女裝","男裝","童裝","飲料","肉食","手機","電腦"],parents=["","","","衣物","衣物","衣物","食品","食品","電子類","電子類"],values=[10, 12,8,4, 4,2,5,7,5,3],branchvalues="total", #表示扇區(qū)比例嚴格按數(shù)值匹配))fig.update_layout(width=400,height=400,margin=dict(t=0,l=0,r=0,b=0)) #四邊空白都為0fig.show() 三、餅圖上例定義了三個一級類目“衣物、食品、電子類",一級類目對應的parents列表應為空,而其它子類則填寫其父類名稱。由于設定了branchvalues="total"的參數(shù),因此在values中要注意數(shù)值匹配,子類數(shù)據之和應等于父類的數(shù)據,如不匹配,則無法繪圖。如不設置branchvalues參數(shù),則不要求values值嚴格匹配。旭日圖表現(xiàn)了數(shù)據的多層次的比例關系,類似按多個字段進行分組統(tǒng)計。下面的代碼對tips數(shù)據集繪制旭日圖,指定先按“day”分類,再依次按“time”和“sex”分類,將字段“total_bill”用于數(shù)值比例計算,得到下圖。從圖中可大致看出各層次的比例關系,“Sat”和“Sun”只含“Dinner”,而“Fri”和“Thur”則同時包含“Dinner”和“Lunch”。修改path參數(shù)中的字段順序可得到不同的層次劃分。df=px.data.tips()fig=px.sunburst(df,path=['day','time','sex'],values='total_bill') #注意path和values參數(shù)fig.show() 三、餅圖左圖反映的比例關系和df.groupby(['day','time','sex']).total_bill.sum()的統(tǒng)計結果是一致的本節(jié)介紹幾種新式圖形,以前章節(jié)中已介紹過多種圖形類型,這些圖形均可參考Plotly官網示例。各種可視化庫實現(xiàn)的圖形效果有類似之處,只是在數(shù)據格式、參數(shù)名、配置項上有不同的要求。第3節(jié)新式圖形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)又稱橫道圖,以圖形創(chuàng)建人亨利.甘特的名字命名。甘特圖通過條狀圖來顯示項目及其時間進度安排,常見于項目管理中。一、甘特圖和表圖上例定義了三個任務的起始和截止時間,“Complete”表示完成百分比,通過“index_col='Complete'”映射為不同的顏色。點擊圖上方的“1w”或“1m”按鈕則可顯示任務最后截止日期前一周或前一月的日期?!癥TD”是“yeartodate”的簡寫,將顯示任務截止日這一年的日期。這個圖形用plotly.figure_factory接口創(chuàng)建,不是用px接口。前面介紹的都是各類圖形,如果有一些表格數(shù)據希望以整齊的格式顯示在圖形上,則可以使用表圖(Tablechart),如下所示。importplotly.graph_objectsasgotable=go.Table(header=dict(values=['貨品名','單價','數(shù)量']),#定義表頭和表格單元格cellscells=dict(values=[["上衣","毛衣","西裝","衛(wèi)衣"],[95,185,505,55],[10,20,15,30]]),)fig=go.Figure(data=table,layout_width=600)fig.show() #左圖

一、甘特圖和表圖df=px.data.medals_wide() #px自帶的獎牌榜演示數(shù)據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多子圖函數(shù)可以將圖與表顯示在同一張圖上。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'),)#創(chuàng)建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()方法創(chuàng)建2行1列的多子圖對象fig。柱狀圖是傳統(tǒng)的xy軸坐標系,表圖不是xy軸坐標系,要特別指定其坐標系為domain,詳情參閱官網“Subplots”頁面說明。利用add_trace()將bar1和bar2添加在第1行第1列子圖,將表圖添加在第2行第1列子圖。make_subplots()命令可用于創(chuàng)建多子圖,下面是另一個多子圖示例。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)用嵌套的矩形框反映數(shù)據之間的層次關系,采用前面旭日圖的層次數(shù)據做樹圖如下。代碼中的labels、parents和values定義和以前類似,通過parents表明層次關系。圖中所示有三個頂級數(shù)據,各自包含一些子類。values數(shù)據不是必須的,如果提供了values值,則矩形面積反映數(shù)值之間的比例關系。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)用于表示一組連續(xù)數(shù)據的相對及其總量的變化,因為形似瀑布流水而得名。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對應的數(shù)填0textposition="outside",))fig.update_layout(title="2020年收入支出大類圖")fig.show() 二、樹圖和瀑布圖左圖表現(xiàn)了一年中的收入和支出的情況,“relative”代表相對變化量,填入正或負數(shù);“total”代表累積總量,填入0即可,實際的累積總量在繪圖時會自動計算。圖中對應正數(shù)、負數(shù)和累積總量的柱體自動用不同顏色區(qū)分。極坐標系的點坐標表示為(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參數(shù),定義每個扇區(qū)的圓心角,這樣可以表示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], #扇區(qū)圓心角(度數(shù))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中的水球圖,用于顯示單個數(shù)值,但表現(xiàn)形式更豐富,并可配合其他圖形一起顯示。指示器圖需設置的屬性有: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", #只顯示"數(shù)值+變化量"(不顯示儀表盤)value=300, delta={'reference':250}, #參照值250,因此變化量為300-250=50domain={'row':0,'column':1})) #布局在0行1列#后續(xù)代碼略,詳見"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", #只顯示"數(shù)值+變化量"(不顯示儀表盤)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() 三、極坐標圖和指示器圖?;鶊D在Pyecharts中介紹過,Plotly也可繪制桑基圖,數(shù)據定義比Pyecharts要簡潔。importplotly.graph_objectsasgofig=go.Figure(data=[go.Sankey(node=dict(#圖中條形的間距,寬度,外邊緣線,顏色pad=15,thickness=20,line=dict(color="white",width=1),color="blue",#定義各節(jié)點名稱

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() 四、?;鶊D和平行類目圖本例中,node參數(shù)定義節(jié)點,link參數(shù)定義節(jié)點間的邊。每條邊由(source,target,value)三部分構成,例如(0,3,100)表示("蘋果","男",100)的數(shù)據對應關系,邊的寬度由value決定。有時我們想展示多組相關數(shù)據,但這些數(shù)據的度量標準不同,無法簡單地在同一個坐標系中展示,此時可使用平行類目圖。下例構造了一個城市空氣質量數(shù)據表,使用平行類目圖進行展示。df=pd.DataFrame({'城市':['北京','廣州','上海'],'PM2.5':[100,30,80],'CO':[1.5,0.8,0.9],'NO2':[100,40,70],'等級':['中','優(yōu)','良']})fig=px.parallel_categories(df,dimensions=['城市','PM2.5','CO','NO2','等級']) #注意參數(shù)fig.update_layout(title='平行類目圖',title_x=0.5,width=600,height=300)fig.show() 四、?;鶊D和平行類目圖上一章介紹的Pyecharts庫支持交互圖形,但在統(tǒng)計圖形方面比較薄弱。Plotly集中了Seaborn和Pyecharts的優(yōu)點,繪制統(tǒng)計類圖形非常方便。下面用px接口繪制鳶尾花的花萼寬度和長度散點圖。第4節(jié)統(tǒng)計類圖形與地圖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接口直接使用數(shù)據框對象繪圖非常方便,只需指定df、x、y和color等參數(shù)。更進一步,增加marginal_y、marginal_x和trendline參數(shù),可以繪制單變量的小提琴圖和箱線圖,并指定擬合趨勢線。一、統(tǒng)計類圖形與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()函數(shù)可繪制單變量分布直方圖。df=px.data.tips()fig=px.histogram(df,x="total_bill",nbins=20) #nbins分組數(shù)fig.update_layout(width=600,height=400)fig.show() #右圖

一、統(tǒng)計類圖形下面的代碼繪制tips數(shù)據集中的tip字段直方圖,通過color參數(shù)將數(shù)據分為男性和女性兩類,并在上方分別繪制了小費的地毯圖(rug),將每一筆小費用細的豎線標記?!癶over_data=df.columns”表示信息框中顯示所有列的數(shù)據。df=px.data.tips()fig=px.histogram(df,x="tip",color="sex",marginal="rug",hover_data=df.columns)fig.show() #左圖

統(tǒng)計類圖形中的箱線圖可用px.box()函數(shù)繪制。鼠標移到箱框上時會顯示25%、50%和75%分位點值。df=px.data.tips()fig=px.box(df,x="day",y="total_bill",color="smoker") #箱線圖fig.show() #右圖

一、統(tǒng)計類圖形將箱線圖和密度曲線圖結合可得到小提琴圖,使用px.violin()函數(shù)繪制。df=px.data.tips() #小費數(shù)據集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) #標準正態(tài)分布數(shù)組x和yhist_data=[x,y] #待繪圖的變量數(shù)組group_labels=['x','y'] #圖例(必須參數(shù))fig=ff.create_distplot(hist_data,group_labels) #密度分布圖fig.show() #右圖

一、統(tǒng)計類圖形Plotly支持兩種類型的地圖:Geo地圖和Mapbox地圖。Geo型繪制地圖輪廓線(outline-based),類似Pyecharts中的Map和Geo圖。Mapbox型類似百度地圖,但功能更豐富,可以支持多種不同的地圖渲染樣式。Geo地圖可參考官網鏈接/python/map-configuration/。Plotly包含若干種地圖繪制函數(shù),函數(shù)名中帶有“geo”字樣的為Geo類繪圖函數(shù)。繪制時默認的地圖輪廓是世界地圖,如下代碼所示。importplotly.graph_objectsasgofig=go.Figure(go.Scattergeo(lon=[30.2,80,130],lat=[50.1,10.2,30.55],#某點的(數(shù)值,經度,緯度)

hovertext=['地點A','地點B','地點C'],marker_size=12))fig.update_traces(mode="lines+markers")fig.update_geos(projection_type="equirectangular") #投射類型:equirectangular為默認值fig.show() 上例定義了三個點的經緯度,并設置模式為“l(fā)ines+marker”,因此在地圖上標注了三個點并連線。projection_type參數(shù)表示地圖投影類型,如將代碼改為projection_type="orthographic"可實現(xiàn)球形地圖效果。二、地圖(一)

Geo地圖Plotly有很多參數(shù)值,初次使用時難免設錯,一般在返回的錯誤信息中就包含了正確的可設置參數(shù)值。例如投影參數(shù)可設置的值有'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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論