如何在R中绘制不同ID分组对应二值数据的分段条形图
实现二值分段条形图的代码调整方案
首先对原数据做预处理,修正列名与格式:
# 修正ID列名(原dput输出的首列名存在乱码) colnames(df)[1] <- "ID" # 转换日期格式保证顺序正确 df$Date <- as.Date(df$Date, format = "%d/%m/%Y") df <- df[order(df$ID, df$Date), ]
接下来根据你的实际需求选择对应绘图方案:
方案1:保留时间顺序的连续分段条形(展示Bin随时间的变化)
每个ID对应一条水平条,按观测时间顺序显示Bin的0/1变化,连续相同Bin的块会自然拼接,效果更贴近“分段”的时间序列特征:
library(ggplot2) ggplot(df, aes(x = Date, y = ID, fill = factor(Bin))) + geom_tile(height = 0.8) + scale_fill_manual(values = c("0" = "steelblue", "1" = "orange"), name = "Bin取值") + labs(x = "日期", y = "唯一ID") + theme_minimal()
如果不需要显示具体日期,可将x映射为ID内部的观测序号:
# 生成每个ID内部的观测顺序号 df$obs_index <- ave(rep(1, nrow(df)), df$ID, FUN = cumsum) ggplot(df, aes(x = obs_index, y = ID, fill = factor(Bin))) + geom_tile(height = 0.8) + scale_fill_manual(values = c("0" = "steelblue", "1" = "orange"), name = "Bin取值") + labs(x = "观测顺序", y = "唯一ID") + theme_minimal()
方案2:汇总计数的两段堆叠条形(仅展示0/1的总数量占比)
如果只需要每个ID的条形拆分为0、1两类总长度的两段,先汇总每个ID下0和1的数量再绘制堆叠图即可:
library(dplyr) library(ggplot2) # 按ID和Bin分组统计数量 df_sum <- df %>% group_by(ID, Bin) %>% summarise(cnt = n(), .groups = "drop") ggplot(df_sum, aes(x = ID, y = cnt, fill = factor(Bin))) + geom_col(position = "stack") + scale_fill_manual(values = c("0" = "steelblue", "1" = "orange"), name = "Bin取值") + labs(x = "唯一ID", y = "观测数量") + theme_minimal()
原有代码问题说明
你之前的代码错误将y轴映射为Bin,stat="identity"会对每个ID的Bin值求和,得到的是Bin的累加高度,无法实现分段效果,也不需要额外添加分面参数。
内容的提问来源于stack exchange,提问作者pipts
相关产品推荐
相关产品推荐

