如何为散点图还原已分箱的长度数据(反分箱操作)
已分箱长度数据的反分箱与散点/抖动图绘制
你的核心需求是将分箱计数的长度数据展开(反分箱),保留对应日期后绘制以日期为X轴、长度为Y轴的散点/抖动图,以下是具体解决方案:
示例数据与长格式转换
先回顾你的初始数据处理步骤:
# 示例分箱数据 df <- as.data.frame(cbind(c(20:30), c(0,0,2,3,5,2,0,0,0,0,0), c(0,0,0,2,5,3,2,0,0,0,0), c(0,0,0,0,1,4,4,3,0,0,0))) colnames(df) <- c('Length','01-01-2023','01-02-2023','01-03-2023') # 转换为长格式 library(reshape2) df2 <- melt(df, id.var="Length") colnames(df2)[2:3] <- c("Date", "Number") df2$Date <- as.Date(df2$Date, "%m-%d-%Y")
反分箱(展开计数)的两种实用方法
方法1:Base R原生rep()函数
先过滤掉计数为0的无效行,再按Number列的数值重复对应行的日期和长度:
# 过滤0计数行 df_filtered <- df2[df2$Number > 0, ] # 按计数展开行 df_unbinned <- df_filtered[rep(seq(nrow(df_filtered)), df_filtered$Number), c("Date", "Length")] # 重置行名(可选) rownames(df_unbinned) <- NULL
方法2:tidyr包uncount()函数
uncount()是专门用于按计数展开行的工具,代码更简洁:
library(tidyr) # 直接按Number列的计数展开,自动跳过0计数行 df_unbinned <- df2 %>% uncount(Number) %>% select(Date, Length)
绘制散点/抖动图
用ggplot2绘制抖动图(避免同日期同长度的点完全重叠):
library(ggplot2) ggplot(df_unbinned, aes(x = Date, y = Length)) + geom_jitter(width = 0.2, alpha = 0.6) + # width控制横向抖动幅度,alpha调整点透明度 labs(x = "日期", y = "长度", title = "长度随日期分布抖动图") + theme_minimal()
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

