如何在ggplot2直方图中设置‘大于550mm’分组?数据去向咨询
如何在ggplot直方图中单独划分>550mm的长度组?
先直接解答你的疑问:你当前的脚本里,大于550mm的个体并没有被归入最后一个区间,而是被完全过滤掉了——因为你设置了scale_x_continuous(limits = c(50, 550)),ggplot会自动移除超出这个x轴范围的所有数据,所以这部分个体在直方图里根本不会显示。
接下来给你两种可行的解决方案,帮你把>550mm的个体单独归为一组:
方法一:提前预处理数据(灵活可控,适合后续复用分组)
先在数据里创建一个自定义的长度分组变量,用dplyr的case_when可以精准匹配你需要的区间:
library(dplyr) # 给LWR数据添加分组列 LWR <- LWR %>% mutate(TL_group = case_when( TL > 50 & TL <= 100 ~ "]50,100 mm]", TL > 100 & TL <= 150 ~ "]100-150 mm]", TL > 150 & TL <= 200 ~ "]150-200 mm]", TL > 200 & TL <= 250 ~ "]200-250 mm]", TL > 250 & TL <= 300 ~ "]250-300 mm]", TL > 300 & TL <= 350 ~ "]300-350 mm]", TL > 350 & TL <= 400 ~ "]350-400 mm]", TL > 400 & TL <= 450 ~ "]400-450 mm]", TL > 450 & TL <= 500 ~ "]450-500 mm]", TL > 500 & TL <= 550 ~ "]500-550 mm]", TL > 550 ~ "> 550 mm", TRUE ~ NA_character_ # 处理小于等于50的个体,可根据你的需求调整 ))
然后用这个分组变量绘制直方图(注意这里用geom_bar而不是geom_histogram,因为已经是分组后的离散数据):
ggplot(LWR, aes(x=TL_group, fill=Period)) + geom_bar(color="#e9ecef", alpha=0.6, position='dodge') + scale_fill_manual(values=c("#69b3a2", "#404080")) + scale_y_continuous(name="Number of eels", breaks=seq(0, 400, by=50), limits = c(0, 400), expand=expansion(mult=c(0,0.05))) + labs(x="Total length (mm)") + theme(axis.text.x = element_text(angle=45, hjust=1)) # 旋转x轴标签,避免重叠
方法二:直接在ggplot中调整分箱(无需预处理,快速实现)
如果你不想修改原始数据,可以通过手动指定breaks参数来定义分箱范围,同时用coord_cartesian替代scale_x_continuous的limits(后者会过滤数据,前者只是缩放显示范围):
ggplot(LWR, aes(x=TL, fill=Period)) + geom_histogram(color="#e9ecef", alpha=0.6, position='dodge', # 手动设置分箱断点,最后一个用Inf表示大于550的所有值 breaks = c(50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, Inf), closed="left") + # closed="left"对应你需要的左开右闭区间规则 scale_fill_manual(values=c("#69b3a2", "#404080")) + scale_y_continuous(name="Number of eels", breaks=seq(0, 400, by=50), limits = c(0, 400), expand=expansion(mult=c(0,0.05))) + scale_x_continuous(name="Total length (mm)", # 设置每个区间的中点作为刻度位置 breaks = c(75, 125, 175, 225, 275, 325, 375, 425, 475, 525, 600), # 对应你的区间标签 labels = c("]50,100 mm]", "]100-150 mm]", "]150-200 mm]", "]200-250 mm]", "]250-300 mm]", "]300-350 mm]", "]350-400 mm]", "]400-450 mm]", "]450-500 mm]", "]500-550 mm]", "> 550 mm")) + coord_cartesian(xlim = c(50, 650)) # 扩展x轴显示范围,确保最后一组能正常显示
两种方法各有优势:方法一的分组变量可以在后续其他分析中复用,逻辑更清晰;方法二不需要修改原始数据,适合快速调整可视化效果。
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

