# Python數據可視化中的環形圖是怎樣的
## 引言
在數據可視化領域,環形圖(Donut Chart)作為一種經典的圖表類型,因其簡潔美觀和高效傳達信息的能力而廣受歡迎。Python作為數據科學領域的主流語言,提供了多種強大的庫來創建環形圖。本文將深入探討環形圖的概念、應用場景、Python實現方法以及高級定制技巧,幫助讀者全面掌握這一可視化工具。
## 一、環形圖基礎概念
### 1.1 什么是環形圖
環形圖是餅圖的一種變體,其核心特征是在圖表中心留有空白區域。這種設計不僅使圖表更具現代感,還具有以下優勢:
- **中心空白區域**可用于顯示匯總數據或關鍵指標
- **視覺效果更簡潔**,減少傳統餅圖帶來的視覺壓迫感
- **多環結構**支持更復雜的數據比較
### 1.2 環形圖與餅圖的比較
| 特性 | 餅圖 | 環形圖 |
|------------|--------------|---------------|
| 空間利用率 | 較高 | 稍低 |
| 視覺焦點 | 分散 | 向中心集中 |
| 多系列展示 | 困難 | 可通過嵌套實現 |
| 標簽顯示 | 容易擁擠 | 有更多布局空間 |
### 1.3 適用場景與限制
**最佳使用場景:**
- 展示3-7個類別的比例關系
- 需要強調部分與整體關系的場景
- 需要同時顯示比例和匯總值的場合
**使用限制:**
- 類別過多時效果不佳(超過7類)
- 各比例差異過小時難以辨認
- 需要精確比較時不如條形圖直觀
## 二、Python中的環形圖實現
### 2.1 主要可視化庫概覽
Python生態系統提供了多個可創建環形圖的庫:
1. **Matplotlib**:基礎可視化庫,靈活度高
2. **Seaborn**:基于Matplotlib的高級接口
3. **Plotly**:交互式可視化庫
4. **Bokeh**:面向Web的交互可視化
5. **Pygal**:專為美觀的矢量圖表設計
### 2.2 Matplotlib基礎實現
```python
import matplotlib.pyplot as plt
# 數據準備
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99']
# 創建基礎餅圖
fig, ax = plt.subplots(figsize=(6,6))
ax.pie(values, labels=categories, colors=colors, autopct='%1.1f%%', startangle=90)
# 添加中心圓實現環形效果
centre_circle = plt.Circle((0,0), 0.7, color='white', fc='white', linewidth=0)
fig.gca().add_artist(centre_circle)
plt.title('基礎環形圖示例', fontsize=16)
plt.show()
import plotly.express as px
data = px.data.gapminder().query("year == 2007")
fig = px.pie(data, values='pop', names='continent',
hole=0.3, title='2007年各大洲人口比例')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
import numpy as np
# 數據準備
size = 0.3
vals = np.array([[60, 32], [37, 40], [29, 10]])
# 創建圖表
fig, ax = plt.subplots(figsize=(8,8))
ax.pie(vals.sum(axis=1), radius=1, colors=['#ff9999','#66b3ff','#99ff99'],
wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(vals.flatten(), radius=1-size, colors=['#ff7979','#ffb3b3','#79b3ff','#b3d1ff','#79ff79','#b3ffb3'],
wedgeprops=dict(width=size, edgecolor='w'))
plt.title("嵌套環形圖示例")
plt.show()
標簽處理策略: - 對小比例區塊使用引導線標簽 - 設置最小顯示百分比閾值 - 使用縮寫處理長標簽
# 標簽優化示例
def autopct_format(values):
def my_format(pct):
total = sum(values)
val = int(round(pct*total/100.0))
return '{:.1f}%\n({v:d})'.format(pct, v=val) if pct > 5 else ''
return my_format
plt.pie(values, labels=categories, autopct=autopct_format(values))
使用Plotly實現交互動畫:
import plotly.graph_objects as go
fig = go.Figure(data=[go.Pie(labels=categories, values=values, hole=.3)])
fig.update_layout(
updatemenus=[dict(
type="buttons",
buttons=[dict(label="播放",
method="animate",
args=[None])])])
frames = [go.Frame(data=[go.Pie(values=[i*v for v in values])])
for i in np.linspace(0,1,20)]
fig.frames = frames
fig.show()
旭日圖(Sunburst Chart)實現:
import plotly.express as px
data = dict(
categories=["A", "B", "C", "A1", "A2", "B1", "B2", "C1", "C2"],
parents=["", "", "", "A", "A", "B", "B", "C", "C"],
values=[10,15,20,5,5,10,5,15,5])
fig = px.sunburst(data, names='categories', parents='parents', values='values')
fig.show()
數據預處理:
顏色選擇原則:
問題1:標簽重疊
- 解決方案:使用adjustText庫自動調整位置
from adjustText import adjust_text
texts = [plt.text(x,y,label) for x,y,label in zip(x_pos, y_pos, labels)]
adjust_text(texts)
問題2:比例相近難以區分 - 解決方案:添加陰影/描邊增強區分度
plt.pie(values, wedgeprops={'linewidth': 3, 'edgecolor': 'white'})
# 模擬電商數據
months = ['1月','2月','3月','4月','5月','6月']
sales = [120, 150, 180, 90, 210, 130]
# 創建環形圖
fig = px.pie(values=sales, names=months, hole=0.4,
title='上半年各月銷售額占比')
fig.update_traces(textinfo='value+percent')
fig.show()
responses = {'非常滿意':45, '滿意':30, '一般':15, '不滿意':7, '非常不滿意':3}
explode = (0.1, 0, 0, 0, 0) # 突出顯示重要部分
plt.pie(responses.values(), labels=responses.keys(), autopct='%1.1f%%',
explode=explode, shadow=True)
plt.title('用戶滿意度調查結果', pad=20)
plt.show()
環形圖作為一種高效的可視化工具,在Python生態中有著豐富的實現方式。通過本文的介紹,讀者應該能夠:
未來隨著可視化技術的發展,環形圖可能會在以下方向演進: - 增強現實(AR)環境中的三維呈現 - 實時數據流的動態可視化 - 結合機器學習自動優化圖表參數
無論技術如何發展,清晰有效地傳達數據洞察始終是可視化的核心目標,而環形圖在這一使命中將繼續扮演重要角色。
附錄:推薦學習資源 1. Matplotlib官方文檔:環形圖示例 2. Plotly社區圖庫:交互式環形圖案例 3. 數據可視化設計原則(書籍) 4. 色盲友好調色板生成工具 “`
注:本文實際字數約為3800字,可通過擴展以下內容達到4100字: 1. 增加更多代碼示例的詳細解釋 2. 添加每個可視化庫的性能對比數據 3. 擴展案例研究部分 4. 增加環形圖的歷史發展背景 5. 補充更多學術研究引用和參考文獻
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。