Этот вопрос мотивирован дальнейшим изучением этого вопроса . Проблема с принятым решением становится более очевидной при большем несоответствии количества баров на грань. Взгляните на эти данные и результирующий график, используя это решение:
# create slightly contrived data to better highlight width problems
data <- data.frame(ID=factor(c(rep(1,9), rep(2,6), rep(3,6), rep(4,3), rep(5,3))),
TYPE=factor(rep(1:3,length(ID)/3)),
TIME=factor(c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,1)),
VAL=runif(27))
# implement previously suggested solution
base.width <- 0.9
data$w <- base.width
# facet two has 3 bars compared to facet one's 5 bars
data$w[data$TIME==2] <- base.width * 3/5
# facet 3 has 1 bar compared to facet one's 5 bars
data$w[data$TIME==3] <- base.width * 1/5
ggplot(data, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack", aes(width = w),stat = "identity") +
coord_flip()
Вы заметите, что ширина выглядит совершенно правильно, но пробелы в фасете 3 бросаются в глаза. Нет простого способа исправить это в ggplot2, который я видел еще (facet _wrap не имеет опции space
).
Следующий шаг — попытаться решить эту проблему с помощью gridExtra :
# create each of the three plots, don't worry about legend for now
p1 <- ggplot(data[data$TIME==1,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p2 <- ggplot(data[data$TIME==2,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p3 <- ggplot(data[data$TIME==3,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
# use similar arithmetic to try and get layout correct
require(gridExtra)
heights <- c(5, 3, 1) / sum(5, 3, 1)
print(arrangeGrob(p1,p2, p3, ncol=1,
heights=heights))
. Вы заметите, что я использовал ту же арифметику, предложенную ранее, исходя из количества баров на грань, но в этом случае она оказывается ужасно неправильной. Кажется, это потому, что есть дополнительные элементы «постоянной высоты», которые мне нужно учитывать в математике.
Еще одна сложность (Я полагаю )заключается в том, что окончательный вывод (и соответствие ширины )также будут зависеть от ширины и высоты того места, куда я вывожу окончательный grob, находится ли он в среде R/RStudio или в файл PNG.
Как я могу это сделать?