Как исправить соотношение сторон в ggplot?
Я пытаюсь изменить размер сюжета, чтобы вписаться в мой документ, но у меня возникают трудности с тем, чтобы построенная диаграмма была квадратной.
Пример:
pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()
Хотя пределы для x и y одинаковы, график в результате не является квадратным. Я предполагаю, что R делает закрывающую панель 5x5 ", но не заботится о фактическом размере диаграммы.
Как я могу отменить мои диаграммы?
Ответы
Ответ 1
В ggplot
механизм сохранения соотношения сторон вашего сюжета заключается в добавлении слоя coord_fixed()
к сюжету. Это сохранит соотношение сторон самого сюжета, независимо от формы фактического ограничивающего прямоугольника.
(Я также предлагаю вам использовать ggsave
, чтобы сохранить полученный результат в pdf/png/etc, а не в последовательности pdf(); print(p); dev.off()
.)
library(ggplot2)
df <- data.frame(
x = runif(100, 0, 5),
y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()
![enter image description here]()
Ответ 2
Чтобы обеспечить конкретное соотношение сторон, например. для квадрата используйте theme(aspect.ratio=1)
.
Ответ Андри не дает полной картины, так как пример дает, возможно, неестественные данные, где диапазон х равен диапазону y. Если, однако, данные были:
df <- data.frame(
x = runif(100, 0, 50),
y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()
тогда график будет выглядеть следующим образом:
![enter image description here]()
Функция Coord_fixed() также имеет аргумент для регулировки отношения осей:
ratio
, выраженное как y/x
Чтобы график мог быть сделан квадратным с:
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)
![enter image description here]()
Но вам нужно настроить это с ограничениями переменных или области графика (не все лимиты хорошо делятся на целые числа, подобные этим примерам).
Ответ 3
За полноту:
Если вы хотите учитывать очень разные предельные значения оси:
df <- data.frame(
x = runif(100, 0, 5000),
y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)
Результат:
![]()