R语言ggplot整合多数据框绘制带误差棒散点图方法
整合多数据框绘制带误差棒的散点图实现方案
核心逻辑:先将3个宽格式数据框统一转换为长格式,再按「样本+指标」的维度匹配合并为一张完整绘图表,即可直接调用ggplot2的误差棒图层绘图。
前置说明
示例数据中用空字符串""表示缺失值,需要先统一替换为R识别的NA值,并将数值列转为数值类型,否则会出现映射报错。
完整实现代码
library(tidyverse) # ------------ 示例数据 ------------ DT <- data.frame(Samples=c("D1", "D2", "D3", "D4"), ACE=c(0.184, -0.169, 0.054, 0.087), FLN=c(-0.257, -0.239, -0.009, 0.038), ANT=c(-0.166, -0.304, 0.238, "" ), stringsAsFactors=FALSE) LowerLim <- data.frame(Samples=c("D1", "D2", "D3", "D4"), ACE=c(-1.514, "", -1.644, -1.611), FLN=c("", "", "", -1.660), ANT=c(-1.865, -2.003, 1.937, ""), stringsAsFactors=FALSE) UpperLim <- data.frame(Samples=c("D1", "D2", "D3", "D4"), ACE=c(-0.560, "", -0.689,-0.657), FLN=c("", "", "", -0.706), ANT=c(-0.911,-1.049,0.983, "" ), stringsAsFactors=FALSE) # ------------ 数据预处理 ------------ # 批量处理空值、转换数值列类型 process_tbl <- function(raw_df){ raw_df %>% mutate(across(-Samples, ~na_if(., "") %>% as.numeric())) } DT <- process_tbl(DT) LowerLim <- process_tbl(LowerLim) UpperLim <- process_tbl(UpperLim) # 转换为长格式(老版本tidyr可替换为gather,逻辑一致) DT_long <- DT %>% pivot_longer(-Samples, names_to = "Cds", values_to = "value") Lower_long <- LowerLim %>% pivot_longer(-Samples, names_to = "Cds", values_to = "lower") Upper_long <- UpperLim %>% pivot_longer(-Samples, names_to = "Cds", values_to = "upper") # 合并为绘图用总表 plot_data <- DT_long %>% left_join(Lower_long, by = c("Samples", "Cds")) %>% left_join(Upper_long, by = c("Samples", "Cds")) %>% # 固定样本显示顺序 mutate(Samples = factor(Samples, levels = unique(Samples))) # ------------ 绘图 ------------ # 设置点和误差棒的 dodge 位置,避免同x轴位置元素重叠 dodge_pos <- position_dodge(width = 0.5) ggplot(plot_data, aes(x = Cds, color = Samples))+ # 先画误差棒,再画散点,保证散点在视觉上层 geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2, # 误差棒两端短横的宽度 position = dodge_pos, na.rm = TRUE)+ # 自动跳过缺失值的条目 geom_point(aes(y = value), position = dodge_pos, size = 2, na.rm = TRUE)+ theme(axis.title.x = element_blank(), axis.text.x=element_text(size=7, angle=90,hjust=0.95,vjust=0.2))+ ggtitle("Scatter plot with error bars")
参数调整说明
- 如果你习惯用旧版的
gather函数做长宽转换,替换pivot_longer部分即可,合并和绘图逻辑完全不变 position_dodge的width参数可以调整同一x轴分类下不同样本点的间距,根据实际指标数量调整即可- 误差棒的颜色、线型、粗细都可以在
geom_errorbar里通过color、linetype、linewidth参数自定义
内容的提问来源于stack exchange,提问作者R noob
相关产品推荐
相关产品推荐

