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

如何使用权重基于多数据集生成ggplot横向对比填充条形图

解决方案

方法1:直接在ggplot中使用权重参数(最简实现)

不需要提前手动计算占比,geom_bar的weight参数可直接传入权重列,配合position="fill"自动计算加权占比,代码极简:

library(ggplot2)

# 合并数据集并标记时间点
df$time <- 1
df2$time <- 2
combined_df <- rbind(df, df2)

# 预处理:转因子、过滤NA(按需调整)
combined_df$var <- as.factor(combined_df$var)
combined_df <- na.omit(combined_df)

# 生成加权成对横向条形图
ggplot(combined_df, aes(x = factor(time), fill = var)) +
  geom_bar(aes(weight = wght), position = "fill") +
  coord_flip() +
  labs(x = "调查时间点", y = "加权占比", fill = "响应类别") +
  theme_minimal() # 接近皮尤风格的简洁主题

方法2:提前汇总加权占比(适配复杂分组)

如果后续需要多维度分组(如按国家、性别、年龄拆分),用dplyr提前分组计算加权占比,逻辑更清晰且灵活:

library(dplyr)
library(ggplot2)

# 合并+预处理数据
df$time <- 1
df2$time <- 2
combined_df <- rbind(df, df2) %>%
  na.omit() %>%
  mutate(var = as.factor(var)) %>%
  # 按时间+国家分组,计算每个响应类别的加权占比
  group_by(time, country, var) %>%
  summarise(total_wght = sum(wght), .groups = "drop_last") %>%
  mutate(weighted_pct = total_wght / sum(total_wght)) %>%
  ungroup()

# 绘制按国家分面的成对条形图
ggplot(combined_df, aes(x = factor(time), y = weighted_pct, fill = var)) +
  geom_col(position = "fill") +
  coord_flip() +
  facet_wrap(~country) + # 按国家拆分图表
  labs(x = "调查时间点", y = "加权占比", fill = "响应类别") +
  theme_minimal()

两种方法的适用场景

  • 方法1:适合快速生成基础图表,无需额外数据整理,直接利用ggplot内置逻辑处理权重。
  • 方法2:适合复杂分组需求,提前汇总后便于调整计算规则,也方便检查中间结果的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:42:26