ggplot2 + gridExtra :как сделать так, чтобы полоса geom _в групах графиков разного размера приводила к одинаковой ширине полосы

Этот вопрос мотивирован дальнейшим изучением этого вопроса . Проблема с принятым решением становится более очевидной при большем несоответствии количества баров на грань. Взгляните на эти данные и результирующий график, используя это решение:

# 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()

widths all the same but spacing is bad

Вы заметите, что ширина выглядит совершенно правильно, но пробелы в фасете 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))

widths wrong

. Вы заметите, что я использовал ту же арифметику, предложенную ранее, исходя из количества баров на грань, но в этом случае она оказывается ужасно неправильной. Кажется, это потому, что есть дополнительные элементы «постоянной высоты», которые мне нужно учитывать в математике.

Еще одна сложность (Я полагаю )заключается в том, что окончательный вывод (и соответствие ширины )также будут зависеть от ширины и высоты того места, куда я вывожу окончательный grob, находится ли он в среде R/RStudio или в файл PNG.

Как я могу это сделать?

10
задан Matt 18 July 2018 в 00:21
поделиться