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

如何用ggplot将数据框多列变量绘制成多列布局组合柱状图

解决方案:多变量柱状图的两列组合布局

针对你遇到的问题——各列数值范围差异极大,facet_grid效果不佳,需要将a至e列的柱状图合并为两列布局的组合图,这里有两种实用的方案:

方法一:用tidyverse转长格式 + facet_wrap(推荐,代码简洁)

这种方法先把宽格式的数据转为长格式,再利用facet_wrap实现分面,同时开启scales="free_y"让每个子图的y轴独立缩放,完美解决数值范围差异的问题。

完整代码:

# 加载所需包
library(tidyverse)

# 生成你的数据
set.seed(99)
data = data.frame(name=c("toyota", "nissan"), 
                  a=sample(1:10,2)/10,
                  b=sample(-150:-50,2),
                  c=sample(1e2:1e3,2),
                  d=sample(1e3:1e5,2), 
                  e=sample(-15:30,2))

# 将宽格式转为长格式
data_long <- data %>%
  pivot_longer(cols = a:e, # 指定要转换的列
               names_to = "variable", # 新列名:变量名
               values_to = "value") # 新列名:变量值

# 绘制组合图
ggplot(data_long, aes(x = name, y = value)) +
  geom_bar(stat = "identity", fill = "#2E86AB", alpha = 0.8) +
  facet_wrap(~variable, ncol = 2, scales = "free_y") + # 两列布局,y轴自由缩放
  labs(title = "各变量柱状图组合", x = "品牌", y = "数值") +
  theme_bw()

为什么这个方法比facet_grid好?

facet_grid是按网格严格分面,而facet_wrap可以自动调整布局,ncol=2直接指定两列,加上scales="free_y"让每个子图的y轴根据自身数据范围调整,不会像堆叠图或统一y轴那样导致小数值的柱子几乎看不见。


方法二:用patchwork包拼接独立图表(更灵活,可自定义每个子图)

如果你需要对每个子图做个性化调整(比如不同的颜色、标题),patchwork包可以让你像搭积木一样拼接单独的图表,自由度更高。

完整代码:

# 加载所需包
library(ggplot2)
library(patchwork)

# 生成数据(和之前一致)
set.seed(99)
data = data.frame(name=c("toyota", "nissan"), 
                  a=sample(1:10,2)/10,
                  b=sample(-150:-50,2),
                  c=sample(1e2:1e3,2),
                  d=sample(1e3:1e5,2), 
                  e=sample(-15:30,2))

# 分别绘制每个变量的柱状图
p_a <- ggplot(data, aes(x=name, y=a)) + geom_bar(stat="identity", fill="red") + labs(title="变量a")
p_b <- ggplot(data, aes(x=name, y=b)) + geom_bar(stat="identity", fill="blue") + labs(title="变量b")
p_c <- ggplot(data, aes(x=name, y=c)) + geom_bar(stat="identity", fill="green") + labs(title="变量c")
p_d <- ggplot(data, aes(x=name, y=d)) + geom_bar(stat="identity", fill="orange") + labs(title="变量d")
p_e <- ggplot(data, aes(x=name, y=e)) + geom_bar(stat="identity", fill="purple") + labs(title="变量e")

# 拼接成两列布局:上面3个,下面2个
(p_a + p_b + p_c) / (p_d + p_e) +
  plot_annotation(title = "各变量柱状图组合", theme = theme_bw())

优势说明

这种方法可以给每个子图设置不同的样式,甚至调整每个图的坐标轴标签、颜色等,适合需要精细化调整的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:09:58