2015-12-30 9 views
5

Wenn ich ggplot2 verwende, um facettierte Diagramme zu erstellen, habe ich Probleme, einzelne Beschriftungen in jeder Facette zu erhalten, wenn ich auch einen Gruppierungsparameter festlege. Ohne Angabe von group = ... funktionieren die Dinge gut, aber ich versuche Diagramme von gepaarten Daten zu erstellen, die die Änderungen vor und nach der Behandlung betonen. Hiergeom_text mit facet_wrap in ggplot2 wenn Gruppe

ein Beispiel:

library(tidyr) 
library(ggplot2) 

set.seed(253) 
data <- data.frame(Subject = LETTERS[1:10], 
        Day1.CompoundA = rnorm(10, 4, 2), 
        Day2.CompoundA = rnorm(10, 7, 2), 
        Day1.CompoundB = rnorm(10, 5, 2), 
        Day2.CompoundB = rnorm(10, 5.5, 2)) 

# Compare concentration of compounds by day 
A <- t.test(data$Day1.CompoundA, data$Day2.CompoundA, paired = TRUE) 
B <- t.test(data$Day1.CompoundB, data$Day2.CompoundB, paired = TRUE) 

data.long <- gather(data, key = DayCompound, value = Concentration, -Subject) %>% 
     separate(DayCompound, c("Day", "Compound")) 

# text to annotate graphs 
graphLabels <- data.frame(Compound = c("CompoundA", "CompoundB"), 
          Pval = paste("p =", c(signif(A$p.value, 2), 
               signif(B$p.value, 2)))) 

Ok, jetzt, dass die Daten eingerichtet sind, kann ich eine boxplot machen ganz gut:

ggplot(data.long, aes(x = Day, y = Concentration)) + 
     geom_boxplot() + 
     facet_wrap(~ Compound) + 
     geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval)) 

boxplot example

Aber wenn ich will Um Liniendiagramme anzuzeigen, die die paarweise Natur der Daten hervorheben, indem jedes Motiv in einer anderen Farbe angezeigt wird, funktionieren die Facettenbeschriftungen nicht.

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
     geom_point() + geom_line() + 
     facet_wrap(~ Compound) + 
     geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval)) 

# Error in eval(expr, envir, enclos) : object 'Subject' not found 

Irgendwelche Vorschläge?

Antwort

8

Wenn Sie Ästhetik (d. H. aes(...,color = Subject)) im Top-Level-Aufruf ggplot() zuordnen, werden diese Zuordnungen an jede Ebene weitergegeben, was bedeutet, dass jede Ebene erwartet, dass Daten Variablen mit diesen Namen enthalten.

Sie müssen entweder die Daten und Mapping separat in jeder Schicht bestimmen, oder unmap sie ausdrücklich:

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
    geom_point() + geom_line() + 
    facet_wrap(~ Compound) + 
    geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval,color = NULL,group= NULL)) 

Es gibt auch ein inherit.aes Argument, das Sie FALSE in jeder Schicht festlegen können Sie nicht wollen, diese anderen Abbildungen, z

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
    geom_point() + geom_line() + 
    facet_wrap(~ Compound) + 
    geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval),inherit.aes = FALSE) 
+0

Vielen Dank! Das hat wunderbar funktioniert! – LauraS

Verwandte Themen