如何用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
相关产品推荐
相关产品推荐

