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

