天天看點

進階可視化神器Plotly快速入門

微信公衆号:尤而小屋

作者:Peter

編輯:Peter

一文愛上進階可視化神器Plotly

資料可視化已經逐漸發展和深入到我們生活的各個方面,往往遇到資料分析類的工作,借助可視化的方式來呈現我們的資料和結論,能夠幫助我們更好地了解資料本身的含義和背後隐藏的規律。

資料通常是以圖形或者圖表的形式進行展示,例如Excel表格、柱狀圖、折線圖、餅圖、旭日圖等。

現在出現了很多可視化的工具能夠實作資料圖表的可視化展示,比如Tableau、Power BI等;和python相關的第三方可視化庫也數不勝數,比如很傳統和基礎的matplotlib、pyecharts、Seaborn,還比如D3、Highcharts等。它們有着自己或多或少的使用缺陷:

  • 繪制出來的圖形是靜态的:無法實作動态可視化
  • 部分軟體需要付費才能使用;否則隻能使用部分基礎功能
  • 有些可視化庫涉及到很多前端JavaScript、HTML的知識,上手比較困難
  • 配置麻煩:簡單的圖形也需要大量的代碼進行配置

Plotly簡介

Plotly是一款用來做資料分析和可視化的線上平台,功能真的是非常強大,它主要有以下特點:

  1. 圖形多樣化:線上繪制多種圖形,比如柱狀圖、餅圖、直方圖、餅圖、氣泡圖、桑基圖、股票圖、旭日圖、聯合分布圖、地圖等
  2. 線上可編輯:Plotly中有線上編輯的平台,可以将生成的圖形儲存到該平台,并進行分享
  3. 開源免費:Plotly的所有資源都是開源免費的,使用者可直接使用,還可以直接和R、python、MATLAB等軟體或者語言無縫對接
  4. 圖形動态化:Plotly生成的圖形全部是動态化;Plotly的繪圖最好在Jupyter notebook中進行,能夠很好地顯示動态效果
  5. 顔色絢麗:在使用Plotly繪制圖形的時候,我們可以進行圖形顔色的設定,Plotly提供了豐富的顔色面闆供選擇
  6. 代碼量少:Plotly繪圖,尤其是Plotly的進階封裝Plotly_Express,代碼量非常少;一行代碼就能實作多種功能且精美的圖形
  7. 内置豐富資料集:在Plotly中内置7個不同類型的資料集,友善讀者直接使用内置資料進行學習、使用
  8. 文檔健全:Plotly官方提供了豐富的文檔資料和案例可免費學習,能夠快速的上手

附錄:在官網中展示了Plotly能夠繪制的部分圖形:https://plotly.com/python/

進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門

安裝和使用

可視化庫Plotly及子庫的安裝非常簡單,隻需要通過兩條指令:

pip install plotly
pip install plotly_express  # 安裝
           

使用之前先導入:

# 兩種繪圖接口
import plotly_express as px  # import plotly.express as px
import plotly.graph_objects as go
           

上面介紹了兩種Plotly中繪圖的接口:

  • plotly_express:通常是簡寫為px
  • plotly.graph_objects:通常簡寫為go

内置資料集

在Plotly中内置了非常多的資料集,當我們導入了之後可以直接使用:

1、内置GDP資料集

gapminder = px.data.gapminder() 
gapminder.head()   # 檢視前5行資料
           
進階可視化神器Plotly快速入門

2、餐廳消費的資料集

tips = px.data.tips()  
tips.head()
           
進階可視化神器Plotly快速入門

3、資料領域非常著名的鸢尾花資料集

iris = px.data.iris()  
iris.head()
           
進階可視化神器Plotly快速入門

4、一份風力資料集

wind = px.data.wind()        
wind.head()
           
進階可視化神器Plotly快速入門

5、選舉結果資料集

election = px.data.election() 
election.head()  # 顯示前5行資料
           
進階可視化神器Plotly快速入門

上面隻列出了Plotly中的部分資料集,下面的導圖記錄了全部的内置資料作用及其相應的字段,可供使用者免費使用,非常友好:

進階可視化神器Plotly快速入門

Plotly繪圖

上面介紹了可視化和Plotly的相關知識,下面将通過各種實際的案例來講解如何利用Plotly繪制相關的可視化圖形。

所有的圖像在Jupyter notebook中都是動态可視化,本文采取的是截圖方式來展示可視化結果。

基礎散點圖

1、繪制基礎的散點圖,如果是直接傳入兩個軸的資料,需要2個參數:

fig = px.scatter(   # scatter繪制散點圖
  x=[0,2,4,6],    #  x軸
  y=[1,3,5,7]  # y軸
)

fig.show()
           
進階可視化神器Plotly快速入門

2、如果是使用pandas中的資料庫DataFrame來繪制圖像:

df = px.data.iris()   # 鸢尾花資料集
df.head()
           
進階可視化神器Plotly快速入門
fig = px.scatter(
  df,  # 資料集
  x="sepal_width",  # x軸
  y="sepal_length"  # y軸
)
fig.show()
           
進階可視化神器Plotly快速入門

3、還可以傳入一個顔色參數color,可以選擇字元型或者資料型:

  • 字元型資料
fig = px.scatter(
  df,  # 資料集
  x="sepal_width",  # x軸
  y="sepal_length",  # y軸
  color="species",  # 指定顔色:字元型資料
)
fig.show()
           
進階可視化神器Plotly快速入門
  • 數值型資料
fig = px.scatter(
  df,  # 資料集
  x="sepal_width",  # x軸
  y="sepal_length",  # y軸
  color="sepal_length"  # 指定顔色
)
fig.show()
           
進階可視化神器Plotly快速入門

4、傳入size參數控制每個點的大小,相當于是在制作氣泡圖

gap = px.data.gapminder().query("year == 2002")

fig = px.scatter(
  gap   # 繪圖資料
  ,x="gdpPercap"  # x軸
  ,y="lifeExp"  # y軸
  ,color="continent"  # 顔色參數
  ,size="pop"   # 點的大小
  ,size_max=60  # 點的最大值
)

fig.show()
           
進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門

5、散點圖中顯示每個點的資料

x_data = [0,2,4,6,8]
y_data = [1,3,5,7,9]

fig = px.scatter(x=x_data,
                 y=y_data,
                 color=x_data,  # 顔色設定
                 text=x_data  # 顯示内容
                )
fig.update_traces(textposition="top center")  # 顯示位置:頂部居中

fig.show()
           
進階可視化神器Plotly快速入門

6、繪制折線圖:折線圖可以了解成散點圖的一種極限形式,下面例子中使用go方法實作

import plotly.graph_objects as go


import numpy as np
np.random.seed(1)

# 生成随機資料
N = 200
random_x = np.linspace(0, 1, N)
random_y0 = np.random.randn(N) + 10
random_y1 = np.random.randn(N)
random_y2 = np.random.randn(N) - 10

# 準備畫布
fig = go.Figure()

# 添加3組不同的資料
fig.add_trace(go.Scatter(  # 
    x=random_x, 
    y=random_y0,               
    mode='lines', # mode模式              
    name='lines')) # 名字

fig.add_trace(go.Scatter(
    x=random_x, 
    y=random_y1,           
    mode='lines+markers',              
    name='lines+markers'))

fig.add_trace(go.Scatter(
    x=random_x, 
    y=random_y2,                 
    mode='markers',               
    name='markers'))

fig.show()
           
進階可視化神器Plotly快速入門

7、繪制3D散點圖

import plotly.express as px

df = px.data.iris()

fig = px.scatter_3d(
  df,  # 指定資料
  x='sepal_length',  # 指定xyz
  y='sepal_width', 
  z='petal_width',
  color='species')  # 指定顔色

fig1.show()
           
進階可視化神器Plotly快速入門

繪制柱狀圖

1、基礎柱狀圖

自行模拟一份資料集:

df1 = pd.DataFrame({
    "name": ["小明","小紅","周明","周紅","張三"],
    "age": [20,28,18,25,36],
    "score": ["150","170","160","168","154"]
})

df1
           
進階可視化神器Plotly快速入門
fig = px.bar(
  df1,  # 繪圖資料
  x="name",  # x軸
  y="age"    # y軸
)

fig.show()
           
進階可視化神器Plotly快速入門

2、加上改變顔色的參數color

fig = px.bar(
  df1,
  x="name",
  y="age",
  color="age"   # 顔色參數
)
fig.show()
           
進階可視化神器Plotly快速入門

3、設定圖中的懸停資訊

懸停資訊指的是:當我們光标放到圖形上去才會顯示的資訊

第一種是基于px方法實作的懸停資訊:

fig = px.bar(
  df1,
  x="name",
  y="age",
  color="age",  # 加上顔色參數
  hover_data = ['score']   # 懸停參數
)
fig.show()
           
進階可視化神器Plotly快速入門

第二種是基于go方法實作的懸停資訊:

import plotly.graph_objects as go

name = ['Product A', 'Product B', 'Product C']
number = [1200, 1500, 1300]

fig = go.Figure(data=[go.Bar(x=name, 
                             y=number,
                             hovertext=['20% 市場佔有率 ', '50% 市場佔有率', '30% 市場佔有率'])])

fig.update_traces(marker_color='rgb(15,110,225)', # marker顔色
                  marker_line_color='rgb(108,48,107)', # 線條顔色
                  marker_line_width=1.5,   # 線寬
                  opacity=0.6)  # 透明度

fig.update_layout(title_text='3種産品市場佔有率對比')

fig.show()
           
進階可視化神器Plotly快速入門

4、x軸标簽傾斜設定

模拟一份新的資料:

information = pd.DataFrame({
    "days":["2021年3月1日 星期一",
            "2021年3月2日 星期二",
            "2021年3月3日 星期三",
            "2021年3月4日 星期四",
            "2021年3月5日 星期五"],
  
    "number":[400,700,300,500,800]
})

information
           
進階可視化神器Plotly快速入門

預設情況下x軸标簽是水準顯示:

fig = px.bar(
  information,
  x="days",
  y="number")

fig.show()   # 預設水準顯示
           
進階可視化神器Plotly快速入門
fig = px.bar(
  information,
  x="days",
  y="number")

fig.update_layout(xaxis_tickangle=-45)   # 傾斜角度設定

fig.show()   # 結果是向左傾斜
           
進階可視化神器Plotly快速入門

基于go方法實作的x軸标簽傾斜:

import plotly.graph_objects as go

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

# 生成畫布對象
fig = go.Figure()  

# 添加多個圖形軌迹
fig.add_trace(go.Bar(
    x=months,
    y=[20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17],
    name='産品A',
    marker_color='lightblue'  # 顔色的不同表示方法
))

fig.add_trace(go.Bar(
    x=months,
    y=[19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16],
    name='産品B',
    marker_color='#af0110'
))

fig.update_layout(barmode='group',  # 柱狀圖模式
                  xaxis_tickangle=-45   # 傾斜角度
                 )
fig.show()
           
進階可視化神器Plotly快速入門

5、分組柱狀圖

第一種情況是基于長表形式的分組柱狀圖:

df2 = pd.DataFrame({
    "姓名": ["小明","小紅","張三","小明","小紅","張三","小明","小紅","張三"],
    "科目":["國文","國文","國文","數學","數學","數學","英語","英語","英語"],
    "得分": [58,78,84,90,71,90,64,84,69]
})

df2
           
進階可視化神器Plotly快速入門
fig = px.bar(
  df2,
  x="姓名",
  y="得分",
  color="科目")

fig.show()
           
進階可視化神器Plotly快速入門

第二種情況是基于寬表形式的分組柱狀圖:

df3 = pd.DataFrame({
    "姓名": ["小明","小紅","張三"],
    "國文":[58,78,84],
    "數學":[90,71,90],
    "英語":[64,84,69]
})

df3
           
進階可視化神器Plotly快速入門
fig = px.bar(
  df3,
  x="姓名",
  y=["國文","數學","英語"],
  title="學生成績對比"  # 添加标題
)
fig.show()
           
進階可視化神器Plotly快速入門

6、多面柱狀圖

使用的是Plotly中自帶的餐廳消費資料集:

進階可視化神器Plotly快速入門
fig = px.bar(
  df4,   # 帶繪圖資料 
  x="sex",  # x軸
  y="total_bill",   # y軸
  color="smoker",  # 顔色的設定
  barmode="group",  # 柱狀圖4種模式之一
  facet_row="time",  #  行
  facet_col="day",  # 列
  category_orders={
    "day": ["Thur", "Fri", "Sat", "Sun"],
    "time": ["Lunch", "Dinner"]   # 分類順序設定
  }
)

fig.show()
           
進階可視化神器Plotly快速入門

7、改變柱狀圖基準位置

import plotly.graph_objects as go

years = ['2017','2019','2021']

fig = go.Figure()

fig.add_trace(go.Bar(
    x=years, 
    y=[2000, 3000, 5000],
    base=[-2000,-3000,-5000],  # 基準位置設定
    marker_color='crimson',
    name='商家A'))

fig.add_trace(go.Bar(
    x=years, 
    y=[3000, 4000, 2000],
    base=0,  # 預設的基準設定
    marker_color='lightslategrey',
    name='商家B'
))

fig.show()
           
進階可視化神器Plotly快速入門

8、改變圖例位置和顔色

有時候我們需要改變圖例的顔色和位置,進行如下設定:

import plotly.graph_objects as go

subjects = ["國文","數學","英語","實體","化學","生物"]

fig = go.Figure()
fig.add_trace(go.Bar(
    x=subjects,   # x軸、y軸資料             
    y=[90,85,78,90,99,80],                
    name='周均',  # 圖例名稱           
    marker_color='rgb(15, 83, 109)'  # 該組資料顔色
                
))

fig.add_trace(go.Bar(
    x=subjects,               
    y=[80,89,68,100,78,90],               
    name='小明',               
    marker_color='rgb(180, 118, 255)'
                ))

fig.update_layout(
    title='期末成績對比情況',  # 整個圖的标題
    xaxis_tickfont_size=12,   # x軸字型大小
    yaxis=dict(
        title='成績',  # y軸的标題
        titlefont_size=16,  # 标題大小
        tickfont_size=6,  # y軸上的數值大小
    ),
    legend=dict(
        x=0,  # 圖例的位置
        y=1,
#         bgcolor='rgba(255, 255, 255, 0)',  # 圖例的背景色
        bordercolor='rgba(112, 255, 255, 0)'   # 邊緣顔色
    ),
    barmode='group',  # 柱狀圖模式
    bargap=0.5,  # 組間距離
    bargroupgap=0.4  # 組内距離
)

fig.show()
           
進階可視化神器Plotly快速入門

繪制水準柱狀圖

1、基于px實作水準柱狀圖,加上參數orientation=‘h’

df1 = pd.DataFrame({
    "name": ["小明","小紅","周明","周紅","張三"],
    "age": [20,28,18,25,36],
    "score": ["150","170","160","168","154"]
})

df1
           
進階可視化神器Plotly快速入門
fig = px.bar(
    df1,
    y="name",   # xy軸的資料需要交換
    x="age",
    orientation='h',   # 水準柱狀圖
    text="age"   # 需要顯示的資料
)

# 設定文本顯示的位置,預設是裡面
# fig.update_traces(textposition="outside")  # ['inside', 'outside', 'auto', 'none']

fig.show()
           
進階可視化神器Plotly快速入門

2、改變柱狀圖顔色

第一種方法是使用顔色參數color

fig = px.bar(
    df1,
    y="name",   
    x="age",
    color="age",  # 顔色參數
    orientation='h',   # 水準柱狀圖
    text="age"   
)

fig.update_traces(textposition="outside")  # ['inside', 'outside', 'auto', 'none']

fig.show()
           
進階可視化神器Plotly快速入門

第二種情況是自定義顔色

fig = px.bar(
    df1,
    y="name",   
    x="age",
#     color="age",
    # 自定義顔色
    color_discrete_sequence=px.colors.diverging.RdBu,
    orientation='h',   # 水準柱狀圖
    text="age"   
)

fig.update_traces(textposition="outside")  # ['inside', 'outside', 'auto', 'none']

fig.show()
           
進階可視化神器Plotly快速入門

3、基于go方法實作

fig = go.Figure(go.Bar(
            x=df1["score"].tolist(),  # x軸資料
            y=df1["name"].tolist(),  # y軸資料
            orientation='h'))

fig.show()
           
進階可視化神器Plotly快速入門

4、分組水準柱狀圖

import plotly.graph_objects as go

# 生成畫布
fig = go.Figure()

# 添加3個圖形軌迹
fig.add_trace(go.Bar(
    y=['小明', '小紅', '張三'],
    x=[120, 74, 103],
    name='國文',
    orientation='h',
    marker=dict(
        color='rgba(246, 78, 139, 0.6)',
        line=dict(color='rgba(246, 78, 139, 1.0)', width=3)
    )
))

fig.add_trace(go.Bar(
    y=['小明', '小紅', '張三'],
    x=[92, 128, 89],
    name='數學',
    orientation='h',
    marker=dict(
        color='rgba(5, 71, 80, 0.6)',
        line=dict(color='rgba(58, 71, 80, 1.0)', width=3)
    )
))

fig.add_trace(go.Bar(
    y=['小明', '小紅', '張三'],
    x=[92, 78, 69],
    name='英語',
    orientation='h',
    marker=dict(
        color='rgba(18, 7, 80, 0.6)',
        line=dict(color='rgba(58, 71, 80, 1.0)', width=3)
    )
))

fig.update_layout(barmode='stack')  # 堆疊模式:['stack', 'group', 'overlay', 'relative']

fig.show()
           
進階可視化神器Plotly快速入門

繪制漏鬥圖

漏鬥圖在電商銷售領域使用的非常普遍,它能夠明顯地觀察到不同階段之間的轉化效果,下面通過不同的例子來講解漏鬥圖的制作。

1、普通漏鬥圖

自行模拟一份資料:

data1 = pd.DataFrame({
    "number": [1200,900,700,400,180,100],
    "stage": ["浏覽網站","搜尋","加購","送出訂單","點選支付","支付成功"]}
)
data1
           
進階可視化神器Plotly快速入門
# 繪圖
fig = px.funnel(
    data1,   # 繪圖資料
    x="number",  # x軸資料
    y="stage"  # y軸資料
)

fig.show()
           
進階可視化神器Plotly快速入門

通過go方法來實作基礎漏鬥圖:

from plotly import graph_objects as go

fig = go.Figure(go.Funnel(
    x=[1000,800,400,100],
    y=["浏覽網站","加購","點選支付","支付成功"]
))

fig.show()
           
進階可視化神器Plotly快速入門

還可以給漏鬥圖改變顔色,隻需要加上顔色參數color

# 加上顔色參數color

fig = px.funnel(
  data1[::-1],   # 資料翻轉
  x="number",
  y="stage",
  color="stage"   # 改成stage
)

fig.show()
           
進階可視化神器Plotly快速入門

2、分組漏鬥組的展示

将不同組别的漏鬥圖放在一個大的畫布中,我們生成2020年3月份和2021年3月份的資料,繪制分組漏鬥圖:

# 2020年3月資料

stage=["浏覽網站","加購","點選支付","支付成功"]

df1 = pd.DataFrame(dict(
    number=[1000,800,400,100],
    stages=stage
))

df1["time"] = "2020年3月"
df1
           
進階可視化神器Plotly快速入門
# 2021年3月份

stage=["浏覽網站","加購","點選支付","支付成功"]
df2 = pd.DataFrame(dict(
    number=[1200,600,300,140],
    stages=stage
))

df2["time"] = "2021年3月"
df2
           
進階可視化神器Plotly快速入門

上面生成了兩個月份的不同資料,現在通過concat函數進行資料的合并:

# 将兩組資料合并
df3 = pd.concat([df1, df2], axis=0)
df3
           
進階可視化神器Plotly快速入門

最後通過funnel()方法來繪圖:

# 繪圖

fig = px.funnel(df3,x="number",y="stages",color="time")
fig.show()
           
進階可視化神器Plotly快速入門

3、通過go方法來實作分組漏鬥

from plotly import graph_objects as go

stage = ["浏覽網站","加購","點選支付","支付成功"]

fig = go.Figure()

fig.add_trace(go.Funnel(
    name = "2020年3月",  # 圖形軌迹名稱
    x = [1000,800,400,200],  # 資料
    y = stage, # 每個階段名稱
    orientation = "h",  # 方位
    textposition = "inside",  # 文本内容的位置
    textinfo = "value+percent previous"  # 顯示文本内容
))


fig.add_trace(go.Funnel(
    name = "2021年2月",   # 名稱和資料需要改變
    x = [1200,900,500,240],  
    y = stage, 
    orientation = "h",  
    textposition = "inside",  
    textinfo = "value+percent total"  
))

fig.add_trace(go.Funnel(
    name = "2021年3月",  # 名稱和資料需要改變
    x = [1500,1000,450,300],  
    y = stage, 
    orientation = "h",  
    textposition = "inside",  
    textinfo = "label+percent initial"  
))

fig.show()
           
進階可視化神器Plotly快速入門

繪制餅圖

餅圖在可視化圖表中是一種非常常見的圖,它能夠很好地展示不同組别的占比情況,下面通過具體的案例來繪制不同需求的餅圖。

1、基礎餅圖的繪制

模拟一份水果店的進貨數量的資料,如下表:

fruit = pd.DataFrame({
    "name":["蘋果","香蕉","梨","鳳梨","葡萄"],
    "number":[1000,800,600,2000,2500]
})

fruit
           
進階可視化神器Plotly快速入門
fig = px.pie(
  fruit,  # 繪圖資料
  names="name",  # 顯示的名稱
  values="number"  # 顯示的資料
)

fig.show()
           
進階可視化神器Plotly快速入門

基于go方法實作基礎餅圖:

import plotly.graph_objects as go

name=fruit["name"].tolist()
value=fruit["number"].tolist()  

fig = go.Figure(
    data=[go.Pie(
        labels=name,  # 标簽
        values=value  # 顯示資料
    )]
)

fig.show()
           

結果和上面的圖形相同

2、給餅圖添加标題,并改變位置

fig = px.pie(
  fruit,
  names="name",
  values="number"
)

fig.update_layout(
    title={   # 設定整個标題的名稱和位置
        "text":"水果數量占比",  # 标題
        "y":0.96,  # 通過4個參數控制标題位置
        "x":0.5,
        "xanchor":"center",
        "yanchor":"top"
    }
)

fig.show()
           
進階可視化神器Plotly快速入門

3、改變餅圖顔色

上面繪制的餅圖是預設的顔色,我們可以對顔色進行設定

第一種是加上顔色參數color:

fig = px.pie(
  fruit,
  names="name",
  values="number",
  color="number"  # 顔色參數
)
fig.show()
           
進階可視化神器Plotly快速入門

第二種是通過參數

color_discrete_sequence

fig = px.pie(
  fruit,
  names="name",
  values="number",
  # 不同顔色:RdBu、Peach
  color_discrete_sequence=px.colors.sequential.Plotly3   # Plotly3可以變成不同顔色
)
fig.show()
           
進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門

第三種是通過字典的形式來設定顔色:

fig = px.pie(
  fruit,
  names="name",
  values="number",
  color="name",
  color_discrete_map={   # 下面是通過字典形式來設定每個分組的顔色
    '葡萄':'lightcyan',
    '鳳梨':'cyan',
    '蘋果':'royablue',
    '香蕉':'darkblue',
    '梨':'red'}
)
fig.show()
           
進階可視化神器Plotly快速入門

4、餅圖文本資訊設定

fig = px.pie(
  fruit,
  names="name",
  values="number"
)

fig.update_traces(
  # 文本顯示的4種位置:['inside', 'outside', 'auto', 'none']
  textposition='inside',   
  # percent、label、value的組合或者單獨出現
  textinfo='percent+label',  
  # 文本資訊的3種朝向:horizontal(預設)、radial、tangential
  insidetextorientation='horizontal'
)

fig.show()
           
進階可視化神器Plotly快速入門
進階可視化神器Plotly快速入門

5、甜甜圈圖的繪制

甜甜圈圖指的是餅圖的中間出現了一個空洞部分:

import plotly.graph_objects as go

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [3000, 1500, 1000, 2500]

fig = go.Figure(data=[go.Pie(
    labels=labels, 
    values=values, 
    hole=.4   # 空洞的比例大小
)])

fig.show()
           
進階可視化神器Plotly快速入門

6、剝離扇形區域

import plotly.graph_objects as go

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [3000, 1000, 4000, 2500]

fig = go.Figure(data=[go.Pie(
    labels=labels, 
    values=values, 
    pull=[0.3,0.1,0,0]  # 設定脫離參數
)])

fig.show()
           
進階可視化神器Plotly快速入門

7、旭日圖的制作

我們以Plotly中自帶的tips消費資料來繪制旭日圖:

進階可視化神器Plotly快速入門
fig = px.sunburst(
  tips,
  path=['day','time','sex'],  # 最裡層是day,中間是time,最外層是sex
  values='total_bill'
)

fig.show()
           
進階可視化神器Plotly快速入門

給旭日圖設定顔色:

df = px.data.tips()
fig = px.sunburst(
  df, 
  path=['time', 'sex', 'day'],  # 從最裡層到最外層
  values='total_bill',   # 資料
  color='day'   # 顔色
)
fig.show()
           
進階可視化神器Plotly快速入門

繪制面積圖

使用的是Plotly中自帶的gdp資料集:

進階可視化神器Plotly快速入門
# area 圖
px.area(
  gapminder,  # 資料集  
  x="year",  # xy軸的資料
  y="pop",
  color="continent",  # 顔色
  line_group="country"  # 線型分組
)
           
進階可視化神器Plotly快速入門

繪制直方圖

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"]})
           
進階可視化神器Plotly快速入門

聯合分布圖

聯合分布圖是将多個不同類型的圖形放置在一個大的畫布中,比如我們使用鸢尾花資料集繪制聯合分布圖:

px.scatter(
    iris,
    x="sepal_width",
    y="sepal_length",
    color="species",
    marginal_x="histogram",
    marginal_y="rug"
)
           
進階可視化神器Plotly快速入門

繪制散點矩陣圖

散點矩陣圖是将多個散點圖并排顯示,同時顯示不同名額之間的關系:

使用Plotly中自帶的iris資料集:

進階可視化神器Plotly快速入門
px.scatter_matrix(
  iris,  # 繪圖資料
  dimensions=["sepal_width","sepal_length","petal_width","petal_length"],  # 不同的名額
  color="species"  # 顔色
)
           
進階可視化神器Plotly快速入門

繪制密度圖

第一種是繪制密度熱力圖:

px.density_heatmap(
  iris,
  x="sepal_width",
  y="sepal_length",
  marginal_y="rug",
  marginal_x="histogram"   # 在密度圖的基礎上,指定另外兩種圖形
)
           
進階可視化神器Plotly快速入門

第二種是繪制等值線圖:

px.density_contour(
  iris,  # 傳入繪圖資料
  x="sepal_width",  # 指定xy軸
  y="sepal_length",
  color="species",  # 顔色設定
  marginal_x="rug",  # 需要傳入邊緣圖形
  marginal_y="histogram"   
)
           
進階可視化神器Plotly快速入門

繪制并行分類圖

使用的是餐廳消費資料tips

px.parallel_categories(
    tips,  # 傳入資料
    color="size",  # 顔色取值
    color_continuous_scale=px.colors.sequential.Inferno # 顔色變化趨勢
)
           
進階可視化神器Plotly快速入門

繪制地圖圖形

第一種方法是通過

px.choropleth

px.choropleth(
  gapminder,   # 繪圖資料
  locations="iso_alpha",  # 位置
  color="lifeExp",  # 顔色
  hover_name="country",  # 懸停資訊
  animation_frame="year",  # 播放按鈕設定
  color_continuous_scale=px.colors.sequential.Plasma,  # 顔色連續變化
  projection="natural earth"  # 地圖選擇
) 
           
進階可視化神器Plotly快速入門

第二種方法是通過

line_geo

實作:

gapminder = px.data.gapminder()

# gapminder_2002 = gapminder.query("year==2002")

gapminder_2002 = gapminder[gapminder["year"] == 2002]
gapminder_2002

px.line_geo(
  gapminder_2002,
  locations="iso_alpha",
  color="continent",
  projection="orthographic")
           
進階可視化神器Plotly快速入門

繪制矩陣式樹狀圖

# 選取2002年資料
gapminder_2002 = gapminder[gapminder["year"] == 2002]

px.treemap(
    gapminder_2002, # 資料
    path=[px.Constant('world'), 'continent', 'country'],   # 繪圖路徑:world---continent---country
    values='pop',  # 資料取值
    color='pop',   # 顔色取值
    hover_data=['iso_alpha'])  # 顯示資料:國家簡稱
           
進階可視化神器Plotly快速入門

繪制散點極坐标圖

使用的是Plotly中自帶的風力wind資料集:

進階可視化神器Plotly快速入門
px.scatter_polar(
    wind,  #  資料集
    r="frequency",  # 半徑
    theta="direction",   # 角度
    color="strength",  # 顔色
    symbol="strength",  # 符号
    color_discrete_sequence=px.colors.sequential.Plasma_r)  # 顔色
           
進階可視化神器Plotly快速入門

改變圖形的背景主題再繪制一次:

fig = px.bar_polar(
    wind,   # 資料集
    r="frequency",   # 半徑
    theta="direction",  # 角度
    color="strength",  # 顔色
    template="plotly_dark",  # 主題
    color_discrete_sequence=px.colors.sequential.Plasma_r)  # 顔色
fig.show()
           
進階可視化神器Plotly快速入門

顔色面闆

Plotly中内置了多種顔色面闆可供使用者使用,顔色可任意選擇,下面進行介紹:

順序色标系列

漸變的顔色系列,适用于大多數連續資料進行繪圖:

進階可視化神器Plotly快速入門

定性色标系列

該系列的顔色是離散型的,每個子顔色都不相同或者相近,适用于沒有自然順序的資料進行繪圖:

進階可視化神器Plotly快速入門

分散色标系列

适合于具有自然中點的連續資料,色系會出現突變:

進階可視化神器Plotly快速入門

周期性色标系列

該色标系列适用于具有自然周期結構的連續資料

進階可視化神器Plotly快速入門

ColorBrewer2系列

進階可視化神器Plotly快速入門

CMOcean系列

進階可視化神器Plotly快速入門

卡通主題系列

這是一個卡通系列的顔色面闆,顔色是漸變型的

進階可視化神器Plotly快速入門

總結

本文着重講解了一個新的進階可視化神器:Plotly。從其特點、安裝、内置資料集、各種精美圖表制作案例介紹、顔色面闆等,詳細地介紹了Plotly的使用,希望能夠對讀者有所幫助,也希望讀者能夠愛上這個進階可視化神器。