Problem beim Übergeben von Variablen mit Dollarzeichennotation an aes () in Kombination mit facet_grid () oder facet_wrap ()

8

Ich mache gerade eine Analyse in ggplot2 für ein Projekt und bin zufällig auf ein (für mich) merkwürdiges Verhalten gestoßen, das ich nicht erklären kann. Wenn ich aes(x = cyl, ...) schreibe, sieht das Diagramm anders aus, als wenn ich dieselbe Variable mit aes(x = mtcars$cyl, ...) übergebe. Wenn ich facet_grid(am ~ .) entferne, sind beide Graphen wieder gleich. Der folgende Code ist nach dem Code in meinem Projekt modelliert, das das gleiche Verhalten generiert:

%Vor%

Hier ist das Bild von Grafik 1:

Hier ist das Bild von Grafik 2:

Ich habe festgestellt, dass ich dieses Problem mit aes_string anstelle von aes umgehen und die Variablennamen als Strings übergeben kann, aber ich würde gerne verstehen, warum ggplot sich so verhält. Das Problem tritt auch bei ähnlichen Versuchen mit facet_wrap auf.

Vielen Dank für jede Hilfe im Voraus! Ich fühle mich sehr unwohl, wenn ich das nicht richtig verstehe ...

    
Christoph 12.09.2015, 20:21
quelle

1 Antwort

23

tl; dr

Nie [ oder $ in aes() verwenden.

Betrachten Sie dieses Beispiel, in dem die Facettierungsvariable f absichtlich in einer nicht offensichtlichen Reihenfolge in Bezug auf x

steht %Vor%

Vergleichen Sie nun, was mit diesen beiden Plots passiert,

%Vor%

Wir können eine bessere Vorstellung davon bekommen, was passiert, wenn wir uns das data.frame anschauen, das intern von ggplot2 für jedes Panel erstellt wurde,

%Vor%

Das zweite Diagramm weist eine falsche Zuordnung auf, da, wenn ggplot ein data.frame für jedes Feld erstellt, X-Werte in der "falschen" Reihenfolge ausgewählt werden.

Dies tritt auf, weil die Verwendung von $ die Verbindung zwischen den verschiedenen zu mappenden Variablen unterbricht (ggplot muss davon ausgehen, dass es sich um eine unabhängige Variable handelt, die aus einer beliebigen, nicht verbundenen Quelle stammen könnte). Da der data.frame in diesem Beispiel nicht nach dem Faktor f geordnet ist, wird die für jedes Panel intern verwendete data.frames in der falschen Reihenfolge verwendet.

    
baptiste 12.09.2015, 21:09
quelle

Tags und Links