多列含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
相关产品推荐
相关产品推荐

