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官方文档
- 数据可视化最佳实践指南
- 南丁格尔玫瑰图的历史与应用