Выровняйте графики разной ширины по значениям шкалы оси X

Как выровнять два участка разной ширины так, чтобы:

  • их оси x синхронизированы
  • верхний ряд также содержит общую легенду

Я в основном хочу, чтобы каждый интервал по оси x соответствовал одинаковому количеству сантиметров на двух графиках. Я пробовал это:

library(cowplot)
library(tidyverse)    
wide_plot =  iris %>% 
    ggplot(aes(x = Sepal.Length, Sepal.Width, color = Species)) + 
      geom_point() + 
      theme(legend.position = "none") + 
      scale_x_continuous(limits = c(0,8))
    narrow_plot =  iris %>% 
    ggplot(aes(x = Sepal.Width, Sepal.Length, color = Species)) + 
      geom_point()  + 
      theme(legend.position = "none") + 
      scale_x_continuous(limits = c(0,5) )

    legend = cowplot::get_legend(ggplot(iris,aes(x = Sepal.Length, Sepal.Width, color = Species)) +  geom_point() )

    plot_grid(plot_grid(narrow_plot, legend), wide_plot, nrow = 2 ) 

Что производит этот сюжет:

Но проблема с вышеизложенным состоит в том, что значения оси x на верхнем нижнем графике не "синхронизированы".

Я попытался повозиться с параметром rel_widths в cowplot::plot_grid, но надеюсь на более точное решение.

2 ответа

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

library(cowplot)
library(tidyverse)    
wide_plot =  iris %>% 
  ggplot(aes(x = Sepal.Length, Sepal.Width, color = Species)) + 
  geom_point() + 
  theme(legend.position = "none") + 
  scale_x_continuous(limits = c(0,8), labels = scales::number_format(accuracy = 0.1))+
  scale_y_continuous( labels = scales::number_format(accuracy = 0.1)) 
narrow_plot =  iris %>% 
  ggplot(aes(x = Sepal.Width, Sepal.Length, color = Species)) + 
  geom_point()  + 
  theme(legend.position = c(0.9,0.7), legend.background = element_rect(size = 30)) + 
  scale_x_continuous(limits = c(0,8), labels = scales::number_format(accuracy = 0.1))+
  scale_y_continuous( labels = scales::number_format(accuracy = 0.1)) 

legend = cowplot::get_legend(ggplot(iris,aes(x = Sepal.Length, Sepal.Width, color = Species)) +  geom_point())

plot_grid(narrow_plot, wide_plot, nrow = 2) 

Вы можете настроить поля и масштаб оси, чтобы графики совпадали:

wide_plot =  iris %>% 
    ggplot(aes(x = Sepal.Length, Sepal.Width, color = Species)) + 
      geom_point() + 
      theme(legend.position = "none", 
            plot.margin = unit(c(5.5, 140, 5.5, 0), "pt")) +
      scale_y_continuous(limits = c(1, 5)) +
      scale_x_continuous(limits = c(0, 8))

https:https://stackru.com/images/45f24ebe404ee34e71297cd92b85895caf4320ef.png

Другие вопросы по тегам