r ggplot 如何调整bar的列宽

问题描述

我需要弄清楚如何根据特定变量调整绘图的宽度,而无需更改 scales = "free" 函数facet_wrap 参数。我尝试使用根据变量调整条形宽度的 case_when,但出现错误

enter image description here

以下是可重现的示例,显示了我遇到的问题。

library(tidyverse)

set.seed(1)

data.frame(date = rep(seq.Date(Sys.Date(),by = "day",length.out = 10),3),Time = rep(c("AM","PM"),each = 30),office = rep(LETTERS[1:3],2),n = sample(c(50:100),60,replace = TRUE)) %>%
add_row(date = Sys.Date(),Time = "AM",office = "Z",n = 80) %>%
ggplot(aes(x = date,y = n,group = office)) +
geom_bar(stat = 'identity',position = 'stack',width = .7,show.legend = FALSE,alpha =.75) +
facet_wrap(vars(office,Time),ncol = 2,labeller = "label_both",scales = "free")

解决方法

如果您没有特别要求使用 facet_wrap(),则应该使用 facet_grid(),其中包含一个非常有用的参数:spacescales 允许根据“空”数据调整每个图的比例,而 space 可以做同样的事情,但允许您保持条形的总宽度不变。

data.frame(date = rep(seq.Date(Sys.Date(),by = "day",length.out = 10),3),Time = rep(c("AM","PM"),each = 30),office = rep(LETTERS[1:3],2),n = sample(c(50:100),60,replace = TRUE)) %>%
  add_row(date = Sys.Date(),Time = "AM",office = "Z",n = 80) %>%
  ggplot(aes(x = date,y = n,group = office)) +
  geom_bar(stat = 'identity',position = 'stack',width = .7,show.legend = FALSE,alpha =.75) +
  facet_grid(office ~ Time,labeller = "label_both",scales = "free",space='free')

enter image description here

我确实希望 facet_wrap()space 作为参数,但遗憾的是,目前情况并非如此。如果您需要将所有方面都放在一行或一列中,您可以使用 facet_row() 包中的 facet_col()ggforce。它们允许使用 space 参数,但仅限于一行或一列(不换行)。