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

ggplot2中coord_flip翻转后如何缩小geom_density_ridges与轴的间距?

问题描述

使用geom_density_ridges绘制密度脊图并通过coord_flip翻转后,y轴与第一个分组(A)的密度图之间存在较大间隙。尝试在scale_y_discrete()中设置expand=c(0,0)未解决问题,希望保留极小间隙的同时缩小该空隙。

模拟数据与绘图代码如下:

# 模拟数据
rawdata <- data.frame(Score = rnorm(1000, seq(1, 0, length.out = 10), sd = 1),
                      Group = rep(LETTERS[1:3], 10000))
stdev <- c(10.78,10.51,9.42)

# 绘图代码
p <- ggplot(rawdata, aes(x = Score, y = Group)) +
     scale_y_discrete() +
     geom_rect(inherit.aes = FALSE, mapping = aes(ymin = 0, ymax = Inf, xmin = -0.1 * min(stdev), xmax = 0.1 * max(stdev)), 
               fill = "grey", alpha = 0.5) +
     geom_density_ridges(aes(fill = Group), scale = 0.5, size = 1, alpha=0.5) +
     scale_color_manual(values = col) +   # 注意:col变量未定义,需提前设置颜色向量
     scale_fill_manual(values = col) +
     labs(title="Toy Graph", y="Group", x="Value") +
     coord_flip(xlim = c(-8, 8), ylim = NULL, expand = TRUE, clip = "on")

p
解决方案

造成间隙的核心原因是geom_rect设置了ymin=0,强制绘图区域包含y=0的位置(而分组的离散值对应y坐标为1、2、3),翻转后就形成了左侧的大间隙。以下是两种有效解决方法:

方法1:修正geom_rect的y轴范围

将geom_rect的ymin设置为第一个分组的数值化位置减去一个小值,而非0,避免扩大绘图区域:

# 先将Group转为因子,确保顺序正确
rawdata$Group <- factor(rawdata$Group, levels = LETTERS[1:3])
# 获取分组对应的数值化位置
min_group_pos <- min(as.numeric(rawdata$Group))

p <- ggplot(rawdata, aes(x = Score, y = Group)) +
     scale_y_discrete(expand = c(0.01, 0)) +  # 保留极小间隙
     geom_rect(inherit.aes = FALSE, 
               mapping = aes(ymin = min_group_pos - 0.1,  # 仅覆盖分组区域上方
                             ymax = Inf, 
                             xmin = -0.1 * min(stdev), 
                             xmax = 0.1 * max(stdev)), 
               fill = "grey", alpha = 0.5) +
     geom_density_ridges(aes(fill = Group), scale = 0.5, size = 1, alpha=0.5) +
     scale_color_manual(values = c("#E69F00", "#56B4E9", "#009E73")) +  # 示例颜色
     scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73")) +
     labs(title="Toy Graph", y="Group", x="Value") +
     coord_flip(xlim = c(-8, 8), clip = "on")

p

方法2:通过coord_flip限制轴范围

直接在coord_flip中设置xlim(对应翻转后的左侧轴,即原y轴)的范围,仅包含分组的数值化位置并保留微小间隙:

# 分组数值化位置为1、2、3,设置xlim为0.9到3.1,保留左右极小间隙
p <- ggplot(rawdata, aes(x = Score, y = Group)) +
     scale_y_discrete() +
     geom_rect(inherit.aes = FALSE, mapping = aes(ymin = 0, ymax = Inf, xmin = -0.1 * min(stdev), xmax = 0.1 * max(stdev)), 
               fill = "grey", alpha = 0.5) +
     geom_density_ridges(aes(fill = Group), scale = 0.5, size = 1, alpha=0.5) +
     scale_color_manual(values = c("#E69F00", "#56B4E9", "#009E73")) +
     scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73")) +
     labs(title="Toy Graph", y="Group", x="Value") +
     coord_flip(xlim = c(0.9, 3.1), ylim = c(-8, 8), clip = "on")  # 限制翻转后的x轴范围

p

额外注意事项

  • 代码中col变量未定义,需提前设置颜色向量(如示例中的颜色值)。
  • geom_density_ridges的scale参数控制脊的高度比例,若需调整脊的紧凑程度,可微调该值(如从0.5改为0.6)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:45:36