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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:25:27