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

