Принудительный график ggplot2 для квадратов
Я могу заставить график разгона ggplot2 иметь квадратную форму с одинаковым масштабированием по x и y с использованием xlim()
и ylim()
, но для этого требуется ручной расчет пределов. Есть ли более удобный способ сделать это?
К квадратной форме я имею в виду два требования:
- Такая же шкала по оси х и у.
- Одинарная длина оси 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 определена в "неправильной" среде.