2015-09-12 4 views
7

Ich mache momentan eine Analyse in ggplot2 für ein Projekt und zufällig stolperte ich über etwas (für mich) komisch Verhalten, das ich nicht erklären kann. Wenn ich schreibe die Handlung sieht anders aus, was es tut, wenn ich die gleiche Variable mit aes(x = mtcars$cyl, ...) übergeben. Wenn ich facet_grid(am ~ .) entferne, sind beide Graphen wieder gleich. Der folgende Code wird in meinem Projekt nach dem Code modelliert, das das gleiche Verhalten erzeugt:Problem beim Übergeben von Variablen mit Dollarzeichennotation an aes() in Kombination mit facet_grid() oder facet_wrap()

library(dplyr) 
library(ggplot2) 

data = mtcars 

test.data = data %>% 
    select(-hp) 


ggplot(test.data, aes(x = test.data$cyl, y = mpg)) + 
    geom_point() + 
    facet_grid(am ~ .) + 
    labs(title="graph 1 - dollar sign notation") 

ggplot(test.data, aes(x = cyl, y = mpg)) + 
    geom_point()+ 
    facet_grid(am ~ .) + 
    labs(title="graph 2 - no dollar sign notation") 

Hier ist das Bild von Diagramm 1: graph 1 - dollar sign notation

Hier wird das Bild von Diagramm 2: graph 2 - no dollar sign notation

Ich habe festgestellt, dass ich dieses Problem mit aes_string anstelle von aes umgehen und die Variablennamen als Zeichenfolgen übergeben kann, aber ich würde gerne verstehen, warum ggplot verhält sich so. 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 nicht verstehe, dass richtig ...

+9

die kurze Antwort ist: * nie * '' $ verwenden in 'aes()' – baptiste

+0

^_^nach dem Schock, den ich heute habe, als mein Diagramm plötzlich alle seltsam aussah, werde ich es nicht wieder tun. Dennoch würde ich gerne verstehen, was passiert, denn ich habe dieses Problem noch nie zuvor erlebt. – Christoph

+1

Wenn ggplot das Diagramm erstellt, teilt es die Datensätze für jede Ebene in Gruppen auf, die durch die Ästhetik und die Facettierung definiert sind.Damit diese Gruppierung zuverlässig ist, müssen die Variablen aus einem einzigen data.frame stammen, andernfalls kann ggplot möglicherweise eine andere Reihenfolge für den Facettierungsfaktor und den Rest des Mappings verwenden. – baptiste

Antwort

23

tl; dr

Nie Verwendung [ oder $ innen aes().


dieses anschauliche Beispiel betrachtet, bei dem die Facettierung Variable f-x absichtlich in einer nicht-offensichtlichen Ordnung in Bezug ist

d <- data.frame(x=1:10, f=rev(letters[gl(2,5)])) 

Jetzt Kontrast, was mit diesen beiden Plots geschieht,

p1 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(x, y=0, label=x, colour=f)) + 
    ggtitle("good mapping") 

p2 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(d$x, y=0, label=x, colour=f)) + 
    ggtitle("$ corruption") 

enter image description here

Wir können eine bessere Vorstellung von dem, was am data.frame indem Sie geschieht für jedes Panel intern von ggplot2 erstellt,

ggplot_build(p1)[["data"]][[1]][,c("x","PANEL")] 

    x PANEL 
1 6  1 
2 7  1 
3 8  1 
4 9  1 
5 10  1 
6 1  2 
7 2  2 
8 3  2 
9 4  2 
10 5  2 

ggplot_build(p2)[["data"]][[1]][,c("x", "PANEL")] 

    x PANEL 
1 1  1 
2 2  1 
3 3  1 
4 4  1 
5 5  1 
6 6  2 
7 7  2 
8 8  2 
9 9  2 
10 10  2 

Die zweite Handlung die falsche Zuordnung hat, denn wenn ggplot eine data.frame für jeden schafft Panel, es wählt x Werte in der "falschen" Reihenfolge.

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.

+0

Vielen Dank für Ihre Hilfe! Ihr Beispiel ist großartig! – Christoph

Verwandte Themen