如何在ggplot中无需缩放添加次轴?解决MAPE与Accuracy同图绘制问题
解决ggplot绘制MAPE与Accuracy双折线图的问题
你的代码和数据存在两个核心问题:
- 数据中
Accuracy和MAPE列是字符类型,ggplot无法识别为数值进行绘图计算 - 双轴设置逻辑错误,没有对两个指标的数值范围做缩放匹配,导致刻度无法对应
修复步骤:
1. 转换数据类型
先把字符型的数值列转为数值型:
data$Accuracy <- as.numeric(data$Accuracy) data$MAPE <- as.numeric(data$MAPE)
2. 计算缩放比例
由于Accuracy(22.4-100)和MAPE(107.7-156.1)的数值范围差异大,需要通过缩放让两者适配同一绘图区域。这里以Accuracy缩放匹配MAPE的范围为例:
scale_factor <- max(data$MAPE) / max(data$Accuracy)
3. 绘制双折线双轴图
使用缩放后的Accuracy值绘图,同时通过次轴反向转换还原原始刻度:
library(ggplot2) ggplot(data, aes(x = Clusters)) + # 绘制Accuracy的折线与点(已缩放) geom_line(aes(y = Accuracy * scale_factor, color = "Accuracy"), group = 1) + geom_point(aes(y = Accuracy * scale_factor, color = "Accuracy")) + # 绘制MAPE的折线与点 geom_line(aes(y = MAPE, color = "MAPE"), group = 1) + geom_point(aes(y = MAPE, color = "MAPE")) + # 设置主/次y轴 scale_y_continuous( name = "MAPE (%)", sec.axis = sec_axis(~ . / scale_factor, name = "Accuracy (%)") ) + # 设置颜色与图例 scale_color_manual(values = c("Accuracy" = "#1f77b4", "MAPE" = "#ff7f0e")) + labs(color = "指标类型") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
关键说明:
group=1是因为x轴是离散的分类值,强制ggplot将所有点连接成一条折线- 次轴的
~ . / scale_factor是对缩放后的Accuracy值做反向计算,还原原始Accuracy的刻度值 - 可以根据需求调整颜色、主题等样式,让图表更美观
内容的提问来源于stack exchange,提问作者Mustafa Kamal
相关产品推荐
相关产品推荐

