如何在ggplot中合并采样组并按镇区求和后绘制个体数分布图
如何在ggplot中合并采样组并按镇区求和后绘制个体数分布图
嘿,我明白你的需求啦——要把每个镇区的采样1+2、3+4合并求和,然后画出类似之前的ggplot对吧?之前的问题出在你只改了采样的标签,但没按镇区和新组把个体数加起来,我来一步步教你搞定~
第一步:先整理数据——按镇区和合并采样组求和
首先我们需要把原始数据汇总,每个镇区对应两个合并组的总个体数。用dplyr包来做最方便(如果你还没装的话先执行:install.packages("dplyr"))。
代码如下:
# 加载dplyr包 library(dplyr) # 创建汇总数据集:合并采样组并求和个体数 WPT_summary <- WPT %>% # 给每个采样值分配对应的合并组标签 mutate(SamplingGroup = case_when( Sampling %in% c(1, 2) ~ "Sampling 1+2", Sampling %in% c(3, 4) ~ "Sampling 3+4" )) %>% # 按镇区和合并组分组,计算每个组的总个体数 group_by(TownDistrict, SamplingGroup) %>% summarize(TotalIndividuals = sum(Individuals), .groups = "drop")
这段代码会把你的36行原始数据压缩成18行——每个镇区对应两个合并组的总个体数,这才是我们绘图需要的核心数据集。
如果你更习惯用recode的方式创建合并组,也可以这么写:
WPT_summary <- WPT %>% mutate(SamplingGroup = recode_factor(Sampling, "1" = "Sampling 1+2", "2" = "Sampling 1+2", "3" = "Sampling 3+4", "4" = "Sampling 3+4")) %>% group_by(TownDistrict, SamplingGroup) %>% summarize(TotalIndividuals = sum(Individuals), .groups = "drop")
用recode_factor能直接生成因子类型的分组,后续绘图时不会出现排序问题。
第二步:用汇总数据绘制ggplot
现在我们用处理好的WPT_summary来画图,逻辑和你之前的图类似,但要对应汇总后的字段:
library(ggplot2) library(scales) # 用于pretty_breaks函数 ggplot(WPT_summary, aes(x = SamplingGroup, y = TotalIndividuals, colour = TownDistrict, group = TownDistrict)) + geom_point(size = 3) + # 可以按需调整点的大小 geom_line() + # 连接同一个镇区的两个合并组数据点 geom_hline(yintercept = 60, colour = "red", linetype = "dashed") + # 阈值线用虚线更醒目 labs( x = "Sampling Group", y = "Total Individuals", title = "Total Individuals Observed per Combined Sampling Group per Town District", colour = "Town District" ) + scale_y_continuous(breaks = pretty_breaks(n = 10))
为什么之前的方法没起作用?
你之前只修改了Sampling的标签,但没有对每个镇区下的相同合并组进行求和,所以数据还是36行,绘图时每个镇区会显示四个重复标签的点,而不是我们需要的两个汇总点。分组求和才是解决问题的关键步骤!
这样出来的图就会清晰展示每个镇区的Sampling 1+2和Sampling 3+4的总个体数,同时保留你想要的颜色区分、连线效果,红色阈值线也能直观显示哪些组达到了统计要求~
备注:内容来源于stack exchange,提问作者Eonear Black
相关产品推荐
相关产品推荐

