雷达图(蜘蛛图)
雷达图,也称为蜘蛛图,是一种多维数据的可视化工具,特别适用于时间数据的展示。但是,如何正确使用和分析数据在雷达图上的显示效果呢? 由于笔者认识的人中就会存在这样一个看似简单的图却无法正确运用的情况,接下来将从适用数据、Python实现和结果分析三个方面跟大家一起探讨一下。
适用数据
Q:什么样的时间数据适合用雷达图表示?
A:周期性、均匀分布按月份、季节、季度、星期或小时分布的数据。注意,这里无论按哪种分布,例如按月份至少需要三到四个月的数据,最好是一年中12个月(这样既可以看到不同时期的关联,又能体会到当年十二月和次年一月份间的关系)。
Q: 相对应的,什么样的时间数据不适合?
A:
- 非周期性趋势数据:如年份数据。若展示的是年度销售额随时间的增长情况(如2010到2023年的销售数据),则条形图或折线图更合适,因为它们更清晰地展示趋势的增长或衰减。
- 事件驱动的时间数据:如特定事件发生的时间间隔或频率,例如突发性自然灾害年份(如地震年份分布)。这些数据没有固定周期,且不均匀分布,用雷达图会使图形无规律,难以解析。
- 短期、零散的时间数据:如几天或几小时的散点数据(比如某次实验的具体时间点)。这些数据不具备足够的维度形成封闭形状,使用雷达图会缺乏意义。
Python实现
那么接下来。我将以气象数据为例,进行雷达图实现。
数据结构
时间范围为:2020-01-01到2023-12-31。本次实现仅针对“平均气温”的月度数据(自行处理求均值)进行逐月的雷达图。(完整数据集可以点个关注并私信我无偿获取)
具体实现
# 1. 导入需要的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from math import pi
# 2. 读取数据并转换格式
data = pd.read_excel("final_data.xlsx") # 读取 Excel 文件中的数据
data['date'] = pd.to_datetime(data['date']) # 将日期列转换为日期格式
data['month'] = data['date'].dt.month # 提取月份信息用于分组
monthly_avg_temp = data.groupby('month')['平均气温'].mean() # 按月分组计算平均值
# 3. 绘制雷达图
categories = [f"{i}月" for i in range(1, 13)] # 定义每个月的标签
values = monthly_avg_temp.values.flatten() # 提取每月平均气温的值
values = np.append(values, values[0]) # 闭合数据循环 将第一个值添加到末尾
N = len(categories) # 共十二个月
angles = [n / float(N) * 2 * pi for n in range(N)] # 计算每个数据点的角度
angles += angles[:1] # 闭合角度循环
fig, ax = plt.subplots(figsize=(5, 5), subplot_kw=dict(polar=True)) # 使用极坐标绘图
# 设置起始角度和顺时针方向
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
plt.xticks(angles[:-1], categories) # 显示月份标签
# 绘制y轴标签(根据温度范围设置y轴)
ax.set_rlabel_position(0)
plt.yticks(np.linspace(values.min(), values.max(), 4), color="grey", size=7)
plt.ylim(0, max(values) * 1.1)
# 绘制数据
ax.plot(angles, values, linewidth=1, linestyle='solid', color='teal') # 使用天青色线条
ax.fill(angles, values, 'teal', alpha=0.1) # 填充区域颜色为天青色(透明度为0.1)
# 添加标题并显示图形
plt.title("2020-2023 年每月平均气温雷达图")
plt.show()
结果分析
就这个雷达图进行简要分析。
气温季节性变化明显,图中的气温在夏季7月和8月达到最高;在冬季1月和12月气温达到相对较低的峰值。(此时在分析次年一月份气温低的原因是就可以加上类似于:受上一年12月份冷空气的影响)。
(其余的原因分析需结合实际情况,这里不再过多阐明)
希望这篇对大家在时间数据雷达图处理的误区上有帮助。有任何问题和写作分析上的建议欢迎讨论!