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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:30:40