2012-05-04 9 views
7

Ich arbeite daran, einen Boxplot in R-Crane zu erstellen, der auf der X-Achse durch zwei verschiedene Faktoren kategorisiert wird. Mein Problem liegt darin, Beschriftungen für einen Faktor mit +20 Stufen zu erstellen, die den gesamten Graphen angemessen überspannen, während eine Legende verwendet wird, um den zweiten Faktor zu beschriften, der nur 2 bis 3 Stufen hat.R - Boxplot mit mehreren Faktoretiketten

Hier ist ein Testskript, dass meine tatsächliche Datenmenge grob ahmt:

d<-data.frame(x=rnorm(1500),f1=rep(seq(1:20),75),f2=rep(letters[1:3],500)) 
# first factor has 20+ levels 
d$f1<-factor(d$f1) 
# second factor a,b,c 
d$f2<-factor(d$f2) 

boxplot(x~f2*f1,data=d,col=c("red","blue","green"),frame.plot=TRUE,axes=FALSE) 

# y axis is numeric and works fine 
yts=pretty(d$x,n=5) 
axis(2,yts) 

# I know this doesn't work; what I'd like is to spread the factors out 
# so the each group of three(a,b,c) is labeled correctly 
axis(1,at=seq(1:20)) 

# Use the legend to handle the f2 factor labels 
legend(1, max(d$x), c("a", "b","c"),fill = c("red", "blue","green")) 

Vielen Dank für jede Hilfe

Antwort

13

FWIW, eine ggplot2 Lösung:

library(ggplot2) 
ggplot(data = d, aes(x = f1, y = x)) + 
    geom_boxplot(aes(fill = f2), width = 0.8) + theme_bw() 

enter image description here

+0

Ich habe nie realisiert, dass du Theme 'ggplot' plots! Ich habe sie wegen des hässlichen grauen Hintergrunds immer ausgeschaltet. Danke, dass du mir das gezeigt hast. – thelatemail

+0

@thelatemail, themen können fast jedes Element im Plot angepasst/modifiziert werden. –

+0

@thelatemail - siehe [hier] (https://github.com/hadley/ggplot2/wiki/Themes) für einen Überblick über die Themen. – Chase

5

Wenn Sie ein Label in der Mitte jeder Gruppe von 3 Boxen wollen, versuchen Sie so etwas wie dieses :

axis(1,at=seq(2,60,3),labels=1:20,cex.axis=0.7) 

enter image description here

zu verallgemeinern, dies wäre:

groups <- 20 
numbox <- 3 
total <- groups * numbox 
xpoints <- seq(median(1:numbox),total,numbox) 
+0

Dank an euch beide, genau das, was ich suchte. – Kerry

+0

@Kerry - Keine Sorge! In diesem Fall, vergiss nicht, uns beide einen Upvote zu geben (Pfeil nach oben) und wähle eine Antwort aus (das Tick-Symbol unter den Pfeilen) – thelatemail