Как исправить соотношение сторон в ggplot?

88

Я пытаюсь изменить размер графика, чтобы он соответствовал моему документу, но у меня возникают трудности с получением построенной диаграммы в виде квадрата.

Пример:

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

Как я могу разжать свои диаграммы?

htorque
источник

Ответы:

113

В ggplotмеханизме сохранения соотношения сторон вашего сюжета является добавление coord_fixed()слоя к сюжету. Это сохранит соотношение сторон самого графика, независимо от формы фактического ограничивающего прямоугольника.

(Я также предлагаю вам ggsaveсохранить полученный график в pdf / png / и т.д., а не в 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()

введите описание изображения здесь

Андри
источник
3
Вы знаете, почему ggplot настаивает на переносе метки оси Y влево? Я хотел бы знать, как это предотвратить ...
Чейз
@chase Неуклюжий обходной путь - изменить hjustположение заголовка - попробуйте opts(axis.title.y=theme_text(hjust=10)). Но, к сожалению, похоже, что нет. См. Groups.google.com/group/ggplot2/browse_thread/thread/… для обсуждения списка рассылки ggplot и ответа @Baptiste.
Андри
3
Это поведение исправлено в разрабатываемой версии.
Hadley
5
С более общим названием вопроса, не могли бы вы также добавить информацию о том, как рассчитать соотношение (аргумент для corre_fixed), если не используются одни и те же ограничения на обеих осях?
htorque
1
В продолжение комментария @ htorque; если вместо этого y определяется как, y=runif(100, 0, 50)то аспект графика больше не квадратный. coord_fixed()заставляет масштаб каждой оси быть равным только кажется?
другой Бен
79

Чтобы обеспечить конкретное соотношение сторон, например, для квадрата, используйте 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()

тогда сюжет будет выглядеть так:

введите описание изображения здесь

Функция Coord_fixed () также имеет аргумент для регулировки соотношения осей:

ratio соотношение сторон, выраженное как y / x

Чтобы участок можно было сделать квадратным с помощью:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

введите описание изображения здесь

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

другой Бен
источник
12

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

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)

В результате чего:

Graipher
источник
14
как это лучше чем plot + theme(aspect.ratio=4/3)? Ggplot может иметь несколько уровней с несколькими наборами данных, а оси могут иметь произвольные коэффициенты расширения, поэтому вычисление отношения y / x из одного источника данных кажется довольно хрупким.
baptiste
2
Потому что это, очевидно, нелегко обнаружить. Это подтверждается тем фактом, что здесь есть три ответа, но ни один не упоминает об этом. Вы должны указать это в ответе, это определенно лучшее решение.
Graipher