Wie kann man das Seitenverhältnis in ggplot festlegen?

86

Ich versuche, die Größe eines Diagramms so zu ändern, dass es in mein Dokument passt, aber ich habe Schwierigkeiten, das geplottete Diagramm als Quadrat darzustellen.

Beispiel:

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

Obwohl die Grenzen für x und y gleich sind, ist die Darstellung im Ergebnis nicht quadratisch. Ich denke, dass R das beiliegende Panel 5x5 "macht, sich aber nicht um die tatsächliche Diagrammgröße kümmert.

Wie kann ich meine Diagramme entfernen ?

htorque
quelle

Antworten:

110

Um ggplotdas Seitenverhältnis Ihres Diagramms coord_fixed()beizubehalten, müssen Sie dem Diagramm eine Ebene hinzufügen . Dadurch bleibt das Seitenverhältnis des Diagramms selbst erhalten, unabhängig von der Form des tatsächlichen Begrenzungsrahmens.

(Ich schlage auch vor, dass Sie ggsaveIhre resultierende Darstellung in pdf / png / etc und nicht in der pdf(); print(p); dev.off()Reihenfolge speichern .)

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

Geben Sie hier die Bildbeschreibung ein

Andrie
quelle
3
Wissen Sie, warum ggplot darauf besteht, die Beschriftung der y-Achse ganz nach links zu setzen? Ich würde gerne wissen, wie ich das verhindern kann ...
Chase
@chase Eine klobige Problemumgehung besteht darin, die hjustPosition des Titels zu ändern - versuchen Sie es opts(axis.title.y=theme_text(hjust=10)). Aber leider scheint es nicht. Unter groups.google.com/group/ggplot2/browse_thread/thread/… finden Sie eine Diskussion über die ggplot-Mailingliste und die Antwort von @ Baptiste.
Andrie
3
Dieses Verhalten ist in der Entwicklungsversion behoben.
Hadley
5
Könnten Sie mit dem allgemeineren Titel der Frage vielleicht auch Informationen zur Berechnung des Verhältnisses (das Argument für coord_fixed) hinzufügen, wenn nicht auf beiden Achsen die gleichen Grenzwerte verwendet werden?
Htorque
1
Weiter zu @ htorques Kommentar; Wenn y stattdessen als definiert ist, y=runif(100, 0, 50)ist der Aspekt des Diagramms nicht mehr quadratisch. coord_fixed()bewirkt, dass der Maßstab jeder Achse gleich ist, nur wie es scheint?
Ein anderer Ben
76

Verwenden Sie, um ein bestimmtes Seitenverhältnis sicherzustellen, z. B. für ein Quadrat theme(aspect.ratio=1).

Andries Antwort gibt nicht das vollständige Bild wieder, da das Beispiel möglicherweise unnatürliche Daten liefert, bei denen der Bereich von x dem Bereich von y entspricht. Wenn jedoch die Daten wären:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

dann würde die Handlung so aussehen:

Geben Sie hier die Bildbeschreibung ein

Die Funktion coord_fixed () hat auch ein Argument zum Anpassen des Achsenverhältnisses:

ratio Seitenverhältnis, ausgedrückt als y / x

Damit die Handlung quadratisch gemacht werden kann mit:

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

Geben Sie hier die Bildbeschreibung ein

Sie müssen dies jedoch an die Grenzen der Variablen oder des Plotbereichs anpassen (nicht alle Grenzen sind wie in diesen Beispielen durch ganze Zahlen teilbar).

ein anderer ben
quelle
11

Der Vollständigkeit halber: Wenn Sie sehr unterschiedliche Achsengrenzen berücksichtigen möchten:

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)

Ergebend:

Graipher
quelle
14
wie ist das besser als plot + theme(aspect.ratio=4/3)? Das ggplot kann mehrere Schichten mit mehreren Datensätzen haben, und die Achsen können beliebige Expansionsfaktoren haben, so dass die Berechnung des Verhältnisses von y / x aus einer Datenquelle ziemlich fragil erscheint.
Taufe
2
Weil dies anscheinend nicht leicht zu entdecken ist. Was durch die Tatsache bewiesen wird, dass es hier drei Antworten gibt, aber keine erwähnt. Sie sollten es in eine Antwort setzen, es ist definitiv die bessere Lösung.
Graipherie