问题描述
我需要弄清楚如何根据特定变量调整绘图的宽度,而无需更改 scales = "free"
函数的 facet_wrap
参数。我尝试使用根据变量调整条形宽度的 case_when
,但出现错误。
以下是可重现的示例,显示了我遇到的问题。
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()
,其中包含一个非常有用的参数:space
。 scales
允许根据“空”数据调整每个图的比例,而 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')
我确实希望 facet_wrap()
有 space
作为参数,但遗憾的是,目前情况并非如此。如果您需要将所有方面都放在一行或一列中,您可以使用 facet_row()
包中的 facet_col()
或 ggforce
。它们允许使用 space
参数,但仅限于一行或一列(不换行)。