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

如何使用R语言ggplot2绘制哑铃图?代码绘图结果异常排查

问题原因

你代码的核心错误是配对列生成逻辑不符合数据结构:

  • 你的数据集排列顺序为「全部19个月的Additions to Waitlist数据」+「全部19个月的Total Assessments数据」
  • 你用rep(1:(n()/2),each=2)生成配对列的逻辑,是把相邻两行配为一组,最终配对的是同指标的相邻两个月份数据,而非同一个月份的两个指标数据,直接导致连线完全错乱。
修正方案

不需要手动生成配对列,直接使用Month作为连线分组字段即可,同一个月份的两条数据天生就是需要配对的一组。如果要实现和参考效果一致的横向哑铃图(更易读),可以把月份放到Y轴、数值放到X轴。

完整修正代码

library(tidyverse)

# 原始数据集构造代码保持不变
gnatt <- structure(list(Month = c("JAN 2020", "FEB 2020", "MAR 2020", 
                                  "APR 2020", "MAY 2020", "JUN 2020", "JUL 2020", "AUG 2020", "SEP 2020", 
                                  "OCT 2020", "NOV 2020", "DEC 2020", "JAN 2021", "FEB 2021", "MAR 2021", 
                                  "APR 2021", "MAY 2021", "JUN 2021", "JUL 2021", "JAN 2020", "FEB 2020", 
                                  "MAR 2020", "APR 2020", "MAY 2020", "JUN 2020", "JUL 2020", "AUG 2020", 
                                  "SEP 2020", "OCT 2020", "NOV 2020", "DEC 2020", "JAN 2021", "FEB 2021", 
                                  "MAR 2021", "APR 2021", "MAY 2021", "JUN 2021", "JUL 2021"), 
                        Outcome = c("Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Additions to Waitlist", 
                                    "Additions to Waitlist", "Additions to Waitlist", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments", 
                                    "Total Assessments", "Total Assessments", "Total Assessments"
                        ), Count = c(222, 199, 160, 30, 98, 127, 75, 121, 164, 140, 
                                     108, 176, 158, 181, 278, 299, 275, 385, 517, 390, 376, 317, 
                                     75, 146, 211, 140, 198, 271, 368, 290, 397, 375, 363, 524, 
                                     441, 509, 697, 961), Percent = c(0.569230769230769, 0.529255319148936, 
                                                                      0.504731861198738, 0.4, 0.671232876712329, 0.601895734597156, 
                                                                      0.535714285714286, 0.611111111111111, 0.605166051660517, 
                                                                      0.380434782608696, 0.372413793103448, 0.443324937027708, 
                                                                      0.421333333333333, 0.49862258953168, 0.530534351145038, 0.678004535147392, 
                                                                      0.54, 0.55, 0.54, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                      NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -38L
                                                                      ), class = c("tbl_df", "tbl", "data.frame"))

# 仅修正因子顺序,保证月份按时间正序排列
gnatt <- gnatt %>% 
  mutate(Month = factor(Month, levels = unique(Month)))

# 横向哑铃图(符合常见阅读习惯)
gnatt %>% 
  ggplot(aes(x = Count, y = Month)) + 
  geom_line(aes(group = Month), color = "gray60", linewidth = 1) +
  geom_point(aes(color = Outcome), size = 4) + 
  labs(x = "数量", y = "月份") +
  theme_minimal() +
  theme(legend.position = "top")

如果需要保留纵向哑铃图(X轴为月份),使用以下绘图代码即可:

gnatt %>% 
  ggplot(aes(x = Month, y = Count)) + 
  geom_line(aes(group = Month)) + 
  geom_point(aes(color = Outcome), size = 4) + 
  theme(
    legend.position = "top",
    axis.text.x = element_text(angle = 45, hjust = 1) # 避免X轴月份标签重叠
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:12:03