Принудительный график ggplot2 для квадратов

Я могу заставить график разгона ggplot2 иметь квадратную форму с одинаковым масштабированием по x и y с использованием xlim() и ylim(), но для этого требуется ручной расчет пределов. Есть ли более удобный способ сделать это?

К квадратной форме я имею в виду два требования:

  1. Такая же шкала по оси х и у.
  2. Одинарная длина оси x и y.

Ответ 1

Если вы хотите сделать шкалы расстояний одинаковыми, используйте cop_fixed():

p <- ggplot(...)
p <- p + coord_fixed() # ratio parameter defaults to 1 i.e. y / x = 1

Если вы хотите убедиться, что итоговый график будет квадратным, вам также нужно будет указать пределы x и y одинаковыми (или, по крайней мере, иметь одинаковый диапазон). xlim и ylim - оба аргумента для параметра coord_fixed. Таким образом, вы можете сделать это вручную, используя эти аргументы. Или вы можете использовать функцию для извлечения лимитов из данных.

Ответ 2

Примечание: для квадратной формы (независимо от данных, которые нанесены)

ggplot() + theme(aspect.ratio=1)

enter image description here

Ответ 3

Наверное, самый уродливый код, который вы увидите сегодня, но это трюк.

Диапазоны ваших осей x и y доступны из ggplot_build:

r<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$x.range))
s<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$y.range))
t<-round(max(r,s),1)
your_plot<-your_plot+coord_equal(xlim=c(-t,t),ylim=c(-t,t))

Ответ 4

Основываясь на ответе Рамонов, эта функция работает хорошо для меня, и я считаю ее не такой уродливой, поскольку можно скрыть определение функции...

squarePlot <- function(plt){
    return(plt+coord_equal()+
            expand_limits(x=ggplot_build(plt)$panel$ranges[[1]]$y.range,
                          y=ggplot_build(plt)$panel$ranges[[1]]$x.range))
}

просто упаковка кода Ramon в функции не сработала для меня, потому что переменная t определена в "неправильной" среде.