2016-08-17 2 views
3

Ich versuche, ein Boxplot von einigen numerischen Ergebnis nach Behandlungsbedingung und Besuchsnummer, mit der Anzahl der Beobachtungen in jeder Box unter der Handlung, und die Besuchszahlen genauso gut beschriftet. Hier sind einige gefälschte Daten, die zur Veranschaulichung dienen, und ich gebe zwei Beispiele von Dingen, die ich ausprobiert habe, die nicht ganz funktionierten.Annotieren x-Achse mit N in facettiertem Plot

library(ggplot2) 
library(plyr) 

trt  <- factor(rep(LETTERS[1:2],150),ordered=TRUE) 
vis  <- factor(c(rep(1,150),rep(2,100),rep(3,50)),ordered=TRUE) 
val  <- rnorm(300) 
data  <- data.frame(trt,vis,val) 
data.sum <- ddply(data, .(vis, trt), summarise, 
      N=length(na.omit(val))) 
mytheme <- theme_bw() + theme(panel.margin = unit(0, "lines"), strip.background = element_blank()) 

Der folgende Code erzeugt ein Diagramm, das N Beschriftungen hat, wo ich sie haben möchte. Dazu werden zusammenfassende Daten aus einem von mir erstellten Hilfsdatensatz erfasst. Ich konnte jedoch nicht herausfinden, wie man den Besuch auf der X-Achse (idealerweise unter den einzelnen Schachtelbeschriftungen) beschriftet oder Besuche auf andere Weise visuell abgrenzt (z. B. Linien, die sie in Paneele trennen).

plot1 <- ggplot(data) + 
      geom_boxplot(aes(x=vis:trt,y=val,group=vis:trt,colour=trt), show.legend=FALSE) + 
      scale_x_discrete(labels=paste(data.sum$trt,data.sum$N,sep="\n")) + 
      labs(x="Visit") + mytheme 

Die Handlung unten näher an, was ich will, als zuvor, dass es eine schöne Hierarchie von Behandlungen und Besucher hat, und ein ziemlich Format die Besuche abgrenzt. Für jedes Feld werden jedoch die Ns aus der ersten Zeile in den zusammenfassenden Daten, die der Behandlungsbedingung entsprechen, erfasst, da es nicht weiß, dass jede Facette die diesem Besuch entsprechende Zeile verwenden muss.

plot2 <- ggplot(data) +  geom_boxplot(aes(x=trt,y=val,group=trt,colour=trt), show.legend=FALSE) + 
      facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1) + 
      scale_x_discrete(labels=paste(data.sum$trt,data.sum$N,sep="\n")) + 
      labs(x="Visit") + mytheme 

Antwort

2

Eine Abhilfe ist Ihr Dataset so Ihre x-Variable ist die Interaktion zwischen trt und N zu manipulieren.

Ausgehend von dem, was Sie bereits haben, können Sie N zu dem ursprünglichen Dataset über eine merge hinzufügen.

test = merge(data, data.sum) 

Dann eine neue Variable machen, dass die Kombination von trt und N ist.

test = transform(test, trt2 = paste(trt, N, sep = "\n")) 

Jetzt die Handlung machen, die neuen trt2 Variable auf der x-Achse mit und scales = "free_x" in facet_wrap Verwendung für die verschiedenen Etiketten pro Facette zu ermöglichen.

ggplot(test) +  
    geom_boxplot(aes(x = trt2, y = val, group = trt, colour = trt), show.legend = FALSE) + 
    facet_wrap(~ vis, drop = FALSE, switch="x", nrow = 1, scales = "free_x") + 
    labs(x="Visit") + 
    mytheme 

enter image description here

+0

mir da die meisten der Weg Dieses erhielt. Leider scheint 'scales =" free_x "' mit 'drop = FALSE' zu kämpfen. In meinem größeren Kontext verwende ich grid.arrange, um ein Überplot zu erstellen, das auch ein zweites Diagramm für die Änderung von Visit 1 enthält, und ich möchte Plot 2 so arrangieren, dass Vis2-Vis1 visuell mit Vis2 in Plot ausgerichtet wird 1.Es funktioniert ohne meine Etiketten dank drop = FALSE, aber wenn ich skals = "free_x" hinzufügen, schlägt es mit der folgenden Fehlermeldung fehl: '" Fehler in if (zero_range (from) || zero_range (to)) {: fehlender Wert, wo TRUE/FALSE benötigt "' Ich habe noch nicht herausgefunden, ob es einen Workaround gibt. – ErinMcJ

+0

@ErinMcJ Haben Sie ein Beispiel? Sie könnten eine neue Frage mit einem Beispiel Ihrer realen Situation stellen. Es könnte sein, dass die Annotation mit der Stichprobengröße in der Handlung oder die Vermeidung von Facettierung und die Verwendung von GridExtra-ähnlichen Lösungen am Ende für Sie besser funktionieren wird. – aosmith

+0

Danke. Hier ist die komplexere Folgefrage. http://stackoverflow.com/questions/39027770/annotating-x-axis-with-n-in-faceted-plot-but-preserve-empty-facets – ErinMcJ

1

Da diese Funktionalität nicht in einer guten Work-around gebaut ist grid.extra:

library(gridExtra) 
p1 <- ggplot(data[data$vis==1,]) +  geom_boxplot(aes(x=trt,y=val,group=trt,colour=trt), show.legend=FALSE) + 
    #facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1) + 
    scale_x_discrete(labels=lb[1:2]) + #paste(data.sum$trt,data.sum$N,sep="\n") 
    labs(x="Visit") + mytheme 

p2 <- ggplot(data[data$vis==2,]) +  geom_boxplot(aes(x=trt,y=val,group=trt,colour=trt), show.legend=FALSE) + 
    #facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1) + 
    scale_x_discrete(labels=lb[3:4]) + #paste(data.sum$trt,data.sum$N,sep="\n") 
    labs(x="Visit") + mytheme 

p3 <- ggplot(data[data$vis==3,]) +  geom_boxplot(aes(x=trt,y=val,group=trt,colour=trt), show.legend=FALSE) + 
    #facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1) + 
    scale_x_discrete(labels=lb[5:6]) + #paste(data.sum$trt,data.sum$N,sep="\n") 
    labs(x="Visit") + mytheme 


grid.arrange(p1,p2,p3,nrow=1,ncol=3) # fully customizable 

enter image description here

Verwandte: Varying axis labels formatter per facet in ggplot/R

Sie können sie auch vertikal machen oder andere Transformationen tun:

enter image description here

Verwandte Themen