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

如何在ggplot2中堆叠共享X轴的点图?分面用法求助

解决ggplot2堆叠共享X轴的两个点图问题

你之前用facet_wrap的方式完全错了——facet_wrap(km4week~.)是把km4week作为分组变量,每个子图对应一个km4week的取值,这和你要展示两个不同Y变量的需求不匹配。下面给你两种可行的实现方法:

方法一:整理数据为长格式后用分面

ggplot的分面更适合处理同一Y变量的分组展示,要展示两个不同Y变量,需要先把宽格式数据转成长格式,再用分面实现堆叠:

  1. 加载tidyr包整理数据:
library(tidyr)
marathon_long <- marathon %>%
  pivot_longer(
    cols = c(first_split_percent, km4week), # 选中要合并的两个Y变量
    names_to = "指标名称", # 新列:存储原Y变量的名称
    values_to = "指标值"    # 新列:存储原Y变量的数值
  )
  1. 用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轴:

  1. 安装并加载patchwork:
install.packages("patchwork")
library(patchwork)
  1. 定义两个原始图,然后拼接:
# 第一个图:隐藏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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:44