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
相关产品推荐
相关产品推荐

