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

多列含x与NA的数据集如何用ggplot2绘制堆叠条形图?

如何处理多列超市使用数据绘制堆叠条形图?

嘿,这个场景太常见啦——用户可能同时用多个超市,这种宽格式的数据确实没法直接给ggplot2用。别担心,咱只需要把数据转成长格式,就能轻松画出想要的堆叠条形图了。我给你一步步拆解:

1. 先加载必备的包

我们需要tidyverse套件,它包含了数据处理的dplyr、tidyr和绘图的ggplot2:

library(tidyverse)

2. 把宽格式数据转成长格式

你的数据里,SM1/SM2/SM3是不同的超市列,我们要把这些列“拉长”,变成一列标记超市名称,一列标记是否使用,然后过滤掉未使用(NA)的记录:

# 先定义你的原始数据
df <- data.frame("Name"=c("A", "B", "C", "D", "E", "F"), 
                 "SM1"=c(NA, NA, "x", NA, "x", "x"), 
                 "SM2"=c("x", NA, NA, "x", "x", NA), 
                 "SM3"=c("x", "x", "x", NA, NA, NA), 
                 "Gender"=c("female", "male","male","male","female","female") )

# 转换数据格式
long_df <- df %>%
  pivot_longer(cols = starts_with("SM"),  # 选中所有以SM开头的列
               names_to = "Supermarket",  # 新列名:超市名称
               values_to = "Used") %>%    # 新列名:是否使用
  filter(Used == "x")  # 只保留使用了超市的记录

这一步之后,long_df里每一行代表一个用户使用某一个超市的记录,比如用户A同时用了SM2和SM3,就会变成两行数据。

3. 统计每个超市的男女用户数量

接下来我们统计每个超市下,男性和女性用户的人数:

count_df <- long_df %>%
  count(Supermarket, Gender)  # 按超市和性别分组计数

count()函数会自动生成一个n列,代表每组的人数,完美适配绘图需求。

4. 绘制堆叠条形图

现在用ggplot2画堆叠条形图就很简单了:

ggplot(count_df, aes(x = Supermarket, y = n, fill = Gender)) +
  geom_col(position = "stack") +  # 堆叠条形图(position="stack"是默认值,可省略)
  labs(title = "各超市男女用户使用数量对比",
       x = "超市名称",
       y = "用户数量",
       fill = "性别") +
  theme_minimal()

theme_minimal()是让图表更清爽的主题,你也可以换成theme_bw()这类其他主题。

完整代码整合

把所有步骤放在一起就是:

library(tidyverse)

# 原始数据
df <- data.frame("Name"=c("A", "B", "C", "D", "E", "F"), 
                 "SM1"=c(NA, NA, "x", NA, "x", "x"), 
                 "SM2"=c("x", NA, NA, "x", "x", NA), 
                 "SM3"=c("x", "x", "x", NA, NA, NA), 
                 "Gender"=c("female", "male","male","male","female","female") )

# 数据转换+统计
count_df <- df %>%
  pivot_longer(cols = starts_with("SM"),
               names_to = "Supermarket",
               values_to = "Used") %>%
  filter(Used == "x") %>%
  count(Supermarket, Gender)

# 绘图
ggplot(count_df, aes(x = Supermarket, y = n, fill = Gender)) +
  geom_col() +
  labs(title = "各超市男女用户使用数量对比",
       x = "超市名称",
       y = "用户数量",
       fill = "性别") +
  theme_minimal()

这样你就能得到每个超市的男女用户堆叠条形图啦,而且完全支持用户同时使用多个超市的情况~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:52:30