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

箱线图按日期分组堆叠异常,如何仅显示异常值?

问题解决方案

1. 修复数据堆叠问题(按日期分组生成箱线图)

数据堆叠的核心原因是日期列未被识别为日期类型,或未明确指定分组逻辑。

先确保日期列是Date类型:

df$date <- as.Date(df$date)

在绘图时显式指定按date分组,确保每个日期生成独立箱线图:

ggplot(df, aes(x = date, y = value)) +
  geom_boxplot(aes(group = date)) # 显式分组是关键

2. 解决横坐标日期不连续问题

如果原始数据存在日期空缺,ggplot默认只显示有数据的日期。要实现连续日期轴,有两种方案:

方案1:强制按固定间隔显示刻度(无需补全空日期)

通过scale_x_date设置刻度间隔,即使无数据的日期也会在轴上预留位置:

scale_x_date(
  date_breaks = "1 day", # 按天显示刻度,可根据需求调整为"week"/"month"
  date_labels = "%m-%d", # 自定义日期显示格式
  expand = c(0.02, 0)    # 调整轴两端留白
)

方案2:补全所有连续日期(包括无数据的日期)

先生成完整的日期序列,再与原始数据左连接,确保每个日期都存在于数据框中:

library(dplyr)
# 生成从最早到最晚的连续日期序列
full_dates <- data.frame(date = seq(min(df$date), max(df$date), by = "day"))
# 左连接原始数据,无数据的日期value为NA
df_full <- left_join(full_dates, df, by = "date")

绘图时加上na.rm = TRUE忽略空值即可:

geom_boxplot(aes(group = date), na.rm = TRUE)

3. 仅显示异常值标签

箱线图的异常值定义为超出Q1-1.5*IQR或Q3+1.5*IQR的值,先筛选出这些数据再传给geom_text_repel:

# 按日期分组计算异常值
outliers <- df %>%
  group_by(date) %>%
  mutate(
    q1 = quantile(value, 0.25, na.rm = TRUE),
    q3 = quantile(value, 0.75, na.rm = TRUE),
    iqr = q3 - q1,
    is_outlier = value < (q1 - 1.5*iqr) | value > (q3 + 1.5*iqr)
  ) %>%
  filter(is_outlier) # 只保留异常值

绘图时指定data = outliers,仅为异常值添加标签:

library(ggrepel)
geom_text_repel(
  data = outliers,
  aes(label = value),
  size = 3,
  max.overlaps = 10 # 限制重叠标签数量,避免混乱
)

完整代码示例

library(dplyr)
library(ggplot2)
library(ggrepel)

# 1. 转换日期类型
df$date <- as.Date(df$date)

# 2. 筛选异常值
outliers <- df %>%
  group_by(date) %>%
  mutate(
    q1 = quantile(value, 0.25, na.rm = TRUE),
    q3 = quantile(value, 0.75, na.rm = TRUE),
    iqr = q3 - q1,
    is_outlier = value < (q1 - 1.5*iqr) | value > (q3 + 1.5*iqr)
  ) %>%
  filter(is_outlier)

# 3. 绘制箱线图
ggplot(df, aes(x = date, y = value)) +
  geom_boxplot(aes(group = date)) +
  scale_x_date(
    date_breaks = "1 day",
    date_labels = "%m-%d",
    expand = c(0.02, 0)
  ) +
  geom_text_repel(
    data = outliers,
    aes(label = value),
    size = 3,
    max.overlaps = 10
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:01:11