Boxplots mit bxp()

Am Beispiel der folgenden Daten werden die Boxplots mit der Funktion bxp() [1] auf dieser Seite erzeugt. bxp() erwartet als Eingabe das Resultat des Befehls boxplot(). Beide Befehle gehören zum Paket graphics.

require(MASS)
uscrime<-UScrime
data.box<-boxplot( uscrime$Po1, uscrime$Po2, uscrime$Pop, plot=FALSE)

Aussehen der Boxplots

Aussehen der Boxen
Man kann die Linienfarbe, den Linientyp und die Linienstärke der Whiskers (s.Abb.: blau), der Enden der Whiskers (s.Abb.: rot) und der Boxen verändern (s.Abb.: hellblau). Bei den Ausreißern kann man das Symbol, die Symbolfarbe und die Linienstärke und den Typen einer Linie die parallel zu den Enden der Wiskers ist, (s.Abb.: grün). Die Linienstärke, -farbe und den Symboltypen kann man für die Medianlinie wählen (s.Abb.: lila, dunkelrot).

Aussehen der Achsen und Beschriftungen
Man kann die Größe und die Schriftfarbe der Überschrift (s.Abb.: rot), der Bildunterschrift (s.Abb.: blau), der Achsenbeschriftungen (s.Abb.: grün) und der Werte auf den Achsen (s.Abb.: lila) festlegen.
Mit dem Befehl axis() kann man den Linientyp, die Linienstärke und -farbe der Achsen verändern (s.Abb.: rot).

Abb.: Aussehen der Boxen eines Boxplots mit bxp()

R-Code der obigen Abbildung:
bxp(data.box, main="Boxplot", sub="Boxplot", xlab="x-Achse", ylab="y-Achse", xaxt="n",
col.main="red", cex.main=0.9,
col.sub="blue", cex.sub=1,
col.lab="darkgreen", cex.lab=0.9,
col.axis="plum4", cex.axis=2,
pars=list(whisklty=4, whisklwd=2, whiskcol="blue",
staplelty=2, staplelwd=2, staplecol="red",
outlty=0, outlwd=2, outcol="darkgreen", outcex=2, outpch=25, outbg="green",
medlty=1, medlwd=3, medcol="plum4", medcex=2, medpch=21, medbg="darkred",
boxlty=5, boxlwd=2, boxcol="steelblue", boxfill="lightblue"))
axis(side=1, lty=2, lwd=3, col="darkred", col.axis="violetred", font=3, lwd.tick=5, col.ticks="red")

Aussehen der Boxen

Hier einzelne Beispiele zum Ausprobieren.

Whiskers
bxp(data.box, pars=list(whisklty=4, whisklwd=2, whiskcol="blue"))

Der Linientyp ist hier 4 (= "dotdash"), die Linienstärke ist 2 und eingefärbt ist es in "blue" (blau).

Enden der Whiskers
bxp(data.box, pars=list(staplelty=2, staplelwd=2, staplecol="red"))

Der Linientyp ist hier 2 (= "dashed"), die Linienstärke ist 2 und die Farbe ist "red" (rot).

Ausreißer
bxp(data.box, pars=list(outlty=0, outlwd=2, outcol="darkgreen", outcex=2, outpch=25, outbg="green"))

Der Linientyp ist hier 0 (= "blank"), die Linienstärke ist 2, die Farbe ist "darkgreen" (dunkelgrün), die Größe der Punkte ist 2, es wird das Symbol 25 verwendet und die Hintergrundfarbe ist "green" (grün). Die Symbole 21 bis 25 können zweifarbig dargestellt werden, bei anderen Symbolen hat die Hintergrundfarbe keine Auswirkungen.

Medianlinie
bxp(data.box, pars=list(medlty=1, medlwd=3, medcol="plum4", medcex=2, medpch=21, medbg="darkred"))

Der Linientyp ist hier 1 (= "solid"), die Linienstärke ist 3, die Linienfarbe ist "plum4" (lila). Die Symblgröße ist 2, es wird das Symbol 21 verwendet und die Hintergrundfarbe ist "darkred" (dunkelrot).

Boxen
bxp(data.box, pars=list(boxlty=5, boxlwd=2, boxcol="steelblue", boxfill="lightblue"))

Der Linientyp ist hier 5 (= "longdash"), die Linienstärke ist 2 und die Farbe ist "steelblue" (hellblau). Für schraffierte Boxen siehe Boxplot mit Schraffur.

Achsen und Beschriftungen

Hier einzelne Beispiele zum Ausprobieren.

Überschrift
bxp(data.box, main="Boxplot", col.main="red", cex.main=0.9)

Unterschrift
bxp(data.box, sub="Boxplot", col.sub="blue", cex.sub=1)

Achsenbeschriftung
bxp(data.box, xlab="x-Achse", ylab="y-Achse", font.axis=3, col.lab="darkgreen", cex.lab=0.9)

Mit dem Attribut font.axis=3 kann man die Schrift auf italic setzen [2].

Werte der Achsen
bxp(data.box, xaxt="n", col.axis="plum4", cex.axis=2)
axis(side=1, lty=2, lwd=3, col="darkred", col.axis="violetred", font=3, lwd.tick=5, col.ticks="red")

Man kann den Werten der Achsen eine beliebige Farbe geben und ihre Größe bestimmen. Durch xaxt="n" wird keine x-Achse gezeichnet. Die x-Achse wird mit dem Befehl axis() erzeugt [3].

Breiten der Boxplots

Breite der Box
bxp(data.box, pars=list(boxwex=c(0.8,0.3,1.3)))

Der default-Wert ist boxwex=0.8.

Breite der Enden der Whiskers
bxp(data.box, pars=list(staplewex=c(0.5,0.2,1)))

Der default-Wert ist boxwex=0.5.

Breite der Ausreißerlinien
o<-par(mfrow=c(1,3))
bxp(data.box, pars=list(outwex=0.5, outlty=1))
bxp(data.box, pars=list(outwex=0.2, outlty=1))
bxp(data.box, pars=list(outwex=1, outlty=1))
par(o)

Der default-Wert ist boxwex=0.5. Standardmäßig wird keine Linie gezeichnet.

Weiteres

Abb.: Aussehen der Boxen eines Boxplots mit bxp()

R-Code der obigen Abbildung:
m<-c(mean(uscrime$Po1), mean(uscrime$Po2), 0, mean(uscrime$Pop))
bxp(data.box,ylim=c(0,200), at=c(1,2,4), xlim=c(0,5), pars=list(boxwex=0.5))
for(i in c(1,2,4)) lines(c(i-0.5/2,i+0.5/2), c(m[i],m[i]), lwd=2, col="red")
for(i in 1:3) text(ifelse(i==3,i+0.2+1,i+0.2), data.box$stats[,i], data.box$stats[,i], cex=0.8, col="red", pos=4)
for(i in c(1,2,4)) text(ifelse(i==3,i+0.2+1,i+0.2), m[i], m[i], cex=0.8, col="red", pos=4)

Wertebereich der Achsen

o<-par(mfrow=c(1,2))
bxp(data.box, ylim=c(0,200), xlim=c(0,4))
bxp(data.box, ylim=c(0,150), xlim=c(1,3))
par(o)

Abstände zwischen den Boxplots

bxp(data.box, at=c(1,2,4), xlim=c(0,5))

Zusätzliche Mittelwertlinie

m<-c(mean(uscrime$Po1), mean(uscrime$Po2), mean(uscrime$Pop))
boxwex<-0.8
bxp(data.box)
for(i in 1:3) lines(c(i-boxwex/2,i+boxwex/2), c(m[i],m[i]), lwd=2, col="red")

Werte neben dem Boxplot

bxp(data.box, pars=list(boxwex=0.5))
for(i in 1:3) text(i+0.2, data.box$stats[,i], data.box$stats[,i], cex=0.8, col="red", pos=4)

Boxplot mit Schraffur

Mit der folgenden Funktion boxplot.hatching() kann man schraffierte Boxplots erzeugen (frei nach [5]). Sehr nützlich für Grafiken in schwarzweiß.

R-Code der folgenden Abbildung:
boxplot.hatching<-function(data, density=rep(10,ncol(box$stats)), col.hatching=rep("black", ncol(box$stats)), angle=rep(45, ncol(box$stats)), lwd=rep(1, ncol(box$stats)), lty=rep(1, ncol(box$stats)), names=names, col=rep("black", ncol(box$stats)), boxwex=0.8, ...) {
box<-boxplot(data, plot=FALSE, names=names)
if(length(lwd) < ncol(box$stats)) { lwd<-rep(lwd, ncol(box$stats)) }
if(length(lty) < ncol(box$stats)) { lty<-rep(lty, ncol(box$stats)) }
plot.new()
plot.window(xlim=c(1-boxwex/2, ncol(box$stats)+boxwex/2), ylim=c(min(box$stats[1, ]), max(box$stats[5, ])))
for(i in 1:ncol(box$stats)) {
rect(i-boxwex/2, box$stats[2, i], i+boxwex/2, box$stats[4, i], border=FALSE, density=density[i], col=col.hatching[i], angle=angle[i], lwd=lwd[i], lty=lty[i], lend=1)
rect(i-boxwex/2, box$stats[2, i], i+boxwex/2, box$stats[4, i], border="white", lwd=lwd[i], lty=1)
}
bxp(box, width=rep(1, ncol(box$stats)), pars=list(boxwex=boxwex, boxcol=col, medcol=col, whiskcol=col, staplecol=col, outcol=col), add=TRUE, ...)
}

boxplot.hatching(data.frame(1:10, 1:20), angle=c(45, 0), lwd=c(1, 3), lty=c(1, 3), col.hatching=c("blue", "red"), names=c("A", "B"))

Abb.: Boxplot mit Schraffur


zurück


Quellen:
[1] Draw Box Plots from Summaries
R: help(bxp) bzw. ?bxp
[2] Set or Query Graphical Parameters
R: help(par) bzw. ?par
[3] Add an Axis to a Plot
R: help(axis) bzw. ?axis
[4] Add Text to a Plot
R: help(text) bzw. ?text
[5] Patterning inside the boxplots in R
http://www.vpihur.com/blog/?p=319

26.9.2010 (R: 2.10.0-2.11.1)