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

如何自定义ggplot2中geom_rug的位置,将所有分组rug置于底部

解决ggplot2底部多分组geom_rug的合理排列问题

问题背景

现有如下R代码,通过ggplot2绘制散点图,并为不同membership分组在图表底部添加了不同颜色的geom_rug,但当前代码的rug存在重叠问题,需要让所有分组的rug都置于底部且有序排列(禁止使用outside = TRUE或side = "tb",仅保留底部显示)。

library(ggplot2)
set.seed(926)
df <- data.frame(expression = rnorm(900),
                 time = c(rnorm(300), rnorm(300, 1, 2), rnorm(300, 2,0.5)),
                 membership = factor(rep(1:3, each = 300)))

ggplot(df, aes(x = time, y = expression, fill = membership)) + 
  geom_point(shape=21, size = 3) + 
  geom_rug(data = subset(df, membership ==3),  sides = "b", color = "green", length = unit(1.5, "cm")) +
  geom_rug(data = subset(df, membership ==2),  sides = "b", color = "blue", length = unit(1, "cm")) +
  geom_rug(data = subset(df, membership ==1),  sides = "b", color = "red") + 
  scale_y_continuous(expand = c(0.3, 0))

解决方案

核心思路是为每个分组的geom_rug指定固定的垂直偏移位置,让它们在底部分层排列,同时调整y轴范围和绘图边距确保所有rug完整显示。

修改后的代码如下:

library(ggplot2)
set.seed(926)
df <- data.frame(expression = rnorm(900),
                 time = c(rnorm(300), rnorm(300, 1, 2), rnorm(300, 2,0.5)),
                 membership = factor(rep(1:3, each = 300)))

# 计算原始数据的y轴最小值,作为rug的基准位置
y_min <- min(df$expression)
# 控制分组rug之间的垂直间距,可按需调整
y_offset <- 0.7

ggplot(df, aes(x = time, y = expression, fill = membership)) + 
  geom_point(shape=21, size = 3) + 
  # 为每个分组指定不同的y位置,实现底部分层
  geom_rug(data = subset(df, membership == 1),
           aes(y = y_min - y_offset * 0),  # 最靠近散点的一层
           sides = "b", color = "red", length = unit(0.6, "cm")) +
  geom_rug(data = subset(df, membership == 2),
           aes(y = y_min - y_offset * 1),
           sides = "b", color = "blue", length = unit(0.6, "cm")) +
  geom_rug(data = subset(df, membership == 3),
           aes(y = y_min - y_offset * 2),
           sides = "b", color = "green", length = unit(0.6, "cm")) +
  # 扩展y轴下限,确保所有rug都能显示
  scale_y_continuous(expand = expansion(add = c(y_offset * 2.5, 0.3))) +
  # 增加底部绘图边距,避免rug被裁剪
  theme(plot.margin = margin(t = 10, r = 10, b = 40, l = 10, unit = "pt"))

关键说明

  1. 垂直偏移设置:通过y = y_min - y_offset * n为每个分组的rug设置不同的y坐标,n为分组的层级序号,实现分层排列。
  2. 间距调整:y_offset参数可根据图表大小和需求灵活修改,控制分组之间的垂直距离。
  3. 范围与边距:使用expansion(add = ...)扩展y轴下限,配合plot.margin增加底部边距,确保最下方的rug不会被图表边框裁剪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:01:43