基于R语言CCF值绘制物种对流量响应象限图的方法咨询
实现方案
1 批量提取每个物种的CCF统计量
我们可以直接调用ccf()时设置plot=FALSE不输出绘图,直接提取计算结果,批量整理为结构化数据框,无需手动录入数值:
# 自定义参数 lag_max <- 5 # 最大滞后阶数 # 按物种拆分数据 df.split <- split(df, df$Commonname, drop = TRUE) # 初始化结果存储表 ccf_stats <- data.frame( species = character(), max_lag = integer(), max_ccf = numeric(), significant = logical(), stringsAsFactors = FALSE ) # 遍历每个物种计算CCF for (sp in names(df.split)) { sp_df <- df.split[[sp]] # 计算CCF,不绘图 ccf_res <- ccf(sp_df$CPUE, sp_df$Discharge, lag.max = lag_max, plot = FALSE) # 仅保留正滞后(流量变化在前,物种丰度变化在后,可根据需求删除此过滤) pos_filter <- ccf_res$lag >= 0 lag_vals <- ccf_res$lag[pos_filter] ccf_vals <- ccf_res$acf[pos_filter] # 找到相关系数绝对值最大的对应位置 max_idx <- which.max(abs(ccf_vals)) target_lag <- lag_vals[max_idx] target_ccf <- ccf_vals[max_idx] # 计算95%置信水平下的显著性阈值 sig_threshold <- 2 / sqrt(nrow(sp_df)) is_sig <- abs(target_ccf) > sig_threshold # 写入结果表 ccf_stats <- rbind(ccf_stats, data.frame( species = sp, max_lag = target_lag, max_ccf = target_ccf, significant = is_sig )) }
运行后得到的ccf_stats就是包含所有物种滞后位置、对应相关系数、显著性标识的结构化表。
2 绘制象限图
我们用ggplot2实现需求中的绘图效果,显著物种自动加*标识:
library(ggplot2) # 生成物种标签,显著项加* ccf_stats$label <- ifelse(ccf_stats$significant, paste0(ccf_stats$species, "*"), ccf_stats$species) ggplot(ccf_stats, aes(x = max_lag, y = max_ccf)) + # 绘制散点 geom_point(size = 2, color = "#2c3e50") + # 标注物种名称 geom_text(aes(label = label), nudge_x = 0.08, size = 3, hjust = 0) + # 设置坐标轴范围 xlim(0, lag_max) + ylim(-1, 1) + # 加象限分割虚线 geom_hline(yintercept = 0, linetype = "dashed", color = "gray60") + geom_vline(xintercept = lag_max/2, linetype = "dashed", color = "gray60") + # 坐标轴标注 labs(x = "响应滞后时长", y = "最大滞后相关系数") + theme_bw()
如果需要用相关系数绝对值作为y轴,只需将绘图逻辑中的y = max_ccf改为y = abs(max_ccf),同时将ylim(-1,1)改为ylim(0,1)即可。130个物种标注拥挤的话可以调小文本字号,或者使用交互式绘图工具避免标签重叠。
内容的提问来源于stack exchange,提问作者Johnny5ish
相关产品推荐
相关产品推荐

