Як виправити співвідношення сторін у 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 ", але не хвилює фактичний розмір діаграми.

Як я можу зіпсувати свої схеми?

Відповіді:


113

У 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()

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


3
Чи знаєте ви, чому ggplot наполягає на розміщенні мітки осі y ліворуч? Я хотів би знати, як запобігти цьому ...
Чейз

@chase Ключовим способом вирішення проблеми є зміна hjustположення заголовка - спробуйте opts(axis.title.y=theme_text(hjust=10)). Але, на жаль, здається, ні. Див groups.google.com/group/ggplot2/browse_thread/thread / ... для ggplot розсилки списку обговорення і @ відповідь Батист в.
Андрі

3
Ця поведінка виправлена ​​у версії для розробки.
Hadley

5
У більш загальному заголовку питання, чи можете ви, можливо, також додати інформацію про те, як розрахувати коефіцієнт (аргумент для координованого_фіксованого), якщо не використовується однакові обмеження на обох осях?
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()

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

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

Функціяordord_fixed () також має аргумент для регулювання співвідношення осей:

ratio співвідношення сторін, виражене як у / х

Щоб сюжет можна було зробити квадратним за допомогою:

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)

В результаті:


14
як це краще ніж plot + theme(aspect.ratio=4/3)? Ggplot може мати декілька шарів з безліччю наборів даних, а осі можуть мати довільні коефіцієнти розширення, тому обчислення співвідношення у / х з одного джерела даних здається досить крихким.
баптист

2
Тому що це, мабуть, не легко виявити. Що підтверджується тим, що тут є три відповіді, але жодна про них не згадує. Ви повинні дати це у відповідь, це, безумовно, краще рішення.
Грайфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.