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
相关产品推荐
相关产品推荐

