如何在ggplot2分组柱状图中添加CHILDREN二元变量
实现按CHILDREN拆分分组柱状条的方法
要在每个FAM_TYPE下的每个NAME(CSBG Entity)柱状条中,按二元变量CHILDREN拆分出独立柱子,只需调整ggplot2的分组映射和位置参数,以下是两种常用实现方式:
方式一:保持FAM_TYPE为x轴,NAME+CHILDREN作为子分组
这种方式下,x轴仍为家庭类型FAM_TYPE,每个x位置下同时展示所有NAME和CHILDREN的组合柱子:
ggimg3 <- ggplot(f.fam_chart3, aes(x = as.factor(FAM_TYPE), y = EST_PCT, # 按NAME和CHILDREN的组合分组、设置填充色 group = interaction(NAME, CHILDREN), fill = interaction(NAME, CHILDREN))) + geom_bar(stat = "identity", position = position_dodge(width = 0.8), color = "black") + geom_text(aes(label = percent(EST_PCT)), # 标签偏移宽度与柱子保持一致,避免错位 position = position_dodge(width = 0.8), vjust = -0.8, size = 4) + scale_fill_manual(values = barCol) # 注意:若barCol数量不足,需扩展为对应NAME+CHILDREN组合的颜色数 scale_y_continuous(limits = c(0, maxLim), label = percent, expand = c(0, 0)) + labs(fill = "CSBG Entity & 是否有孩子") # 自定义图例标题,提升可读性
关键修改说明
group = interaction(NAME, CHILDREN):明确告诉ggplot按NAME和CHILDREN的组合生成独立柱子,是拆分的核心设置;fill = interaction(NAME, CHILDREN):让每个组合对应唯一填充色,方便区分不同分组;若想保留NAME的主色调,仅用填充区分CHILDREN,可改为fill = CHILDREN并保留color = NAME(柱子边框为NAME颜色,内部填充按CHILDREN区分);- 统一
position_dodge的width值:确保柱子和标签的偏移对齐。
方式二:x轴设为FAM_TYPE+NAME组合,CHILDREN作为子拆分
这种方式下,x轴展示FAM_TYPE和NAME的组合,每个组合下拆分为CHILDREN的两个柱子,结构更清晰:
ggimg3 <- ggplot(f.fam_chart3, aes(x = interaction(FAM_TYPE, NAME), y = EST_PCT, fill = CHILDREN, group = CHILDREN)) + geom_bar(stat = "identity", position = position_dodge(width = 0.8), color = "black") + geom_text(aes(label = percent(EST_PCT)), position = position_dodge(width = 0.8), vjust = -0.8, size = 4) + # 自定义CHILDREN的两种填充色 scale_fill_manual(values = c("有孩子" = "#2E8B57", "无孩子" = "#FF6347")) + scale_y_continuous(limits = c(0, maxLim), label = percent, expand = c(0, 0)) + labs(x = "家庭类型 & CSBG Entity", fill = "是否有孩子") + # 旋转x轴标签,避免文字重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
适用场景
如果希望同一FAM_TYPE下的同一NAME柱子相邻排列,这种方式更直观,适合需要聚焦每个实体(NAME)内部差异的场景。
内容的提问来源于stack exchange,提问作者ABickford
相关产品推荐
相关产品推荐

