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

R绘制多二分类变量堆叠/分面条形图 分析自变量对因变量影响

问题解决方法

你代码的核心问题出在数据长表转换的逻辑错误:ftable()生成的频率存储在s的Freq列中,你之前的melt操作误将自变量的0/1取值作为了value列,没有正确关联频率值。

完整可运行代码

1. 依赖加载与示例数据

library(ggplot2)
library(reshape2)
library(scales)

# 示例数据
df<- data.frame(
  DV=c(0,0,1), 
  V1=c(0,0,0), 
  V2=c(0,0,1), 
  V3=c(0,1,0))

2. 正确的数据转换

# 先把宽表转成长表,把所有V开头的自变量合并到同一列
df_long <- melt(df, id.vars = "DV", variable.name = "variable", value.name = "var_value")
# 按DV、变量名、变量取值分组计算占比
df_stat <- as.data.frame(prop.table(table(df_long$DV, df_long$variable, df_long$var_value), margin = c(1,2)))
# 重命名列方便后续映射
colnames(df_stat) <- c("DV", "variable", "var_value", "freq")
# 把DV转成分类型方便绘图分组
df_stat$DV <- factor(df_stat$DV, levels = c(0,1), labels = c("DV=0", "DV=1"))

3. 绘图实现

方案1:分面条形图(对应需求里的顶部效果)

ggplot(df_stat, aes(x = var_value, y = freq, fill = var_value)) +
  geom_col() +
  facet_grid(DV ~ variable) +
  scale_y_continuous(labels = percent_format()) +
  labs(x = "自变量取值", y = "占比", fill = "取值") +
  theme_minimal()

方案2:分段堆叠条形图(对应需求里的最优效果)

ggplot(df_stat, aes(x = variable, y = freq, fill = interaction(var_value, DV))) +
  geom_col(position = "stack") +
  scale_y_continuous(labels = percent_format()) +
  labs(x = "自变量", y = "占比", fill = "取值&DV分组") +
  theme_minimal()

如果需要百分比堆叠效果,将position = "stack"修改为position = "fill"即可。

内容的提问来源于stack exchange,提问作者iambling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:27:03