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

如何用R的ggplot绘制多变量直方图?附示例数据

用ggplot2绘制多变量分组柱状图

当然可以用ggplot2实现你想要的这种图形!你遇到的问题本质是宽格式数据转长格式的问题——ggplot2更适合处理“每个观测值一行”的整洁数据,而你的示例数据是宽格式(每个统计变量占一列)。下面是完整的实现步骤:

1. 构造示例数据

首先把你提供的数据转换成R可识别的数据框:

library(tidyverse)

# 构造示例数据框
df <- tibble(
  X = c("A", "B", "C", "D", "E", "F"),
  aggr_a = c(470676, 549142, 256204, 248256, 1581770, 1932096),
  aggr_b = c(594423, 657291, 311723, 276593, 1717788, 2436769),
  count = c(58615, 67912, 26606, 40201, 250553, 385556)
)

2. 转换为长格式数据

使用tidyr::pivot_longer()把宽格式数据转成ggplot需要的长格式——将aggr_a、aggr_b、count三个变量合并为两列:一列表示统计量名称(metric),一列表示对应数值(value):

df_long <- df %>%
  pivot_longer(cols = -X,  # 除了X列之外的所有列都要转换
               names_to = "metric",  # 新列名:统计量类型
               values_to = "value")  # 新列名:统计量数值

转换后的数据结构大概是这样的:

# A tibble: 18 × 3
   X     metric   value
   <chr> <chr>    <dbl>
 1 A     aggr_a  470676
 2 A     aggr_b  594423
 3 A     count    58615
 4 B     aggr_a  549142
# … with 14 more rows

3. 绘制分组柱状图

现在用ggplot2绘制每个类别(X)下对应三个统计量的柱状图,通过fill参数区分不同统计量,position = "dodge"让同一类别下的柱子并排显示:

ggplot(df_long, aes(x = X, y = value, fill = metric)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +  # 调整柱子宽度和间距
  labs(
    title = "各类别统计量对比",
    x = "类别",
    y = "数值",
    fill = "统计量类型"
  ) +
  theme_minimal() +
  # 可选:添加柱子顶部的数值标签
  geom_text(
    aes(label = scales::comma(value)),  # 用千分位格式显示数值
    position = position_dodge(width = 0.8),
    vjust = -0.5,
    size = 3
  )

关键说明

  • 为什么要转长格式?ggplot2的语法设计是基于整洁数据原则:每个变量占一列,每个观测占一行。原来的宽格式中,aggr_a、aggr_b、count其实是同一个变量(统计量类型)的不同取值,所以需要合并成一列才能让ggplot识别分组逻辑。
  • 如果想要更贴近你目标图的样式(比如颜色、主题),可以调整scale_fill_manual()自定义颜色,或者修改theme()中的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:52