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

基于一致分组应用ggplot函数并添加对应分组分位数标线

解决方案

方法1:在绘图函数中匹配对应分组的分位数

核心逻辑:每个传入绘图函数的数据集n都是单个分组的子集,可提取该分组标识,从分位数数据框中筛选对应值,仅绘制当前分组的97%分位数标线。

完整代码

# 生成原始数据
group <- c(rep(1, 30), rep(2, 30))
animal <- c(rep(c(rep(1, 6), rep(2, 6), rep(3, 6), rep(4, 6), rep(5, 6)), 2))
velocity <- c(rpois(60, 7))
second <- rep(c(1:6), 10)
bdf <- data.frame(group, animal, velocity, second)

# 计算各分组的97%分位数
library(dplyr)
bdf_quantiles <- bdf %>%
  group_by(group) %>%
  summarize(quantile = quantile(velocity, probs = 0.97))

# 修改绘图函数
plotvelocity <- function(n, q) {
  # 获取当前数据集对应的分组ID
  current_group <- unique(n$group)
  # 筛选对应分组的分位数
  current_quantile <- q %>% filter(group == current_group)
  
  ggplot(n) +
    geom_path(aes(x = second, y = velocity, group = group)) +
    theme_classic() +
    geom_hline(data = current_quantile, aes(yintercept = quantile), color = "red", linetype = "dashed") +
    facet_wrap(~animal, ncol = 1)
}

# 拆分数据集并批量绘图
behaviorlist <- split(bdf, bdf$group)
plotvelocitylist <- lapply(behaviorlist, plotvelocity, q = bdf_quantiles)

方法2:使用mapply配对数据集与分位数

利用mapply的配对特性,将拆分后的分组数据集与分位数数据行一一对应传入函数,确保每个图仅使用对应分组的分位数。

完整代码

# 生成原始数据(同方法1)
group <- c(rep(1, 30), rep(2, 30))
animal <- c(rep(c(rep(1, 6), rep(2, 6), rep(3, 6), rep(4, 6), rep(5, 6)), 2))
velocity <- c(rpois(60, 7))
second <- rep(c(1:6), 10)
bdf <- data.frame(group, animal, velocity, second)

# 计算各分组的97%分位数(同方法1)
library(dplyr)
bdf_quantiles <- bdf %>%
  group_by(group) %>%
  summarize(quantile = quantile(velocity, probs = 0.97))

# 定义绘图函数
plotvelocity <- function(n, q_row) {
  ggplot(n) +
    geom_path(aes(x = second, y = velocity, group = group)) +
    theme_classic() +
    geom_hline(aes(yintercept = q_row$quantile), color = "red", linetype = "dashed") +
    facet_wrap(~animal, ncol = 1)
}

# 拆分数据集并配对绘图
behaviorlist <- split(bdf, bdf$group)
# 将分位数数据按行拆分为列表,适配mapply配对逻辑
quantile_list <- split(bdf_quantiles, seq(nrow(bdf_quantiles)))
plotvelocitylist <- mapply(plotvelocity, behaviorlist, quantile_list, SIMPLIFY = FALSE)

关键说明

  • 方法1逻辑直观,无需额外拆分分位数数据,通过分组ID筛选即可匹配对应值。
  • 方法2依赖mapply的配对机制,SIMPLIFY = FALSE参数确保返回结果为列表格式的绘图对象,避免格式兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:24:54