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

在ggplot中绘制双Y轴重叠箱线图与散点图的技术问题

解决ggplot双Y轴重叠箱线图与散点图的问题

问题根源

你当前代码的核心问题是:VarBinariaY是字符型变量,ggplot将其识别为离散分类变量,对应的Y轴是分类尺度;而VarContinuaY是0-1的连续变量,两者尺度不兼容,导致散点位置与箱线图无法匹配。

解决方案

需要将分类变量转为数值型,统一尺度后设置双Y轴,同时用轴标签替代图例:

1. 预处理数据

先把字符型的VarBinariaY转换为数值型,让它和VarContinuaY共享0-1的连续尺度:

df$VarBinariaY_num <- as.numeric(df$VarBinariaY)

2. 最终绘图代码

library(ggplot2)

ggplot(df, aes(x = VarContinuaX)) +
  # 箱线图:按数值化后的分类变量分组,固定宽度避免过于宽大
  geom_boxplot(aes(y = VarBinariaY_num, group = VarBinariaY_num), 
               outlier.shape = NA, width = 0.05) +
  # 散点图:Y轴用连续变量,颜色对应原分类变量
  geom_point(aes(y = VarContinuaY, color = VarBinariaY), size = 3) +
  # 设置颜色映射,对应分类变量的0和1
  scale_color_manual(values = c("0" = "blue", "1" = "red")) +
  # 主Y轴:对应分类变量(0/1)
  scale_y_continuous(
    name = "分类变量(0/1)",
    breaks = c(0, 1),
    labels = c("0", "1"),
    # 次Y轴:对应连续变量,因两者范围都是0-1,直接用恒等转换
    sec.axis = sec_axis(
      trans = ~.,
      name = "连续变量(0-1)",
      breaks = seq(0, 1, 0.2)
    )
  ) +
  # 去掉颜色图例,用双Y轴区分变量含义
  theme(legend.position = "none") +
  labs(x = "VarContinuaX") +
  coord_cartesian(xlim = c(-1, 1))

关键说明

  • 箱线图必须设置group参数,否则ggplot会把所有数据合并为一个组绘制单个箱线图。
  • 次Y轴使用trans = ~.(恒等转换),因为两个变量的取值范围完全一致(0-1),仅需显示不同的轴标签。
  • 移除颜色图例,通过双Y轴的标签直接区分两类变量的含义,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:02:03