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

ggplot柱状图重复geom_text标签移除居中及图例排序问题

解决两个需求:重复标签居中显示 + 图例顺序匹配图表类别

步骤1:预处理数据,生成标签所需的居中位置

先对原数据做预处理,提取按Fi降序排序后的猎物类别因子,并按Fi值分组计算每组的x轴居中位置:

library(tidyverse)
library(ggsci) # 适配scale_fill_igv的依赖包

# 加载用户提供的数据
FO_adult <- structure(list(prey_name = c("Amphipod", "Byths", "Chiro.Adult", 
"Chiro.Larvae", "Chiro.Pupae", "Chironomidae", "Chydoridae", 
"Copepoda", "Cyclopoid", "Daphnia", "Dreissena", "EggMass", "Eurycercidae", 
"Fish.Eggs", "Goby", "Hemimysis", "Isopod", "Sphaeriidae", "Trichopteran", 
"UID.Fish"), Fi = c(0.189473684210526, 0.515789473684211, 0.0526315789473684, 
0.157894736842105, 0.252631578947368, 0.0526315789473684, 0.0105263157894737, 
0.0210526315789474, 0.0105263157894737, 0.147368421052632, 0.0842105263157895, 
0.0210526315789474, 0.0210526315789474, 0.0105263157894737, 0.147368421052632, 
0.0105263157894737, 0.0947368421052632, 0.0421052631578947, 0.0105263157894737, 
0.0210526315789474)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -20L))

# 生成按Fi降序排序的猎物类别因子
FO_adult <- FO_adult %>%
  mutate(prey_ordered = reorder(prey_name, -Fi))

# 生成标签数据集:按Fi分组,取每组x轴位置的中位数作为居中坐标
label_data <- FO_adult %>%
  group_by(Fi) %>%
  summarise(
    x_pos = median(as.integer(prey_ordered)),
    Fi_label = round(Fi, 3)
  )

步骤2:修改绘图代码,实现需求

用预处理后的prey_ordered作为x轴和填充映射,指定图例顺序与x轴类别一致;同时用label_data绘制唯一的居中标签:

ggplot(FO_adult, aes(x = prey_ordered, y = Fi, fill = prey_ordered)) +
  geom_bar(stat = "identity") +
  # 使用新的标签数据集绘制居中的唯一标签
  geom_text(data = label_data, aes(x = x_pos, y = Fi, label = Fi_label), 
            vjust = -0.5, size = 3.5) +
  ggtitle("Frequency of Occurrence") +
  labs(x = "Prey", fill = "Prey Name", y = "Frequency of Occurrence (%)", 
       caption = "Source: DNR Diet Data") + 
  # 强制填充色图例顺序与x轴类别排序一致
  scale_fill_igv(palette = "default", limits = levels(FO_adult$prey_ordered)) +
  theme_bw() +
  theme(legend.position = "right", 
        plot.title = element_text(hjust = 0.5),
        legend.background = element_rect(fill = "white", color = 1),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.length = unit(0.2,"cm")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)))

关键说明

  • 重复标签处理:通过按Fi分组计算x轴中位数,让相同Fi值的标签精准落在对应柱状图组的中间位置,且每个Fi值仅显示一次标签。
  • 图例顺序匹配:利用scale_fill_igv的limits参数绑定prey_ordered的因子水平,确保图例顺序完全跟随x轴上的类别排序(按Fi降序)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:45:31