Совместите фасетные ggplots (facet_wrap) с cowplot в R

Я пытаюсь выровнять два графика панели, созданные с помощью facet_wrap в ggplot, следующим образом (примечание: панель A должна оставаться пустой):

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

Я заметил, однако, что оси Y панели B не точно выровнены с осями Y от последнего до графиков панели C (несмотря на опцию axis = 'lb' в обоих аспектах).

Код

# Load libraries
library(tidyverse)
library(cowplot)

# Create two facetted plots 
p1 <- ggplot(data = diamonds, aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 5) +
  geom_point(size=0.5)

p2<- ggplot(data = filter(diamonds, price < 900 & (cut == "Fair" | cut == "Good" )), aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 2) +
  geom_point(size=0.5)

# Create panel A and panel B
a <- plot_grid(NULL, p2, labels = c("A", "B"), axis = 'lb', ncol = 2, rel_widths = c(3,2))

# Create a combined panel of 'a' and panel C
plot_grid(a, p1, labels = c("", "C"), axis = 'lb', ncol = 1, rel_heights = c(1,1))

Сначала я подумал, что это как-то связано с меткой оси Y, но удаление метки не решает проблему.

Вопрос

Что вызывает такое поведение и как вы можете выровнять графики, созданные с помощью facet_wrap, с помощью пакета cowplot.

Желаемый результат

Я хотел бы, чтобы ось y панели B была выровнена по вертикали с осью y последних двух графиков на панели C (т.е. на красной линии)

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


person user213544    schedule 23.02.2020    source источник
comment
Извините, фотографии здесь немного маленькие, поэтому я был сбит с толку раньше. Я не думаю, что панель А является проблемой, но, возможно, кто-то с большим опытом знает лучше. Я думаю, проблема в том, как работает facet_wrap в вашем примере. Таким образом, вы создаете участок определенного размера, один раз с 2 участками, другой раз с 5 участками. Для меня интервал/размер графиков на графиках, которые вы делаете, просто отличаются из-за этих facet_wraps. Это не должно быть чем-то неразрешимым.   -  person Annet    schedule 23.02.2020


Ответы (1)


Как я уже сказал в комментариях, я думаю, что это связано с расстоянием между вашими гранями в результате графиков 2 против 5 + разница в метках оси Y. Я могу ошибаться (что вполне вероятно), поэтому может быть более простое/красивое решение. Опять же, это предложение, вы можете немного поиграть с цифрами, но я думаю, что это было довольно близко:

# Create two facetted plots 
p1 <- ggplot(data = diamonds, aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 5) +
  geom_point(size=0.5)

p2<- ggplot(data = filter(diamonds, price < 900 & (cut == "Fair" | cut == "Good" )), aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 2) +
  geom_point(size=0.5) +
  theme(panel.spacing = unit(1.15, "lines"),
        axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 0)))

# Create panel A and panel B
a <- plot_grid(NULL, p2, labels = c("A", "B"), axis = 'lb', ncol = 2, rel_widths = c(2.985,2.015))

# Create a combined panel of 'a' and panel C
plot_grid(a, p1, labels = c("", "C"), axis = 'lb', ncol = 1, rel_heights = c(1,1))

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

Таким образом, в основном то, что я добавил, — это большее расстояние между вашими графиками p2, поскольку числа на нижних графиках занимают больше места, чем на верхних (в конце концов, есть 2 дополнительных числа). Для меня это зафиксировало выравнивание двух графиков с правой стороны. Я также увеличил поле метки по оси. Это зафиксировало выравнивание для левого верхнего графика. Я не уверен, желательно ли изменить расстояние между меткой и осью.

person Annet    schedule 23.02.2020
comment
Это очень хорошее решение! Я не думаю, что вы ошибаетесь, я думаю, что вы довольно хорошо определили проблему. - person tjebo; 23.02.2020