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

ggplot绘图中各组均值线不显示,中位数/最小值线正常的问题排查

问题根源

你的核心问题是数值列(RMSE、R_squared)被存储为字符类型:

  • median()和min()函数可对字符型数值串工作(按字符排序后计算),但mean()直接对字符型计算会返回NA,这就是均值线无法显示的原因。
  • linetype未生效是因为被放在aes()内部,它需要放在aes()外才能直接生效。
解决步骤

1. 转换数据类型(根本解决)

先把字符型的数值列转为数值型,消除后续所有数值计算的隐患:

# 将RMSE、R_squared转为数值型
dfWithMetrics$RMSE <- as.numeric(dfWithMetrics$RMSE)
dfWithMetrics$R_squared <- as.numeric(dfWithMetrics$R_squared)
# 可选:将Fold_number转为因子型,更适配分类变量的绘图逻辑
dfWithMetrics$Fold_number <- as.factor(dfWithMetrics$Fold_number)

2. 修正ggplot代码

数据类型转换后,用ave()计算正确的数值均值,同时调整linetype的位置:

library(ggplot2)
library(latex2exp)

R_squared_plot <- ggplot(data = dfWithMetrics, 
                         aes(x = Fold_number, y = R_squared, 
                             color = Model, group = Model, shape = Model)) +
  ggtitle(TeX("$R^2$ per fold")) +
  geom_point() +
  # 将linetype移出aes()确保生效,同时计算正确的分组均值
  geom_line(aes(y = ave(R_squared, Model, FUN = mean)), linetype = "dashed")
print(R_squared_plot)

更具扩展性的写法(推荐)

如果后续需要添加多种统计线(均值、中位数、最小值),可以先预处理统计量,再用geom_hline()添加,逻辑更清晰:

# 先计算每个Model的各类统计量
model_stats <- aggregate(R_squared ~ Model, data = dfWithMetrics, 
                         FUN = function(x) c(mean = mean(x), median = median(x), min = min(x)))
model_stats <- do.call(data.frame, model_stats)

# 绘图
R_squared_plot <- ggplot(data = dfWithMetrics, 
                         aes(x = Fold_number, y = R_squared, 
                             color = Model, group = Model, shape = Model)) +
  ggtitle(TeX("$R^2$ per fold")) +
  geom_point() +
  # 添加均值虚线
  geom_hline(data = model_stats, aes(yintercept = R_squared.mean, color = Model), 
             linetype = "dashed") +
  # 可选:添加中位数点线
  geom_hline(data = model_stats, aes(yintercept = R_squared.median, color = Model), 
             linetype = "dotted")
print(R_squared_plot)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:21