Python繪制南丁格爾玫瑰圖:從入門到實戰
引言
南丁格爾玫瑰圖(Nightingale Rose Chart),也被稱為極區圖(Polar Area Chart),是一種獨特的數據可視化方式。這種圖表由弗洛倫斯·南丁格爾(Florence Nightingale)在克里米亞戰爭期間首創,用于展示不同月份的死亡人數。本文將詳細介紹如何使用Python創建南丁格爾玫瑰圖,從基礎概念到實際應用。
什么是南丁格爾玫瑰圖?
南丁格爾玫瑰圖是一種圓形圖表,它將數據以扇形的形式展示,每個扇形的半徑表示數值的大小。與普通的餅圖不同,南丁格爾玫瑰圖使用扇形的面積(而不是角度)來表示數值,這使得數據之間的差異更加明顯。
主要特點:
- 使用扇形的面積表示數值
- 所有扇形的角度相等
- 通過半徑的變化來展示數據差異
- 適合展示周期性數據
環境準備
在開始之前,我們需要安裝必要的Python庫:
pip install matplotlib numpy
代碼實現
讓我們通過一個實際的例子來學習如何創建南丁格爾玫瑰圖。我們將使用matplotlib來實現這個可視化效果,這是一個功能強大且廣泛使用的數據可視化庫。
1. 基礎設置
首先,我們需要導入必要的庫并設置中文字體支持:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS'] # 優先使用的中文字體
plt.rcParams['axes.unicode_minus'] = False # 解決負號顯示問題
plt.rcParams['font.family'] = 'sans-serif' # 使用無襯線字體
2. 準備數據
在我們的示例中,我們使用月度銷售數據來展示南丁格爾玫瑰圖的效果:
# 示例數據:不同月份的銷售數據
months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
values = [120, 150, 180, 200, 250, 300, 280, 260, 220, 190, 160, 140]
3. 創建極坐標圖
使用matplotlib的極坐標系統來創建玫瑰圖:
# 計算每個扇形的角度(均分360度)
angles = np.linspace(0, 2*np.pi, len(months), endpoint=False)# 創建圖形
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw=dict(projection='polar'))# 繪制玫瑰圖
bars = ax.bar(angles, values, width=2*np.pi/len(months), bottom=0, alpha=0.8)
4. 設置樣式
為了讓圖表更加美觀,我們添加顏色、標簽和圖例:
# 設置顏色
colors = plt.cm.viridis(np.linspace(0, 1, len(months)))
for bar, color in zip(bars, colors):bar.set_facecolor(color)# 設置標簽
ax.set_xticks(angles)
ax.set_xticklabels(months, fontsize=10)# 添加標題和圖例
plt.title('月度銷售數據 - 南丁格爾玫瑰圖', pad=20, fontsize=14)
plt.legend(bars, months, loc='upper right', bbox_to_anchor=(1.3, 1.1), fontsize=10)
實際應用場景
南丁格爾玫瑰圖在以下場景特別有用:
- 時間序列數據:展示月度、季度或年度數據的變化
- 周期性數據:展示具有周期性特征的數據
- 對比分析:比較不同類別之間的數值差異
- 趨勢展示:展示數據隨時間的變化趨勢
進階技巧
1. 自定義顏色方案
可以通過修改顏色映射來創建不同的顏色方案:
# 使用不同的顏色映射
colors = plt.cm.plasma(np.linspace(0, 1, len(months))) # 使用plasma顏色映射
2. 添加數據標簽
可以在每個扇形上添加具體數值:
# 添加數值標簽
for angle, value in zip(angles, values):ax.text(angle, value, str(value), ha='center', va='bottom')
3. 調整圖表樣式
可以通過修改各種參數來優化圖表外觀:
# 調整圖表樣式
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'sans-serif'
注意事項
- 數據量不宜過多,建議控制在12個以內
- 確保數據之間的差異足夠明顯
- 選擇合適的顏色方案,避免使用過于相似的顏色
- 添加適當的圖例和標簽
- 注意中文字體的顯示問題,確保系統安裝了所需的中文字體
總結
南丁格爾玫瑰圖是一種強大的數據可視化工具,特別適合展示周期性數據和進行對比分析。通過Python和matplotlib,我們可以輕松創建美觀且功能豐富的南丁格爾玫瑰圖。在實際應用中,要根據具體需求選擇合適的展示方式,并注意數據的可讀性和美觀性。
完整代碼
完整的代碼實現如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS'] # 優先使用的中文字體
plt.rcParams['axes.unicode_minus'] = False # 解決負號顯示問題
plt.rcParams['font.family'] = 'sans-serif' # 使用無襯線字體def create_nightingale_rose():# 示例數據:不同月份的銷售數據months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']values = [120, 150, 180, 200, 250, 300, 280, 260, 220, 190, 160, 140]# 計算每個扇形的角度(均分360度)angles = np.linspace(0, 2*np.pi, len(months), endpoint=False)# 創建圖形fig, ax = plt.subplots(figsize=(10, 8), subplot_kw=dict(projection='polar'))# 繪制玫瑰圖bars = ax.bar(angles, values, width=2*np.pi/len(months), bottom=0, alpha=0.8)# 設置顏色colors = plt.cm.viridis(np.linspace(0, 1, len(months)))for bar, color in zip(bars, colors):bar.set_facecolor(color)# 設置標簽ax.set_xticks(angles)ax.set_xticklabels(months, fontsize=10)# 添加標題plt.title('月度銷售數據 - 南丁格爾玫瑰圖', pad=20, fontsize=14)# 添加圖例plt.legend(bars, months, loc='upper right', bbox_to_anchor=(1.3, 1.1), fontsize=10)# 顯示圖形plt.tight_layout()plt.show()if __name__ == '__main__':create_nightingale_rose()
參考資料
- Matplotlib官方文檔
- 數據可視化最佳實踐指南
- 南丁格爾玫瑰圖的歷史與應用