想象一下,你正站在一個圓形廣場的中心,周圍均勻排列着12根高度不同的燈柱,這就是徑向條形圖帶給我們的視覺體驗。
在數據可視化領域,我們常常滿足於傳統的直角座標系條形圖,但當數據具有周期性或比較性時,徑向條形圖和圓形條形圖為我們打開了新的可能性。
1. 設計原理
這兩種圖表把傳統的笛卡爾座標系換成極座標系:角度表示類別,半徑或角度長度表示數值。
1.1. 徑向條形圖
徑向條形圖本質上是將傳統條形圖的直角座標系轉換為極座標系。
在極座標系中,每個數據點不再由(x, y)定位,而是由(角度, 半徑)確定,條形的高度(或長度)由半徑值表示,而條形的排列則沿着圓周方向。
設計靈感:如同鐘錶的指針或雷達的掃描線,徑向條形圖借鑑了自然界和人工製品中常見的圓形佈局,利用了人類對角度和對稱性的天然感知能力。
1.2. 圓形條形圖
圓形條形圖是徑向條形圖的一種特殊形式,它固定了起點和終點,使所有條形都在同一圓周上開始,只在半徑方向上延伸。
這種設計解決了完全徑向佈局可能導致的數據比較困難問題,因為所有條形的基準線是一致的。
設計比喻:想象一組跳高運動員,他們都從同一高度起跳,只是跳躍的高度不同——圓形條形圖就是這樣公平的"競技場"。
2. 應用示例
下面通過示例來演示這兩種圖在實際場景中的應用。
2.1. 徑向條形圖
# --- 1. 構造測試數據 ---
# 假設我們想比較一年中每個月的平均降水量
月份 = [
"一月",
"二月",
"三月",
"四月",
"五月",
"六月",
"七月",
"八月",
"九月",
"十月",
"十一月",
"十二月",
]
# 生成模擬的降水量數據 (單位: mm)
np.random.seed(42) # 為了結果可復現
降水量 = np.random.uniform(30, 150, size=len(月份)) # 隨機生成30-150mm的數據
# --- 2. 創建圖形 ---
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 7), facecolor="white")
# --- 2.1 繪製傳統條形圖 ---
# ... 省略 ...
# --- 2.2 繪製徑向條形圖 ---
# 計算每個條形的角度位置
# ... 省略 ...
# 使用極座標子圖
ax2 = plt.subplot(122, projection="polar")
# 關鍵:設置 'bottom' 參數為 inner_radius,這樣條形就從 inner_radius 開始畫,長度為 radii
bars = ax2.bar(
theta,
radii,
width=0.4,
bottom=inner_radius,
color="lightcoral",
edgecolor="darkred",
alpha=0.7,
)
# 添加數值標籤 (在條形內部,靠近外側)
for angle, radius, month in zip(theta, radii, 月份):
ax2.text(
angle,
inner_radius + radius / 2,
f"{radius:.1f}",
ha="center",
va="center",
fontsize=8,
color="black",
)
# 添加月份標記 (在條形外部)
# ... 省略 ...
# --- 3. 顯示圖形 ---
plt.tight_layout()
plt.show()
這段代碼首先生成了模擬的月度降水量數據,然後在同一個圖形窗口中創建了兩個子圖。
左側是使用 plt.bar 創建的傳統條形圖,右側是使用 plt.subplot(..., projection='polar') 和 ax.bar 創建的徑向條形圖。
徑向條形圖利用了極座標系,將類別(月份)分佈在圓周上,將數值(降水量)映射到徑向長度上。
徑向條形圖是一種在極座標系上繪製的圖表,可以提供比傳統條形圖更具視覺吸引力的替代方案。它通過弧長來表示數值,並且可以有效地利用空間,尤其是在處理類別較多或需要強調週期性模式(例如按月份或季度分組的數據)時。
2.2. 圓形條形圖
from matplotlib import cm
from math import log10
labels = list("ABCDEFG")
data = [21, 57, 88, 14, 76, 91, 26]
# ... 省略 ...
#create colors along a chosen colormap
colors = [cm.terrain(i / n) for i in range(n)]
#create figure, axis
fig, ax = plt.subplots()
#create rings of donut chart
for i in range(n):
current_outer_radius = r - i * w
innerring, _ = ax.pie([m - data[i], data[i]],
radius = current_outer_radius,
startangle = 90,
colors = ["white", colors[i]])
# 添加標籤
# ... 省略 ...
plt.show()
圓形條形圖從同一基準線開始,避免了徑向條形圖中不同角度起始點不同的問題,更加便於比較。
3. 總結
徑向條形圖和圓形條形圖代表了數據可視化從純功能向功能美學平衡的演進。
它們不是要完全取代傳統條形圖,而是為我們提供了更多視覺敍事的工具。
就像一位熟練的廚師擁有多種刀具一樣,優秀的數據分析師也應該掌握多種可視化技術,根據數據特性和溝通目標選擇最合適的"刀具"。
當你的數據講述着週期性的故事,或需要在有限空間內進行多維度比較時,不妨嘗試這些圓形可視化方法。它們不僅能更有效地傳達信息,還能為你的報告或儀表板增添獨特的視覺魅力。
最好的可視化不是最複雜的,而是最能清晰傳達數據故事的。
徑向和圓形條形圖正是這樣一種工具:在傳統與現代之間,在功能與美學之間,找到了優雅的平衡點。