首頁>技術>

今天給大家推薦一個視覺化神器 - 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_dark
px.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視覺化神器

19
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Skynet伺服器框架--Socket服務原始碼剖析和應用