当前位置: 首页 > article >正文

Python绘制南丁格尔玫瑰图:从入门到实战

Python绘制南丁格尔玫瑰图:从入门到实战

在这里插入图片描述

引言

南丁格尔玫瑰图(Nightingale Rose Chart),也被称为极区图(Polar Area Chart),是一种独特的数据可视化方式。这种图表由弗洛伦斯·南丁格尔(Florence Nightingale)在克里米亚战争期间首创,用于展示不同月份的死亡人数。本文将详细介绍如何使用Python创建南丁格尔玫瑰图,从基础概念到实际应用。

什么是南丁格尔玫瑰图?

南丁格尔玫瑰图是一种圆形图表,它将数据以扇形的形式展示,每个扇形的半径表示数值的大小。与普通的饼图不同,南丁格尔玫瑰图使用扇形的面积(而不是角度)来表示数值,这使得数据之间的差异更加明显。

主要特点:

  1. 使用扇形的面积表示数值
  2. 所有扇形的角度相等
  3. 通过半径的变化来展示数据差异
  4. 适合展示周期性数据

环境准备

在开始之前,我们需要安装必要的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. 时间序列数据:展示月度、季度或年度数据的变化
  2. 周期性数据:展示具有周期性特征的数据
  3. 对比分析:比较不同类别之间的数值差异
  4. 趋势展示:展示数据随时间的变化趋势

进阶技巧

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'

注意事项

  1. 数据量不宜过多,建议控制在12个以内
  2. 确保数据之间的差异足够明显
  3. 选择合适的颜色方案,避免使用过于相似的颜色
  4. 添加适当的图例和标签
  5. 注意中文字体的显示问题,确保系统安装了所需的中文字体

总结

南丁格尔玫瑰图是一种强大的数据可视化工具,特别适合展示周期性数据和进行对比分析。通过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()

参考资料

  1. Matplotlib官方文档
  2. 数据可视化最佳实践指南
  3. 南丁格尔玫瑰图的历史与应用
http://www.lryc.cn/news/2378317.html

相关文章:

  • 概率与期望总结
  • 炼丹学习笔记3---ubuntu2004部署运行openpcdet记录
  • 深入解析BGP路由反射器与联邦:突破IBGP全连接限制的两种方案
  • QT设置MySQL驱动
  • String的一些固定程序函数
  • 3.2/Q2,Charls最新文章解读
  • 大麦(Hordeum vulgare)中 BAHD 超家族酰基转移酶-文献精读129
  • docker迅雷自定义端口号、登录用户名密码
  • 中国30米年度土地覆盖数据集及其动态变化(1985-2022年)
  • 3D个人简历网站 5.天空、鸟、飞机
  • STM32IIC实战-OLED模板
  • Sparse4D运行笔记
  • Redis设计与实现——分布式Redis
  • 多指标组合策略
  • c#车检车构客户管理系统软件车辆年审短信提醒软件
  • Java爬虫能处理京东商品数据吗?
  • 通俗版解释CPU、核心、进程、线程、协程的定义及关系
  • 大语言模型 11 - 从0开始训练GPT 0.25B参数量 MiniMind2 准备数据与训练模型 DPO直接偏好优化
  • USRP 射频信号 采集 回放 系统
  • 【skywalking】index“:“skywalking_metrics-all“},“status“:404}
  • handsome主题美化及优化:10.1.0最新版 - 1
  • (9)python开发经验
  • 【C++详解】string各种接口如何使用保姆级攻略
  • 2025深圳杯D题法医物证多人身份鉴定问题四万字思路
  • 【时时三省】(C语言基础)字符数组应用举例2
  • Mysql触发器(附案例)
  • 使用DDR4控制器实现多通道数据读写(十二)
  • Kafka 生产者工作流程详解
  • 完整卸载 Fabric Manager 的方法
  • 地下停车场调频广播无线覆盖系统:融合精准选频光纤传输均匀覆盖于一体的创新型地下车库广播无线覆盖平台