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

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.xdnf.cn/news/7004.html

相关文章:

  • 专题四:综合练习(组合总和的暴搜dfs)
  • printf耗时高的原因
  • UE 材质基础 第一天
  • nginx集成防火墙ngx_waf的docker版
  • 重庆 ICPC 比赛游记
  • Vue 3.0中响应式依赖和更新
  • list重点接口及模拟实现
  • 从复杂系统(杂多集合的实例)到智慧系统(理想集合的建构)
  • docker迅雷自定义端口号、登录用户名密码
  • 【嵌入式项目-MCU代码2】
  • Bitmap、Roaring Bitmap、HyperLogLog对比介绍
  • BootCDN介绍(Bootstrap主导的前端开源项目免费CDN加速服务)
  • LLM笔记(二)LLM数据基础-分词算法(2)
  • Linux面试题集合(1)
  • 前端扫盲HTML
  • 深入理解构造函数,析构函数
  • 威布尔比例风险模型(Weibull Proportional Hazards Model, WPHM)详解:原理、应用与实施
  • MATLAB进行深度学习网络训练
  • WSL 安装 Debian 12 后,如何安装图形界面 X11 ?
  • 【论文#目标检测】End-to-End Object Detection with Transformers
  • 在Maven中使用Ant插件
  • 【和春笋一起学C++】(十四)指针与const
  • 50个Python常用的模块,配对应的官网文档!!
  • 专业技术知识和技能,机械泵场效应管短路维修方法主要步骤方法
  • Linux_ELF文件
  • 【EDA软件】【联合Modelsim仿真使用方法】
  • 数据结构*优先级队列(堆)
  • 【笔记】正弦量的相量表示
  • 字体样式集合
  • (4)python爬虫--JsonPath