使用 position = "fill" 将条形图拆分为单独的面

Split barplot using position = "fill" into separate facets

我使用 stat = "count" 和 position = "fill" 在 ggplot 中创建了一个条形图,以显示每年每个特征的出现比例(如下)。我发现此图的可读性很差,因此我想将图拆分为多个方面。但是,如果我添加 facet_wrap(~Features),它只会填充每个单独方面的栏。我怎样才能防止这种情况发生?

我的原图代码是:

data %>% ggplot(aes(x = Year, fill = Features)) + geom_bar(stat = "count", position = "fill") + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_y_continuous(labels = scales::percent)

我试过:

data %>% ggplot(aes(x = Year)) + stat_count(geom = "bar", aes(y = ..prop..)) + facet_wrap(~Features) + theme_classic() + theme(axis.text.x = element_text(angle = 90))

但这计算的是分面内的比例,而不是每年内的比例。

有什么办法可以解决这个问题(使用 ggplot,而不是通过重构我的数据)?

关于我的一些数据:

我有一个特征(因子)数据框,每个特征都有观察到该特征的年份(因子)。同一特征每年可能出现多次,因此有几行具有相同的年份和特征条目。

这应该有效。首先,我将制作一些具有相似属性的数据:

labs <- c("Digital labels", "Produce ID (barcode)", 
          "Smart labels", "Product Recommendation", 
          "Shopping list", "Product Browsing", 
          "Product ID (computer vision)", 
          "Navigation (in-store)", "Product ID (RFID)", 
          "Other")

years <- vector(mode="list", length=13)
years[[1]] <- c(1,2)
years[[2]] <- c(1,2,8)
years[[3]] <- c(1,2,4,10)
years[[4]] <- c(1,2,3,4,5,6,8,9,10)
years[[5]] <- c(2,3,4,5,8,10)
years[[6]] <- c(1:6, 10)
years[[7]] <- c(1:6, 10)
years[[8]] <- 1:10
years[[9]] <- c(1,3,6,9,10)
years[[10]] <- c(1:5, 7,9,10)
years[[11]] <- 1:10
years[[12]] <- c(1:6, 8:10)
years[[13]] <-  c(1,2,3,6,8,9,10)
y <- 2008:2020

dat <- NULL
for(i in 1:13){
  tmp <- tibble(
    Features = sample(years[[i]], runif(1,600,1000), replace=TRUE), 
    Year = y[i]
  ) %>% 
    mutate(Features = factor(Features, levels=1:10, labels=labs))
  dat <- rbind(dat, tmp)
}

接下来,这是你最初制作的原始情节。

dat %>% 
  ggplot(aes(x = Year, fill = Features)) + 
  geom_bar(stat = "count", position = "fill") + 
  theme_classic() + 
  theme(axis.text.x = element_text(angle = 90)) + 
  scale_y_continuous(labels = scales::percent)

这是如何转化为不同方面的。关键是先手写百分比,然后直接画出来。

agdat %>% filter(Features != "Other") %>% 
ggplot(aes(x=Year, y=pct)) + 
  geom_bar(stat="identity") + 
  facet_wrap(~Features, ncol=3) + 
  labs(x="Year", y="Percent") + 
  theme_classic() + 
  theme(axis.text.x = element_text(angle = 90)) + 
  scale_y_continuous(labels = scales::percent)