You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制分组错开的周期性时间序列平滑线/密度图?

解决思路与实现代码

一、分组错开的平滑线实现

你的hour是离散整数型变量(0-23),直接用geom_line分组不会自动错开,需要手动给不同conditions的x轴位置加偏移量来模拟dodge效果:

  1. 先计算各时段各条件的事件计数:
library(tidyverse)

count_data <- mydataframe %>% 
  group_by(hour, conditions) %>% 
  count() %>% 
  ungroup()
  1. 给不同条件的hour添加偏移量(可根据需求调整偏移幅度):
count_data <- count_data %>% 
  mutate(hour_shifted = case_when(
    conditions == "Non" ~ hour - 0.2,
    conditions == "Oui" ~ hour + 0.2
  ))
  1. 绘制带错开效果的平滑线(可搭配散点辅助展示原始计数):
ggplot(count_data, aes(x = hour_shifted, y = n, color = conditions)) +
  geom_smooth(method = "loess", se = FALSE, span = 0.3) + # span参数控制平滑程度
  geom_point(size = 2) +
  scale_x_continuous(breaks = 0:23, labels = 0:23) + # 还原原hour刻度
  labs(x = "Hour", y = "Event Count", color = "Conditions")

二、分组密度图的实现

由于hour是离散时段数据,直接用geom_density适配性不强,推荐两种替代方案:

方式1:将hour转为连续变量绘制分组密度曲线

把hour当作连续值,用原始未聚合的数据直接绘制:

ggplot(mydataframe, aes(x = hour, fill = conditions)) +
  geom_density(alpha = 0.5, position = "identity") +
  scale_x_continuous(breaks = 0:23) +
  labs(x = "Hour", y = "Density", fill = "Conditions")

方式2:用频数多边形替代(贴合离散时段特性)

如果要保留离散时段的属性,用geom_freqpoly实现分组错开的折线效果:

ggplot(mydataframe, aes(x = hour, color = conditions)) +
  geom_freqpoly(binwidth = 1, position = "dodge") +
  labs(x = "Hour", y = "Event Count", color = "Conditions")

关键说明

  • 平滑线的偏移量需根据x轴刻度间隔调整,确保两组线条不重叠且对齐原hour刻度
  • 离散时段数据用频数多边形比密度图更贴合数据本质

内容的提问来源于stack exchange,提问作者PHNM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:20:51