Равная высота для 2 графиков в ggarrange

#r #ggplot2 #plot

#r #ggplot2 #график

Вопрос:

Для простоты вот исполняемый код с поддельными данными, который точно создает проблему. Графики,

 library(ggplot2)
library(ggpubr)

data1 <- data.frame(
  V1=replicate(18, {sample(1:18, 1)}),
  V2=replicate(18, {sample(1:3, 1)}),
  V3=replicate(18, {sample(1:3, 1)})
)

graph1 <- ggplot(data1, aes(x=V1, y=V2, fill=V3)) geom_tile(size=0.5) coord_equal()

data2 <- data.frame(
  V1=replicate(18, {sample(1:3, 1)}),
  V2=replicate(18, {sample(1:3, 1)})
)
graph2 <- ggplot(data2, aes(x=c("A"), y=V1,fill=V2)) geom_tile(size=0.5) coord_equal()

ggarrange(graph1, graph2, labels = c("A", "B"), ncol = 2, nrow = 1)
 

генерировать,

введите описание изображения здесь

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

Обратите внимание, что результат аналогичен тому, что получается при запуске ggarrange , nrow=5 но если я это сделаю, то график будет плоским, а все остальные элементы выглядят странно:

введите описание изображения здесь

Использование widths , как предложено в одном ответе, генерирует:

введите описание изображения здесь

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

Ответ №1:

Одним из вариантов является указание относительной ширины каждого рисунка, например

 library(tidyverse)
library(ggpubr)
data1 <- data.frame(
  V1=replicate(18, {sample(1:18, 1)}),
  V2=replicate(18, {sample(1:3, 1)}),
  V3=replicate(18, {sample(1:3, 1)})
)

graph1 <- ggplot(data1, aes(x=V1, y=V2, fill=V3)) geom_tile(size=0.5) coord_equal()

data2 <- data.frame(
  V1=replicate(18, {sample(1:3, 1)}),
  V2=replicate(18, {sample(1:3, 1)})
)
graph2 <- ggplot(data2, aes(x=c("A"), y=V1,fill=V2)) geom_tile(size=0.5) coord_equal()

ggarrange(graph1, graph2, labels = c("A", "B"), ncol = 2, nrow = 1, widths = c(0.85, 0.15))
 

Вы можете указать размеры при сохранении графика:

 ggsave(filename = "example.png", width = 12, height = 3, units = "in")
 

пример2.png

Редактировать
В файле RMarkdown вы также можете указать fig.height и fig.width для изменения размеров конечного рисунка, например

 
> ---
> title: "test"
> author: "test"
> date: "11/12/2020"
> output: html_document
> ---
> 
> ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ```
> 
> ```{r plot, fig.height=3, fig.width=12}
> library(tidyverse)
> library(ggpubr)
> data1 <- data.frame(   V1=replicate(18, {sample(1:18,
> 1)}),   V2=replicate(18, {sample(1:3, 1)}),   V3=replicate(18,
> {sample(1:3, 1)}) )
> 
> graph1 <- ggplot(data1, aes(x=V1, y=V2,
> fill=V3)) geom_tile(size=0.5) coord_equal()
> 
> data2 <- data.frame(   V1=replicate(18, {sample(1:3, 1)}),  
> V2=replicate(18, {sample(1:3, 1)}) ) graph2 <- ggplot(data2,
> aes(x=c("A"), y=V1,fill=V2)) geom_tile(size=0.5) coord_equal()
> 
> ggarrange(graph1, graph2, labels = c("A", "B"), ncol = 2, nrow = 1,
> widths = c(0.85, 0.15))
> ```
 

rmarkdown_example.png

Комментарии:

1. Спасибо, однако это выглядит правильно только в файле png. Есть ли способ сделать так, чтобы это выглядело так во всех случаях?

2. Да, в R studio высоты не совпадают. Я полагаю, что даже размер экрана оказывает некоторое влияние на то, как он выглядит.

3. Я обновил хорошие усилия, вложенные в ваш ответ, но я определенно ищу решение, которое не требует изменения размера, поскольку конечным результатом будет связанный HTML-документ. Я не могу рассчитывать на то, что конечный пользователь изменит размер графика. Есть ли какое-либо другое решение для постоянного сохранения равных высот?

4. Привет, @adelriosantiago, мой отредактированный ответ решает вашу проблему?

5. Извините @adelriosantiago, у меня нет идей — не стесняйтесь удалять вопрос и делать репост, чтобы попытаться получить лучший ответ. Было бы здорово использовать некоторые из ваших фактических данных, если это возможно. Извините, я не смог помочь больше