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

Как я могу unsquash мои схемы?

3 60

3 ответа:

на 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

для обеспечения определенного соотношения сторон, например, для квадрата, используйте theme(aspect.ratio=1).

ответ Андри не дает полной картины, так как пример предоставляет, возможно, неестественные данные, где диапазон x равен диапазону 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

но вам нужно настроить это с ограничениями переменных или области участка (не все ограничения хорошо делятся на целые числа, как в этих примерах).

для полноты картины: Если вы хотите учитывать очень разные пределы оси:

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)

в результате: