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

如何去除ggplot2冲积图中geom_text的重复标签?

问题

我正在制作冲积图(alluvial plot),希望为图的节点部分标注百分比。使用geom_text函数时出现了重复标签:一个位置符合预期,另一个则偏移到图像最右侧。如何移除这个右侧的重复标签?

我的代码如下:

ggplot(data = survey_3,
               aes(axis1 = leave, axis2 = stringr::str_wrap(Q58,40), y = freq)) + # 横轴1为离职意向,横轴2为反馈内容,纵轴为频次
  geom_alluvium(aes(fill = Q58)) + # 冲积条填充色对应反馈内容
  geom_stratum() +
  scale_x_discrete(limits=c("leave", "Q58"), expand=c(0.1, 0.1))+ # 调整横轴间距优化显示
  geom_text(stat = "stratum",
            aes(label = after_stat(stratum)), fontface="bold") + 
  geom_flow()+
  geom_text(stat="flow", aes(label=percent), nudge_x = 0.5, fontface="bold", size=5)+
  theme_void()+
  guides(fill=guide_legend(title=""))+# 移除图例标题
  ggtitle("未来1年内计划离职护士的后续规划" )+
  theme(plot.title=element_text(hjust=0.5, face="bold", size=15), 
        legend.position = "none")# 标题居中加粗,隐藏图例

数据集:

survey_3<-data.frame(leave=c("计划6个月至1年内离职",
                                  "计划6个月至1年内离职",
                                  "计划6个月至1年内离职",
                                  "计划6个月至1年内离职",
                                  "计划6个月至1年内离职"),
                     Q58=c("计划继续深造",
                           "计划转非护理岗位",
                           "计划在本院转其他护理岗位",
                           "计划退休/停止工作",
                           "计划转至其他机构的护理岗位"),
                     freq=c(139, 299, 307, 514, 957),
                     percent=c("1.97%", "4.24%", "4.35%", "7.28%", "13.56%"))
解决方案

重复标签的根源是stat="flow"会为每条冲积流生成两个端点数据(分别对应x轴的两个位置:leave和Q58),默认会在两个位置都渲染标签,导致右侧出现多余的重复项。

只需要在geom_text(stat="flow")中添加过滤条件,只保留第二个横轴(x=2)对应的标签即可:

修改后的关键代码行:

geom_text(stat="flow", aes(label=percent), nudge_x = 0.5, fontface="bold", size=5,
          filter = after_stat(x == 2))

完整修改后的代码:

ggplot(data = survey_3,
               aes(axis1 = leave, axis2 = stringr::str_wrap(Q58,40), y = freq)) + 
  geom_alluvium(aes(fill = Q58)) + 
  geom_stratum() +
  scale_x_discrete(limits=c("leave", "Q58"), expand=c(0.1, 0.1))+
  geom_text(stat = "stratum",
            aes(label = after_stat(stratum)), fontface="bold") + 
  geom_flow()+
  # 添加filter条件过滤多余标签
  geom_text(stat="flow", aes(label=percent), nudge_x = 0.5, fontface="bold", size=5,
            filter = after_stat(x == 2))+
  theme_void()+
  guides(fill=guide_legend(title=""))+
  ggtitle("未来1年内计划离职护士的后续规划" )+
  theme(plot.title=element_text(hjust=0.5, face="bold", size=15), 
        legend.position = "none")

这样就能只保留符合预期位置的百分比标签,移除右侧的重复标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:25:20