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


person Rasmus Larsen    schedule 12.05.2020    source источник


Ответы (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) 

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

person otwtm    schedule 12.05.2020

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

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

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

person Allan Cameron    schedule 12.05.2020
comment
ознакомьтесь с ответом Z.Lins stackoverflow.com/questions/57392541/ - person tjebo; 12.05.2020
comment
Спасибо @Tjebo. Я рассматривал подобный подход и здесь, но жизнь слишком коротка ... - person Allan Cameron; 12.05.2020