首页 > 解决方案 > 如何使用 ggplot 和 facet_wrap 在 R 中绘制因子属性

问题描述

我有一个数据集,其中包含许多共享共同值的属性(价格范围,例如“£11-£20”、“£21-£30”......)作为因素存储。我正在尝试使用 facet_wrap 绘制这些属性的选择,并为每个属性绘制条形图,并在 x 轴上显示价格范围。

我可以单独获得我想要的图表,但我想将这些属性分组,因为它们是相关的。示例代码如下:

dat <- data.frame(
  breakfast = factor(c("£11-£20","£11-£20","£21-30","£0-£10","£11-£20")),
  lunch = factor(c("£0-£10","£11-£20","£21-30","£11-£20","£21-30")),
  dinner = factor(c("£0-£10","£31-£40","£21-30","£11-£20","£21-30")),
  voucher_used = c(0,1,1,0,1)
)
View(dat)

ggplot(dat, aes(x = breakfast, fill = factor(voucher_used))) +
  geom_bar() +
  xlab("Breakfast") +
  ylab("No.") +
  labs(fill = "Voucher Used") # +
# facet_wrap(~ lunch)

理想情况下,我想在午餐和晚餐旁边添加相同的地块 - 是否有可能或是否有另一种更好的方法来实现相同的结果?

非常感谢

标签: rggplot2facet-wrapr-factor

解决方案


是的,可以使用一些tidyverse函数将您的数据重新整形为长格式:

library(ggplot2)
library(dplyr)
library(tidyr)
#Data
dat <- data.frame(
  breakfast = factor(c("£11-£20","£11-£20","£21-30","£0-£10","£11-£20")),
  lunch = factor(c("£0-£10","£11-£20","£21-30","£11-£20","£21-30")),
  dinner = factor(c("£0-£10","£31-£40","£21-30","£11-£20","£21-30")),
  voucher_used = c(0,1,1,0,1)
)
#Plot
dat %>% pivot_longer(-voucher_used) %>%
  ggplot(aes(x = value, fill = factor(voucher_used))) +
  geom_bar() +
  xlab("Breakfast") +
  ylab("No.") +
  labs(fill = "Voucher Used") +
  facet_wrap(~ name,scales = 'free')+xlab('Var')

输出:

在此处输入图像描述


推荐阅读