如何在单个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
相关产品推荐
相关产品推荐

