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
相关产品推荐
相关产品推荐

