Как разместить несколько графиков ggplot в формате p4? - PullRequest
1 голос
/ 24 февраля 2020

Рассмотрим этот простой пример

library(dplyr)
library(ggplot)
library(patchwork)

mytib <- tibble(group = as.factor(c(1,1,1,1,2,2,2,2,3,3,3,3)),
       y = c(1,2,3,42,50,400,3,3,2,3,3,4),
       x = c('a','b','c','d','a','b','c','d','a','b','c','d'))


p1 <- mytib %>% ggplot(aes(x = x, y = y, fill = group)) +
  geom_col() + ggtitle('this is a messy chart')+
  coord_flip()+
  xlab('Hello') +
  ylab('This is a nice comment')

Теперь я использую patchwork для объединения диаграмм, чтобы я получил 3 строки по 3 диаграммы в каждой на обычной a4 pdf странице

(p1 + p1 + p1)/
(p1 + p1 + p1)/
(p1 + p1 + p1)

ggsave(file="a4_output.pdf", width = 210, height = 297, units = "mm")

enter image description here

Вывод хороший a4 pdf, но проблема в том, что диаграммы на pdf очень растянуты. Есть ли способ сохранить их исходное соотношение (в формате PDF), чтобы они выглядели менее растянутыми, даже три на одном ряду? Я не против, если они выглядят меньше.

Есть идеи? Спасибо!

1 Ответ

2 голосов
/ 25 февраля 2020

Проблема заключается в изменении соотношения сюжета. Теперь coord_flip не работает с фиксированным отношением - но пользователь Axeman объяснил, как решить эту проблему - используйте ggstance !! Я слегка изменил сюжет, используя geom_colh, переключил ваши x и y и добавил фиксированное соотношение. Теперь мы можем использовать макет вашего графика или просто упаковать графики в список и использовать wrap_plots. Я не использовал вывод reprex, потому что делюсь снимком экрана с вывода PDF.

library(tidyverse)
library(patchwork)
library(ggstance)

mytib <- tibble(group = as.factor(c(1,1,1,1,2,2,2,2,3,3,3,3)),
                y = c(1,2,3,42,50,400,3,3,2,3,3,4),
                x = c('a','b','c','d','a','b','c','d','a','b','c','d'))

p1 <- 
  mytib %>% ggplot(aes(x = y, y = x, fill = group)) +
  geom_colh() + ggtitle('this is a messy chart')+
  coord_fixed(100)+
  xlab('Hello') +
  ylab('This is a nice comment')

plotlist <- list()
for(i in 1:9) { plotlist[[i]] <- p1 }

ggsave(plot = wrap_plots(plotlist), file="a4_output.pdf", width = 210, height = 297, units = "mm")

enter image description here

Другое решение состоит в добавлении еще одной строки - не с пустым графиком, а с использованием plot_layout

(p1 + p1 + p1)/
  (p1 + p1 + p1)/
  (p1 + p1 + p1) +
  plot_layout(nrow = 4)
...