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

在R中绘制含分类变量双Y轴的同比例散点图

实现分类变量双Y轴散点图(ggplot2)

针对你需要复现的图表需求——X轴为VIP分数,点的实际垂直位置由Overall(加权绝对回归系数和)决定,左侧Y轴显示分类变量Masses,同时忽略右侧刻度——我整理了一套用ggplot2实现的方案,完美适配你的场景:

步骤1:准备数据

先把你提供的示例数据整理成R数据框:

library(ggplot2)
library(dplyr)

# 构建示例数据框
df <- tibble(
  Masses = c(82.07010, 84.08570, 95.08570, 96.08571, 98.10140, 
             99.04410, 105.07530, 110.10130, 111.10160, 113.06040),
  Overall = c(38.26669006, 34.22745192, 38.65684978, 13.13685100, 36.07639404,
              17.37079280, 9.38047849, 36.66816959, 13.64197654, 10.09391101),
  VIP = c(1.484957089, 1.328724766, 1.500047945, 0.512968559, 1.400239372,
          0.676731759, 0.367677099, 1.423128458, 0.532506138, 0.395271714)
)

步骤2:核心绘图逻辑

关键思路是:用Overall作为点的Y坐标(决定点的垂直位置),然后把左侧Y轴的刻度替换为Masses的标签,让刻度位置完全匹配每个点的Overall值。这样既满足了点的位置由回归系数和决定,又能显示分类变量的标签。

ggplot(df, aes(x = VIP, y = Overall)) +
  # 绘制散点,可自定义样式
  geom_point(size = 3, color = "#2c3e50") +
  # 自定义左侧Y轴:用Masses作为刻度标签,位置对应Overall的值
  scale_y_continuous(
    breaks = df$Overall,  # 刻度位置绑定每个点的Overall值
    labels = round(df$Masses, 2),  # 显示Masses作为标签,保留2位小数
    name = "Masses"  # Y轴标题
  ) +
  # 隐藏右侧Y轴(符合忽略右侧刻度的要求)
  theme(
    axis.text.y.right = element_blank(),
    axis.ticks.y.right = element_blank(),
    axis.title.y.right = element_blank(),
    # 当Masses数量过多时,旋转标签避免重叠
    axis.text.y = element_text(angle = 45, hjust = 1)
  ) +
  # 设置X轴标题
  labs(x = "VIP Score") +
  # 可选:调整主题样式,贴近目标图表风格
  theme_minimal()

关键细节说明

  • 刻度精准匹配:通过scale_y_continuous的breaks参数绑定每个点的Overall值,labels参数替换为Masses,实现了分类标签与实际数值位置的一一对应。
  • 处理大量Masses:当Masses条目过多时,除了旋转标签,还可以用guide_axis(n.dodge = 2)让标签错开两行显示,进一步避免重叠:
    scale_y_continuous(
      breaks = df$Overall,
      labels = round(df$Masses, 2),
      name = "Masses",
      guide = guide_axis(n.dodge = 2)  # 错开两行显示标签
    )
    
  • 隐藏冗余元素:通过theme参数完全隐藏右侧Y轴的所有元素,符合你的需求。

扩展优化

如果需要给点添加标注但避免ggrepel的重叠问题,可以尝试:

  • 只给VIP值较高的点添加标签:
    geom_text(data = filter(df, VIP > 1), aes(label = round(Masses, 2)), 
              hjust = 1.1, vjust = 0.5, size = 3)
    
  • 或者使用交互式图表包plotly,鼠标悬停时显示Masses信息:
    library(plotly)
    ggplotly(your_ggplot_object, tooltip = c("x", "y", "label"))
    

这样就能完美复现你需要的图表效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:10:22