Jak naprawić współczynnik proporcji w ggplot?

88

Próbuję zmienić rozmiar wykresu, aby pasował do mojego dokumentu, ale mam trudności z uzyskaniem kształtu wykresu jako kwadratu.

Przykład:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

Chociaż granice x i y są takie same, wynik nie jest kwadratowy. Wydaje mi się, że R sprawia, że ​​otaczający panel jest 5x5 ", ale nie dba o rzeczywisty rozmiar schematu.

Jak mogę rozłożyć moje diagramy?

htorque
źródło

Odpowiedzi:

113

W ggplotmechanizmie zachowania proporcji twojego działki jest dodanie coord_fixed()warstwy do działki. Pozwoli to zachować proporcje samego wykresu, niezależnie od kształtu rzeczywistej ramki ograniczającej.

(Sugeruję również, abyś ggsavezapisał wynikowy wykres w formacie pdf / png / etc zamiast pdf(); print(p); dev.off()sekwencji).

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

wprowadź opis obrazu tutaj

Andrie
źródło
3
Czy wiesz, dlaczego ggplot nalega na umieszczenie etykiety osi y daleko w lewo? Chciałbym wiedzieć, jak temu zapobiec ...
Chase
@chase Nieprzyjemnym obejściem jest zmiana hjustpozycji tytułu - spróbuj opts(axis.title.y=theme_text(hjust=10)). Ale niestety wydaje się, że nie. Zobacz groups.google.com/group/ggplot2/browse_thread/thread/…, aby zapoznać się z dyskusją na liście mailingowej ggplot i odpowiedzią @ Baptiste.
Andrie
3
To zachowanie zostało naprawione w wersji rozwojowej.
Hadley
5
Mając bardziej ogólny tytuł pytania, czy mógłbyś również dodać informacje o tym, jak obliczyć współczynnik (argument dla stałej_spozycji), skoro nie używa się tych samych limitów na obu osiach?
htorque
1
W związku z komentarzem @ htorque; jeśli zamiast tego zdefiniowano y jako, y=runif(100, 0, 50)wówczas aspekt wykresu nie jest już kwadratowy. coord_fixed()powoduje, że skala każdej osi jest równa, tylko się wydaje?
inny ben
79

Aby zapewnić określone proporcje, np. Kwadrat, użyj theme(aspect.ratio=1).

Odpowiedź Andrie'ego nie daje pełnego obrazu, ponieważ przykład dostarcza być może nienaturalnych danych, w których zakres x jest równy zakresowi y. Gdyby jednak dane był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()

wtedy fabuła wyglądałaby tak:

wprowadź opis obrazu tutaj

Funkcja koordynacyjna () również ma argument do dostosowania stosunku osi:

ratio współczynnik proporcji wyrażony jako r / x

Aby działka mogła być kwadratowa z:

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

wprowadź opis obrazu tutaj

Ale musisz to dostosować do granic zmiennych lub obszaru wykresu (nie wszystkie granice można dobrze podzielić przez liczby całkowite, jak w tych przykładach).

inny ben
źródło
12

Ze względu na kompletność: jeśli chcesz wziąć pod uwagę bardzo różne granice osi:

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)

Wynik:

Graipher
źródło
14
jak to jest lepsze niż plot + theme(aspect.ratio=4/3)? Ggplot może mieć wiele warstw z wieloma zestawami danych, a osie mogą mieć dowolne współczynniki rozszerzania, więc obliczenie stosunku y / x z jednego źródła danych wydaje się dość delikatne.
baptiste
2
Ponieważ najwyraźniej nie jest to łatwe do wykrycia. Świadczy o tym fakt, że są tutaj trzy odpowiedzi, ale żadna o tym nie wspomina. Powinieneś umieścić to w odpowiedzi, to zdecydowanie lepsze rozwiązanie.
Graipher