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

如何为stat_density_ridges图添加对应分组的z-score文本标注

解决stat_density_ridges分组标注与脊线共存的问题

问题说明

使用ggplot2的stat_density_ridges绘制脊线图时,希望为每个分组的脊线右上角添加对应z-score文本标注,但遇到两个问题:

  • 默认代码运行后,所有z-score堆叠在A组脊线上,仅显示第一个且报错
  • 将data_df的value列改为字符型后,标注能对应正确分组,但脊线丢失

解决方案

问题核心在于geom_text的y轴映射错误:原代码固定y=1导致所有标注都指向A组(y轴分组默认顺序A对应1、B对应2、C对应3、D对应4),且position_stack不适用当前场景。调整方式如下:

  • 让geom_text的y与z_scores_df的group字段绑定,实现标注与分组一一对应
  • 移除position_stack,改用hjust调整标注在x轴的位置,避免超出图框
  • 保留inherit.aes=FALSE,防止继承主图的x轴数值映射(z_scores_df无value列)

修正后完整代码

library(ggplot2)
library(ggridges)

data_df <- data.frame(group=c(rep("A",26),rep("B",26),rep("C",26),rep("D",26)),
                     sample=rep(letters,4),
                     value=rnorm(26*4, mean=0, sd=1))

z_scores_df <- data.frame(group=c("A","B","C","D"),
                          z_score=runif(n=4, max=1, min=0))

plot <- ggplot(data_df, aes(x=value, y=group)) +
  stat_density_ridges(aes(fill=after_stat(quantile)), 
                      geom = "density_ridges_gradient", scale=1,
                      calc_ecdf = TRUE) +
  geom_point(data=data_df[data_df$sample=='w',],
             color="green", size=2) +
  geom_text(data=z_scores_df,
            aes(label = format(z_score,digits = 3), x=Inf, y=group), 
            hjust = 1.1,  # 调整标注在x轴的位置,避免超出图框
            inherit.aes = FALSE)

plot

关键调整说明

  • aes(y=group):让每个z-score标注对应到自身分组的y轴位置
  • hjust=1.1:因为x设为Inf(最右侧),通过hjust将标注向右偏移一点,刚好显示在脊线右上角
  • 移除position_stack:该参数用于堆叠元素,这里每个标注对应独立分组,不需要堆叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:10