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

ggplot2循环绘制带误差棒图表时遇Discrete值传入连续刻度错误

解决ggplot2中"Discrete value supplied to continuous scale"错误

错误核心原因

  1. 在aes()中直接用colnames()传递列名,ggplot2会将其识别为离散字符串,而非对应列的数值数据,导致连续刻度接收离散值的冲突。
  2. geom_errorbar的ymax计算错误,重复使用了mean - sd的表达式,未正确设置为mean + sd。
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:35:01