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

使用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"
  )

代码说明

  1. 数据转换:pivot_longer是ggplot绘制堆叠图的必要操作,把每个预期寿命指标转为单独的行,让填充映射能识别不同类别。
  2. 映射修正:Y轴绑定race(种族),填充绑定Life_Expectancy_Type(四个指标),通过facet_grid实现同一种族下不同出生地的条形并列。
  3. 样式调整:position_stack()确保条形内部堆叠,coord_flip()转为水平布局,主题调整让图表更贴合目标样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:54:59