Подтвердить что ты не робот

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

Как я могу отменить мои диаграммы?

4b9b3361

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

Результат: