使用geom_col()和coord_flip()绘制目标水平堆叠条形图遇阻求助
问题描述
我想用以下数据集绘制指定的水平堆叠条形图,但现有代码生成的图表和需求差距很大。提供数据集、目标图表样式及尝试的代码,请求修正代码实现目标图表。
数据集
structure(list(UWLE = structure(c(0.600000023841858, 0.600000023841858, 0.800000011920929, 0.699999988079071, 0.899999976158142, 0.300000011920929, 0.400000005960464, 0.400000005960464, 0.400000005960464, 0.5, 0.400000005960464, 0.400000005960464, 0.5, 0.5, 0.600000023841858, 0.699999988079071, 0.699999988079071, 0.899999976158142, 0.800000011920929, 1), format.stata = "%9.0g"), HWLE = structure(c(10.1999998092651, 9.89999961853027, 9.39999961853027, 10.8000001907349, 12.3999996185303, 5, 4.90000009536743, 4.5, 5.30000019073486, 6.5, 7.59999990463257, 7.40000009536743, 7, 8.10000038146973, 9.5, 10.5, 10.3000001907349, 9.69999980926514, 11.1000003814697, 12.8999996185303), format.stata = "%9.0g"), OWLE = structure(c(10.1999998092651, 10, 10, 9.89999961853027, 10.8999996185303, 9.10000038146973, 8.89999961853027, 8.80000019073486, 9, 10.1999998092651, 11.5, 11.1999998092651, 11.3000001907349, 11.3000001907349, 12.3999996185303, 9.89999961853027, 9.80000019073486, 9.80000019073486, 9.69999980926514, 10.6000003814697), format.stata = "%9.0g"), OBLE = structure(c(10.1999998092651, 10.8999996185303, 10.3000001907349, 9.89999961853027, 9.10000038146973, 14.6000003814697, 15.3000001907349, 14.5, 14.3000001907349, 13.8000001907349, 13.1000003814697, 13.8000001907349, 13.1000003814697, 12.8000001907349, 12, 9.69999980926514, 10.3000001907349, 9.80000019073486, 9.39999961853027, 8.60000038146973), format.stata = "%9.0g"), TLE = structure(c(31.1000003814697, 31.3999996185303, 30.3999996185303, 31.2999992370605, 33.2000007629395, 29, 29.3999996185303, 28.2000007629395, 29, 31.1000003814697, 32.5999984741211, 32.9000015258789, 32, 32.7000007629395, 34.5, 30.8999996185303, 31.1000003814697, 30.1000003814697, 31, 33.0999984741211), format.stata = "%9.0g"), birth_place = structure(c(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4), format.stata = "%10.0g", class = c("haven_labelled", "vctrs_vctr", "double"), labels = c(Northeast = 0, Midwest = 1, South = 2, West = 3, Foreign = 4)), race = structure(c(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3), format.stata = "%18.0g", class = c("haven_labelled", "vctrs_vctr", "double"), labels = c(`non-Hispanic White` = 0, `non-Hispanic Black` = 1, Hispanic = 2, `non-Hispanic Other` = 3))), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))
目标图表样式
目标为水平堆叠条形图:
- Y轴为不同种族类别
- 每个种族下按出生地分组(同一种族的不同出生地条形并列)
- 每个条形内部堆叠
UWLE、HWLE、OWLE、OBLE四个指标 - X轴为指标数值
尝试的代码
library(ggplot2) # Convert labeled variables to factors stack_data_G1$birth_place <- as.factor(stack_data_G1$birth_place) stack_data_G1$race <- as.factor(stack_data_G1$race) # Create the stacked horizontal bar plot ggplot(stack_data_G1, aes(x = UWLE + HWLE + OWLE + OBLE, y = reorder(birth_place, -(UWLE + HWLE + OWLE + OBLE)), fill = race)) + geom_col() + coord_flip() + labs(x = NULL, y = NULL, title = "XXXXXX", subtitle = "XXX", yaxis = "YYYY") + scale_y_discrete(labels = c("UWLE", "HWLE", "OWLE", "OBLE")) + theme_minimal() + theme( axis.text.y = element_text(size = 8), axis.title.y = element_text(size = 10), plot.title = element_text(size = 16), plot.subtitle = element_text(size = 12), panel.grid = element_blank() )
解决方案
原代码核心问题是数据格式未转换为长格式,且映射关系完全错误(把种族设为填充、出生地设为Y轴,与目标需求相反)。修正步骤如下:
步骤1:加载包并转换数据格式
将宽格式数据转为长格式,同时保留变量的标签信息:
library(ggplot2) library(tidyr) library(haven) # 保留标签并转换为因子 stack_data_G1$birth_place <- as_factor(stack_data_G1$birth_place) stack_data_G1$race <- as_factor(stack_data_G1$race) # 转换为长格式:将四个预期寿命指标转为类别列 stack_data_long <- pivot_longer(stack_data_G1, cols = c(UWLE, HWLE, OWLE, OBLE), names_to = "Life_Expectancy_Type", values_to = "Years")
步骤2:绘制目标水平堆叠条形图
修正映射关系,实现同一种族下不同出生地的条形并列,内部堆叠四个指标:
ggplot(stack_data_long, aes(x = Years, y = race, fill = Life_Expectancy_Type)) + geom_col(position = position_stack(), width = 0.7) + # 条形内部堆叠 facet_grid(. ~ birth_place, switch = "x") + # 按出生地分栏并列展示 coord_flip() + # 转为水平条形图 labs(x = "预期寿命(年)", y = "种族", fill = "预期寿命类型", title = "不同种族与出生地的预期寿命构成", subtitle = "按UWLE、HWLE、OWLE、OBLE堆叠") + theme_minimal() + theme( axis.text.y = element_text(size = 10), axis.title = element_text(size = 12), plot.title = element_text(size = 16, hjust = 0.5), plot.subtitle = element_text(size = 12, hjust = 0.5), panel.grid = element_blank(), strip.text.x = element_text(size = 10), legend.position = "bottom" )
代码说明
- 数据转换:
pivot_longer是ggplot绘制堆叠图的必要操作,把每个预期寿命指标转为单独的行,让填充映射能识别不同类别。 - 映射修正:Y轴绑定
race(种族),填充绑定Life_Expectancy_Type(四个指标),通过facet_grid实现同一种族下不同出生地的条形并列。 - 样式调整:
position_stack()确保条形内部堆叠,coord_flip()转为水平布局,主题调整让图表更贴合目标样式。
内容的提问来源于stack exchange,提问作者Nader Mehri
相关产品推荐
相关产品推荐

