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

如何在单个ggplot中绘制两条geom_textline与一个geom_bar?

修正方案

你的核心问题是错误地用%>%串联了第二个ggplot()调用,这会直接覆盖之前的绘图对象。正确的做法是在同一个ggplot基础上,为每个图层单独指定对应的数据子集,无需重新初始化绘图。

修正后的完整代码

library(dplyr)
library(tidyverse)
library(geomtextpath)

dummydf <- data.frame(vars=c('Roster','Alumni', 'New Wins'),
                      SP22=c(34,5,4), FA22=c(31,5,7), 
                      SP23=c(31,5,4), FA23=c(37,3,15),
                      SP24=c(29,7,3), FA24=c(NA,NA,11))

longdf <- dummydf %>% 
  pivot_longer(cols=c('SP22','FA22','SP23','FA23','SP24','FA24'),
               names_to='semesters', values_to='value')

myplot <- ggplot(longdf, aes(x = semesters)) +
  # 绘制geom_textline,使用排除"New Wins"的数据
  geom_textline(data = . %>% filter(vars != "New Wins"),
                aes(y = value, group = vars, color = vars, 
                    label = vars, hjust = vars),
                spacing = 100) +
  # 绘制geom_bar,使用"New Wins"的数据
  geom_bar(data = . %>% filter(vars == "New Wins"),
           aes(y = value), fill = "gold1", stat = "identity", alpha = 0.7) +
  # 统一设置各类刻度和样式
  scale_hjust_manual(values = c(0.1, 0.6)) +
  scale_y_continuous(n.breaks = 16, limits = c(0, 44)) +
  scale_x_discrete(limits = c('SP22','FA22','SP23','FA23','SP24'), expand = c(0,.2)) +
  scale_color_manual(values = c("darkorchid2", "steelblue"), guide = "none")

myplot

关键改动说明

  • 只初始化一次ggplot(),全局指定x轴映射(所有图层共享x=semesters)
  • 每个图层通过data = . %>% filter(...)单独筛选所需数据,.代表传递过来的原始数据框
  • geom_bar添加了stat="identity",因为我们是直接使用y轴的数值而非默认的计数统计
  • 给柱状图添加了alpha参数,避免完全覆盖下方的文本线,提升可读性
  • 修正了scale_x_discrete中的拼写错误(原代码是limit,正确为limits)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:11:06