ggplot2循环绘制带误差棒图表时遇Discrete值传入连续刻度错误
解决ggplot2中"Discrete value supplied to continuous scale"错误
错误核心原因
- 在
aes()中直接用colnames()传递列名,ggplot2会将其识别为离散字符串,而非对应列的数值数据,导致连续刻度接收离散值的冲突。 geom_errorbar的ymax计算错误,重复使用了mean - sd的表达式,未正确设置为mean + sd。- 用
Tratamentos作为geom_line的linetype分组依据,但每个处理仅对应一个均值点,线条无法有效绘制。
修正后的完整代码
1. 数据预处理(保留原逻辑,优化命名)
library(dplyr) library(ggplot2) # 读取并清洗数据 ds.1.1 <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/exp_ivan_1.csv") ds.1.2 <- ds.1.1 %>% select(!EM) # 按处理组计算均值和标准误 ds.1.2.wide <- ds.1.2 %>% summarize(across(everything(), list(mean = ~mean(.x, na.rm = TRUE), sd = ~sd(.x, na.rm = TRUE)/sqrt(3))), .by = Tratamentos)
2. 批量生成带误差棒的柱状图
plots_pull <- list() target.columns <- c(2,4,6,8,10,12,14,16) for (j in seq_along(target.columns)){ # 提取当前变量的均值、标准误列名 mean_col <- colnames(ds.1.2.wide)[target.columns[j]] sd_col <- colnames(ds.1.2.wide)[target.columns[j]+1] # 子集数据并重命名,避免字符串传递问题 ds.1.2.wide.sub <- ds.1.2.wide %>% select(Tratamentos, all_of(c(mean_col, sd_col))) %>% rename(mean_val = all_of(mean_col), se_val = all_of(sd_col)) # 绘制图形 plots_pull[[j]] <- ggplot(data = ds.1.2.wide.sub, aes(x = Tratamentos, y = mean_val)) + # 误差棒:正确计算上下限 geom_errorbar(aes(ymin = mean_val - se_val, ymax = mean_val + se_val), width = 0.2, position = position_dodge(0.1)) + # 柱状图展示均值 geom_col(position = position_dodge(0.1), fill = "grey50") + # 叠加均值点增强可视化 geom_point(position = position_dodge(0.1), size = 2) + # 主题设置 theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), axis.text.x = element_text(angle = 0, hjust = 0.5), axis.text.y = element_text(angle = 0, hjust = 1), text = element_text(size = 18, family = "serif"), legend.position = "none") + # 添加变量名作为y轴标题 ylab(gsub("_mean", "", mean_col)) } # 查看第一个生成的图 plots_pull[[1]]
关键修正点说明
- 列名传递优化:用
all_of()配合列重命名,将字符串列名转换为ggplot可识别的数值列,避免离散值冲突。 - 误差棒逻辑修正:将
ymax改为mean + se,确保误差棒覆盖均值上下范围。 - 图形类型调整:替换
geom_line为geom_col+geom_point,适配单均值点的展示场景。 - 可读性提升:添加变量名作为y轴标题,优化坐标轴文本对齐方式。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

