今天給大家推薦一個視覺化神器 - Plotly_express ,上手非常的簡單,基本所有的圖都只要一行程式碼就能繪出一張非常酷炫的視覺化圖。
以下是這個神器的詳細使用方法,文中附含大量的 GIF 動圖示例圖。
1. 環境準備本文的是在如下環境下測試完成的。
Python3.7Jupyter notebookPandas1.1.3Plotly_express0.4.1其中 Plotly_express0.4.1 是本文的主角,安裝它非常簡單,只需要使用 pip install 就可以
$ python3 -m pip install plotly_express
2. 工具概述在說 plotly_express之前,我們先了解下plotly。Plotly是新一代的視覺化神器,由TopQ量化團隊開源。雖然Ploltly功能非常之強大,但是一直沒有得到重視,主要原因還是其設定過於繁瑣。因此,Plotly推出了其簡化介面:Plotly_express,下文中統一簡稱為px。
px是對Plotly.py的一種高階封裝,其內建了很多實用且現代的繪圖模板,使用者只需要呼叫簡單的API函式即可實用,從而快速繪製出漂亮且動態的視覺化圖表。
px是完全免費的,使用者可以任意使用它。最重要的是,px和plotly生態系統的其他部分是完全相容的。使用者不僅可以在Dash中使用,還能透過Orca將資料匯出為幾乎任意檔案格式。
官網的學習資料:https://plotly.com/
px的安裝是非常簡單的,只需要透過pip install plotly_express來安裝即可。安裝之後的使用:
import plotly_express as px
3. 開始繪圖
接下來我們透過px中自帶的資料集來繪製各種精美的圖形。
gapmindertipswind3.1 資料集首先我們看下px中自帶的資料集:
import pandas as pdimport numpy as npimport plotly_express as px # 現在這種方式也可行:import plotly.express as px# 資料集gapminder = px.data.gapminder()gapminder.head() # 取出前5條資料
我們看看全部屬性值:
3.2 線型圖線型圖line在視覺化製圖中是很常見的。利用px能夠快速地製作線型圖:
# line 圖fig = px.line( gapminder, # 資料集 x="year", # 橫座標 y="lifeExp", # 縱座標 color="continent", # 顏色的資料 line_group="continent", # 線性分組 hover_name="country", # 懸停hover的資料 line_shape="spline", # 線的形狀 render_mode="svg" # 生成的圖片模式)fig.show()
再來製作面積圖:
# area 圖fig = px.area( gapminder, # 資料集 x="year", # 橫座標 y="pop", # 縱座標 color="continent", # 顏色 line_group="country" # 線性組別)fig.show()
3.3 散點圖散點圖的製作呼叫scatter方法:
指定size引數還能改變每個點的大小:
px.scatter( gapminder2007 # 繪圖DataFrame資料集 ,x="gdpPercap" # 橫座標 ,y="lifeExp" # 縱座標 ,color="continent" # 區分顏色 ,size="pop" # 區分圓的大小 ,size_max=60 # 散點大小)
透過指定facet_col、animation_frame引數還能將散點進行分塊顯示:
px.scatter( gapminder # 繪圖使用的資料 ,x="gdpPercap" # 橫縱座標使用的資料 ,y="lifeExp" # 縱座標資料 ,color="continent" # 區分顏色的屬性 ,size="pop" # 區分圓的大小 ,size_max=60 # 圓的最大值 ,hover_name="country" # 圖中視覺化最上面的名字 ,animation_frame="year" # 橫軸滾動欄的屬性year ,animation_group="country" # 標註的分組 ,facet_col="continent" # 按照國家country屬性進行分格顯示 ,log_x=True # 橫座標表取對數 ,range_x=[100,100000] # 橫軸取值範圍 ,range_y=[25,90] # 縱軸範圍 ,labels=dict(pop="Populations", # 屬性名字的變化,更直觀 gdpPercap="GDP per Capital", lifeExp="Life Expectancy"))
3.4 地理資料繪圖在實際的工作中,我們可能會接觸到中國地圖甚至是全球地圖,使用px也能製作:
px.choropleth( gapminder, # 資料集 locations="iso_alpha", # 配合顏色color顯示 color="lifeExp", # 顏色的欄位選擇 hover_name="country", # 懸停欄位名字 animation_frame="year", # 註釋 color_continuous_scale=px.colors.sequential.Plasma, # 顏色變化 projection="natural earth" # 全球地圖 )
fig = px.scatter_geo( gapminder, # 資料 locations="iso_alpha", # 配合顏色color顯示 color="continent", # 顏色 hover_name="country", # 懸停資料 size="pop", # 大小 animation_frame="year", # 資料幀的選擇 projection="natural earth" # 全球地圖 )fig.show()
px.scatter_geo(gapminder, # 資料集 locations="iso_alpha", # 配和color顯示顏色 color="continent", # 顏色的欄位顯示 hover_name="country", # 懸停資料 size="pop", # 大小 animation_frame="year" # 資料聯動變化的選擇 #,projection="natural earth" # 去掉projection引數)
使用line_geo來製圖:
fig = px.line_geo( gapminder2007, # 資料集 locations="iso_alpha", # 配合和color顯示資料 color="continent", # 顏色 projection="orthographic") # 球形的地圖fig.show()
3.5 使用內建iris資料我們先看看怎麼使用px來檢視內建資料的文件:
選擇兩個屬性製圖選擇兩個屬性作為橫縱座標來繪製散點圖
fig = px.scatter( iris, # 資料集 x="sepal_width", # 橫座標 y="sepal_length" # 縱座標 )fig.show()
透過color引數來顯示不同的顏色:
3.6 聯合分佈圖我們一個圖形中能夠將散點圖和直方圖組合在一起顯示:
px.scatter( iris, # 資料集 x="sepal_width", # 橫座標 y="sepal_length", # 縱座標 color="species", # 顏色 marginal_x="histogram", # 橫座標直方圖 marginal_y="rug" # 細條圖)
3.7 小提琴圖小提琴圖能夠很好的顯示資料的分佈和誤差情況,一行程式碼利用也能顯示小提琴圖:
px.scatter( iris, # 資料集 x="sepal_width", # 橫座標 y="sepal_length", # 縱座標 color="species", # 顏色 marginal_y="violin", # 縱座標小提琴圖 marginal_x="box", # 橫座標箱型圖 trendline="ols" # 趨勢線)
3.8 散點矩陣圖
px.scatter_matrix( iris, # 資料 dimensions=["sepal_width","sepal_length","petal_width","petal_length"], # 維度選擇 color="species") # 顏色
3.9 平行座標圖px.parallel_coordinates( iris, # 資料集 color="species_id", # 顏色 labels={"species_id":"Species", # 各種標籤值 "sepal_width":"Sepal Width", "sepal_length":"Sepal Length", "petal_length":"Petal Length", "petal_width":"Petal Width"}, color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=2)
3.10 箱體誤差圖# 對當前值加上下兩個誤差值iris["e"] = iris["sepal_width"] / 100px.scatter( iris, # 繪圖資料集 x="sepal_width", # 橫座標 y="sepal_length", # 縱座標 color="species", # 顏色值 error_x="e", # 橫軸誤差 error_y="e" # 縱軸誤差 )
3.11 等高線圖
等高線圖反映資料的密度情況:
px.density_contour( iris, # 繪圖資料集 x="sepal_width", # 橫座標 y="sepal_length", # 縱座標值 color="species" # 顏色)
等高線圖和直方圖的倆和使用:
px.density_contour( iris, # 資料集 x="sepal_width", # 橫座標值 y="sepal_length", # 縱座標值 color="species", # 顏色 marginal_x="rug", # 橫軸為線條圖 marginal_y="histogram" # 縱軸為直方圖 )
3.12 密度熱力圖
px.density_heatmap( iris, # 資料集 x="sepal_width", # 橫座標值 y="sepal_length", # 縱座標值 marginal_y="rug", # 縱座標值為線型圖 marginal_x="histogram" # 直方圖 )
3.13 並行類別圖在接下來的圖形中我們使用的小費tips例項,首先是匯入資料:
fig = px.parallel_categories( tips, # 資料集 color="size", # 顏色 color_continuous_scale=px.colors.sequential.Inferno) # 顏色變化取值fig.show()
3.14 柱狀圖
fig = px.bar( tips, # 資料集 x="sex", # 橫軸 y="total_bill", # 縱軸 color="smoker", # 顏色引數取值 barmode="group", # 柱狀圖模式取值 facet_row="time", # 行取值 facet_col="day", # 列元素取值 category_orders={ "day": ["Thur","Fri","Sat","Sun"], # 分類順序 "time":["Lunch", "Dinner"]})fig.show()
3.15 直方圖fig = px.histogram( tips, # 繪圖資料集 x="sex", # 橫軸為性別 y="tip", # 縱軸為費用 histfunc="avg", # 直方圖顯示的函式 color="smoker", # 顏色 barmode="group", # 柱狀圖模式 facet_row="time", # 行取值 facet_col="day", # 列取值 category_orders={ # 分類順序 "day":["Thur","Fri","Sat","Sun"], "time":["Lunch","Dinner"]})fig.show()
3.16 箱型圖箱型圖也是現實資料的誤差和分佈情況:
# notched=True顯示連線處的錐形部分px.box(tips, # 資料集 x="day", # 橫軸資料 y="total_bill", # 縱軸資料 color="smoker", # 顏色 notched=True) # 連線處的錐形部分顯示出來
px.box( tips, # 資料集 x="day", # 橫軸 y="total_bill", # 縱軸 color="smoker", # 顏色# notched=True # 隱藏引數 )
再來畫一次小提琴圖:
px.violin( tips, # 資料集 x="smoker", # 橫軸座標 y="tip", # 縱軸座標 color="sex", # 顏色引數取值 box=True, # box是顯示內部的箱體 points="all", # 同時顯示數值點 hover_data=tips.columns) # 結果中顯示全部資料
3.17 極座標圖
在這裡我們使用的是內建的wind資料:
散點極座標圖線性極座標圖fig = px.line_polar( wind, # 資料集 r="frequency", # 半徑 theta="direction", # 角度 color="strength", # 顏色 line_close=True, # 線性閉合 color_discrete_sequence=px.colors.sequential.Plasma_r) # 顏色變化fig.show()
柱狀極座標圖fig = px.bar_polar( wind, # 資料集 r="frequency", # 半徑 theta="direction", # 角度 color="strength", # 顏色 template="plotly_dark", # 主題 color_discrete_sequence=px.colors.sequential.Plasma_r) # 顏色變化fig.show()
4. 顏色面板
在px中有很多的顏色可以供選擇,提供了一個顏色面板:
px.colors.qualitative.swatches()
px.colors.sequential.swatches()
5. 主題px中存在3種主題:
plotlyplotly_whiteplotly_darkpx.scatter( iris, # 資料集 x="sepal_width", # 橫座標值 y="sepal_length", # 縱座標取值 color="species", # 顏色 marginal_x="box", # 橫座標為箱型圖 marginal_y="histogram", # 縱座標為直方圖 height=600, # 高度 trendline="ols", # 顯示趨勢線 template="plotly") # 主題
px.scatter( iris, # 資料集 x="sepal_width", # 橫座標值 y="sepal_length", # 縱座標取值 color="species", # 顏色 marginal_x="box", # 橫座標為箱型圖 marginal_y="histogram", # 縱座標為直方圖 height=600, # 高度 trendline="ols", # 顯示趨勢線 template="plotly_white") # 主題
px.scatter( iris, # 資料集 x="sepal_width", # 橫座標值 y="sepal_length", # 縱座標取值 color="species", # 顏色 marginal_x="box", # 橫座標為箱型圖 marginal_y="histogram", # 縱座標為直方圖 height=600, # 高度 trendline="ols", # 顯示趨勢線 template="plotly_dark") # 主題
6. 總結一下本文中利用大量的篇幅講解了如何透過plotly_express來繪製:柱狀圖、線型圖、散點圖、小提琴圖、極座標圖等各種常見的圖形。透過觀察上面Plotly_express繪製圖形過程,我們不難發現它有三個主要的優點:
快速出圖,少量的程式碼就能滿足多數的製圖要求。基本上都是幾個引數的設定我們就能快速出圖圖形漂亮,繪製出來的視覺化圖形顏色亮麗,也有很多的顏色供選擇。圖形是動態視覺化的。文章中圖形都是截圖,如果是在Jupyter notebook中都是動態圖形希望透過本文的講解能夠幫助堵住快速入門plotly_express視覺化神器