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

能否使用facet_wrap按列生成多面板条形图?

问题描述

我有一个包含4列的数据集,希望基于最后3列生成一组多面板条形图,数据集结构如下:

| name | title1 | title2 | title3 |
| x    | 10     | 10     | 10     |
| y    | 10     | 10     | 10     |

我可以单独绘制每个条形图并排展示,但希望能同时对比这三个图,请问是否可以实现?

单独绘制每个条形图的代码:

df %>% 
  ggplot(aes(x = name, y = title1)) +
  geom_bar(stat = "identity")

df %>% 
  ggplot(aes(x = name, y = title2)) +
  geom_bar(stat = "identity")

df %>% 
  ggplot(aes(x = name, y = title3)) +
  geom_bar(stat = "identity")

我尝试的代码:

df %>% 
  ggplot(aes(x = name, y = title1 + title2 + title3)) +
  geom_bar(stat = "identity") +
  facet_wrap(~title1 + title2 + title3, ncol = 3)

得到的结果如下:
错误生成的多面板图

解决方案

你的核心问题是没有将宽格式数据转换为ggplot适用的长格式数据。直接对列值做加总并以此作为分面依据,只会生成所有值的总和面板,无法拆分出三个title的独立对比图。

正确实现步骤如下:

  1. 使用tidyr::pivot_longer将最后3列转换为两列:一列存储类别(title1/title2/title3),另一列存储对应数值;
  2. 基于转换后的分类变量设置分面,同时用该变量映射y轴数值。

完整代码:

library(tidyverse)

# 将宽格式数据转换为长格式
df_long <- df %>%
  pivot_longer(
    cols = starts_with("title"),  # 选择所有以title开头的列
    names_to = "category",        # 新列名:存储原列的标题(title1/2/3)
    values_to = "value"           # 新列名:存储原列的数值
  )

# 绘制多面板条形图
df_long %>%
  ggplot(aes(x = name, y = value)) +
  geom_bar(stat = "identity") +
  facet_wrap(~category, ncol = 3) +  # 按category分面,横向排列3个面板
  labs(x = "名称", y = "数值", title = "三类数值对比条形图")  # 可选:添加轴标签和标题

关键说明

  • pivot_longer:这是实现多面板对比的核心,它把分散在多列的数值整合到一列,同时用另一列标记数值的类别,让ggplot能识别每个面板对应的分组;
  • facet_wrap(~category):根据category变量拆分出3个独立面板,ncol=3确保三个图横向并排,最大化对比效果;
  • 保留geom_bar(stat="identity")即可,因为我们是用已知的数值直接绘制条形图。

运行上述代码后,你会得到三个并排的条形图,每个图对应一个title的数值,完全满足同时对比的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:15:29