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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:06:03