一個(gè)經(jīng)典案例掌握 Plotly 餅圖繪制技巧
Plotly庫(kù)以其卓越的交互性和定制能力,使得創(chuàng)建這種精美的多餅圖布局成為可能。本文將通過(guò)一個(gè)案例,展示如何利用 Plotly 繪制一組相互關(guān)聯(lián)、視覺效果的餅圖。
一、準(zhǔn)備工作
開始創(chuàng)作前,請(qǐng)確保你的 Python 環(huán)境已安裝 Plotly 和 Pandas:
pip install plotly pandas
導(dǎo)入所需模塊:
import plotly.graph_objects as go
from plotly.subplots import make_subplots # 導(dǎo)入用于創(chuàng)建子圖的函數(shù)
import plotly.express as px
import pandas as pd
二、案例:網(wǎng)站流量來(lái)源與用戶設(shè)備類型分析
1. 場(chǎng)景
假設(shè)我們需要分析一個(gè)網(wǎng)站的流量構(gòu)成,我們關(guān)心兩個(gè)核心問(wèn)題:
- 用戶主要通過(guò)哪些來(lái)源(如搜索引擎、社交媒體、直接訪問(wèn)等)訪問(wèn)網(wǎng)站?
- 訪問(wèn)用戶主要使用哪些設(shè)備類型(如桌面電腦、移動(dòng)設(shè)備、平板電腦)?
我們希望將這兩個(gè)不同視角的數(shù)據(jù)并排展示在同一張圖上,以便快速比較和理解用戶行為的全貌。
2. 數(shù)據(jù)準(zhǔn)備
我們需要準(zhǔn)備兩個(gè)獨(dú)立但相關(guān)的數(shù)據(jù)集:一個(gè)描述流量來(lái)源及其占比,另一個(gè)描述設(shè)備類型及其占比。
# 網(wǎng)站流量來(lái)源數(shù)據(jù) (模擬)
traffic_source_data = {
'Source': ['搜索引擎', '社交媒體', '直接訪問(wèn)', '推薦鏈接', '付費(fèi)廣告'],
'Visits': [55000, 25000, 15000, 8000, 7000]
}
df_source = pd.DataFrame(traffic_source_data)
df_source['Percentage'] = (df_source['Visits'] / df_source['Visits'].sum() * 100).round(1)
# 用戶設(shè)備類型數(shù)據(jù) (模擬)
device_type_data = {
'Device': ['桌面電腦', '移動(dòng)設(shè)備', '平板電腦'],
'Users': [42000, 63000, 5000]
}
df_device = pd.DataFrame(device_type_data)
df_device['Percentage'] = (df_device['Users'] / df_device['Users'].sum() * 100).round(1)
print("--- 流量來(lái)源數(shù)據(jù) ---")
print(df_source)
print("\n--- 設(shè)備類型數(shù)據(jù) ---")
print(df_device)
我們創(chuàng)建了兩個(gè)獨(dú)立的 Pandas DataFrame,分別存儲(chǔ)流量來(lái)源和設(shè)備類型的數(shù)據(jù),并計(jì)算了各自的百分比,為繪制餅圖做好準(zhǔn)備。
3. 繪制餅圖
我們將使用 make_subplots 創(chuàng)建一個(gè)包含兩個(gè)餅圖的布局,并對(duì)每個(gè)餅圖進(jìn)行精細(xì)的視覺和交互設(shè)計(jì)。
# 確保已運(yùn)行上方數(shù)據(jù)準(zhǔn)備代碼
# 創(chuàng)建一個(gè) 1 行 2 列的子圖布局,指定類型為 'domain' 用于餅圖
fig = make_subplots(rows=1, cols=2,
specs=[[{'type':'domain'}, {'type':'domain'}]], # 定義子圖類型
subplot_titles=("流量來(lái)源分布", "用戶設(shè)備類型")) # 設(shè)置子圖標(biāo)題
# --- 第一個(gè)餅圖:流量來(lái)源 ---
fig.add_trace(go.Pie(
labels=df_source['Source'],
values=df_source['Visits'],
name='來(lái)源', # 用于圖例和懸停
hole=0.5, # 甜甜圈效果
marker=dict(
colors=px.colors.sequential.Blues_r, # 使用 Plotly Express 的反轉(zhuǎn)藍(lán)色調(diào)色板
line=dict(color='#ffffff', width=2)
),
textinfo='percent', # 扇區(qū)內(nèi)顯示百分比
insidetextorientatinotallow='radial',
hovertemplate='<b>來(lái)源:</b> %{label}<br><b>訪問(wèn)量:</b> %{value:,}<br><b>占比:</b> %{percent:.1%}<extra></extra>',
pull=[0.1, 0, 0, 0, 0] # 突出顯示“搜索引擎”
), row=1, col=1) # 指定添加到第1行第1列
# --- 第二個(gè)餅圖:設(shè)備類型 ---
fig.add_trace(go.Pie(
labels=df_device['Device'],
values=df_device['Users'],
name='設(shè)備',
hole=0.5,
marker=dict(
colors=px.colors.sequential.Greens_r, # 使用 Plotly Express 的反轉(zhuǎn)綠色調(diào)色板
line=dict(color='#ffffff', width=2)
),
textinfo='percent',
insidetextorientatinotallow='radial',
hovertemplate='<b>設(shè)備:</b> %{label}<br><b>用戶數(shù):</b> %{value:,}<br><b>占比:</b> %{percent:.1%}<extra></extra>',
pull=[0, 0.1, 0] # 突出顯示“移動(dòng)設(shè)備”
), row=1, col=2) # 指定添加到第1行第2列
# --- 整體布局與美化 ---
fig.update_layout(
title_text='網(wǎng)站流量分析:來(lái)源與設(shè)備概覽', # 主標(biāo)題
title_x=0.5, # 標(biāo)題居中
# 設(shè)置統(tǒng)一的字體和背景
fnotallow=dict(family="Arial, sans-serif", size=12, color='#333'),
paper_bgcolor='rgba(248, 248, 255, 1)', # 設(shè)置淡雅的背景色 (Ghost White)
plot_bgcolor='rgba(0,0,0,0)', # 繪圖區(qū)域背景透明
# 統(tǒng)一圖例樣式 (Plotly 會(huì)自動(dòng)處理多個(gè)餅圖的圖例)
legend=dict(
orientatinotallow="h", yanchor="bottom", y=-0.1, xanchor="center", x=0.5
),
# 在甜甜圈中心添加注釋顯示總數(shù) (可選,增加信息量)
annotatinotallow=[
dict(text=f'總訪問(wèn)<br>{df_source["Visits"].sum():,}', x=0.18, y=0.5, font_size=16, showarrow=False),
dict(text=f'總用戶<br>{df_device["Users"].sum():,}', x=0.82, y=0.5, font_size=16, showarrow=False)
],
margin=dict(t=80, l=20, r=20, b=40) # 調(diào)整邊距給標(biāo)題和圖例留出空間
)
# 顯示圖表
fig.show()
# # 或者保存為獨(dú)立的 HTML 文件
# fig.write_html("stunning_subplot_pie_charts.html")
三、總結(jié)
當(dāng)需要展示同一數(shù)據(jù)的不同維度比例,或比較不同數(shù)據(jù)集的構(gòu)成時(shí),Plotly的子圖餅圖組合提供了一種強(qiáng)大而優(yōu)雅的解決方案。通過(guò) make_subplots 創(chuàng)建布局,為每個(gè)餅圖應(yīng)用精美的樣式(如甜甜圈、顏色方案、描邊、注釋),并利用 Plotly 內(nèi)在的交互性,我們可以將多個(gè)簡(jiǎn)單的比例圖提升為信息豐富、視覺驚艷的數(shù)據(jù)敘事工具。