如何在ggplot2中堆叠共享X轴的点图?分面用法求助
解决ggplot2堆叠共享X轴的两个点图问题
你之前用facet_wrap的方式完全错了——facet_wrap(km4week~.)是把km4week作为分组变量,每个子图对应一个km4week的取值,这和你要展示两个不同Y变量的需求不匹配。下面给你两种可行的实现方法:
方法一:整理数据为长格式后用分面
ggplot的分面更适合处理同一Y变量的分组展示,要展示两个不同Y变量,需要先把宽格式数据转成长格式,再用分面实现堆叠:
- 加载tidyr包整理数据:
library(tidyr) marathon_long <- marathon %>% pivot_longer( cols = c(first_split_percent, km4week), # 选中要合并的两个Y变量 names_to = "指标名称", # 新列:存储原Y变量的名称 values_to = "指标值" # 新列:存储原Y变量的数值 )
- 用facet_wrap绘制堆叠图:
library(ggplot2) ggplot(marathon_long, aes(x = MarathonTime, y = 指标值)) + geom_point() + facet_wrap(~指标名称, ncol = 1, scales = "free_y") + # ncol=1设置上下堆叠,free_y让Y轴自适应范围 labs(x = "马拉松用时")
方法二:用patchwork包直接拼接两个独立图
如果不想修改数据结构,可以用patchwork包直接把两个图上下拼接,实现共享X轴:
- 安装并加载patchwork:
install.packages("patchwork") library(patchwork)
- 定义两个原始图,然后拼接:
# 第一个图:隐藏X轴标签(避免重复) plot1 <- ggplot(marathon, aes(x = MarathonTime, y = first_split_percent)) + geom_point() + labs(x = "") # 第二个图:保留X轴标签 plot2 <- ggplot(marathon, aes(x = MarathonTime, y = km4week)) + geom_point() + labs(x = "马拉松用时") # 上下堆叠并共享X轴 plot1 / plot2 + plot_layout(axes = "collect")
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

