it-swarm.com.de

Zeichnen Sie mehrere Boxplots in einem Diagramm

Ich habe meine Daten als .csv -Datei mit 12 Spalten gespeichert. Die Spalten zwei bis 11 (mit der Bezeichnung F1, F2, ..., F11) lauten features. Column one enthält die label dieser Funktionen, entweder good oder bad.

Ich möchte eine boxplot von all diesen 11 Funktionen gegen die label zeichnen, aber durch good oder bad. Mein Code ist bisher:

qplot(Label, F1, data=testData, geom = "boxplot", fill=Label, 
          binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")

Dies zeigt jedoch nur F1 gegen die label.

Meine Frage ist: Wie zeige ich F2, F3, ..., F11 gegen die label in einem Diagramm mit einigen dodge position? Ich habe die Features normalisiert, sodass sie innerhalb des Bereichs [0 1] im selben Maßstab liegen.

Die Testdaten finden Sie hier . Ich habe etwas von Hand gezeichnet, um das Problem zu erklären (siehe unten).

hand-drawn boxplot example

65
Samo Jerom

Sie sollten Ihre Daten in einem bestimmten Format erhalten, indem Sie sie schmelzen (siehe unten, wie geschmolzene Daten aussehen), bevor Sie plotten. Ansonsten scheint das, was Sie getan haben, in Ordnung zu sein.

require(reshape2)
df <- read.csv("TestData.csv", header=T)
# melting by "Label". `melt is from the reshape2 package. 
# do ?melt to see what other things it can do (you will surely need it)
df.m <- melt(df, id.var = "Label")
> df.m # pasting some rows of the melted data.frame

#     Label variable      value
# 1    Good       F1 0.64778924
# 2    Good       F1 0.54608791
# 3    Good       F1 0.46134200
# 4    Good       F1 0.79421221
# 5    Good       F1 0.56919951
# 6    Good       F1 0.73568570
# 7    Good       F1 0.65094207
# 8    Good       F1 0.45749702
# 9    Good       F1 0.80861929
# 10   Good       F1 0.67310067
# 11   Good       F1 0.68781739
# 12   Good       F1 0.47009455
# 13   Good       F1 0.95859182
# 14   Good       F1 1.00000000
# 15   Good       F1 0.46908343
# 16    Bad       F1 0.57875528
# 17    Bad       F1 0.28938046
# 18    Bad       F1 0.68511766

require(ggplot2)
ggplot(data = df.m, aes(x=variable, y=value)) + geom_boxplot(aes(fill=Label))

boxplot_ggplot2

Edit: Mir ist klar, dass Sie möglicherweise facettieren müssen. Hier ist auch eine Implementierung davon:

p <- ggplot(data = df.m, aes(x=variable, y=value)) + 
             geom_boxplot(aes(fill=Label))
p + facet_wrap( ~ variable, scales="free")

ggplot2_faceted

Edit 2: Wie man x-labels, y-labels, title hinzufügt, legend heading Ändert, ein jitter hinzufügt ?

p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill=Label))
p <- p + geom_jitter()
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_geom_plot

Edit 3: Wie richtet man geom_point() auf die Mitte des Boxplots aus? Dies könnte mit position_dodge Geschehen. Das sollte funktionieren.

require(ggplot2)
p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill = Label))
# if you want color for points replace group with colour=Label
p <- p + geom_point(aes(y=value, group=Label), position = position_dodge(width=0.75))
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_position_dodge_geom_point

97
Arun

Da Sie kein Handlungspaket erwähnen, schlage ich hier die Verwendung der Lattice -Version vor (ich glaube, es gibt mehr ggplot2-Antworten als Gitterantworten, zumindest seit ich hier in SO bin).

 ## reshaping the data( similar to the other answer)
 library(reshape2)
 dat.m <- melt(TestData,id.vars='Label')
 library(lattice)
 bwplot(value~Label |variable,    ## see the powerful conditional formula 
        data=dat.m,
        between=list(y=1),
        main="Bad or Good")

enter image description here

19
agstudy

Mit Basisgrafiken können wir at =, um die Boxposition zu steuern, kombiniert mit boxwex = für die Breite der Felder. Die erste boxplot -Anweisung erstellt ein leeres Diagramm. Fügen Sie dann die 2 Spuren in den folgenden beiden Anweisungen hinzu.

Beachten Sie, dass wir im Folgenden df[,-1], um die erste (id) Spalte von den zu zeichnenden Werten auszuschließen. Bei unterschiedlichen Datenrahmen muss dies möglicherweise in eine Teilmenge geändert werden, für welche Spalten die Daten enthalten, die Sie zeichnen möchten.

boxplot(df[,-1], boxfill = NA, border = NA) #invisible boxes - only axes and plot area
boxplot(df[df$id=="Good", -1], xaxt = "n", add = TRUE, boxfill="red", 
  boxwex=0.25, at = 1:ncol(df[,-1]) - 0.15) #shift these left by -0.15
boxplot(df[df$id=="Bad", -1], xaxt = "n", add = TRUE, boxfill="blue", 
  boxwex=0.25, at = 1:ncol(df[,-1]) + 0.15) #shift to the right by +0.15

enter image description here

Einige Dummy-Daten:

df <- data.frame(
  id = c(rep("Good",200), rep("Bad", 200)),
  F1 = c(rnorm(200,10,2), rnorm(200,8,1)),
  F2 = c(rnorm(200,7,1),  rnorm(200,6,1)),
  F3 = c(rnorm(200,6,2),  rnorm(200,9,3)),
  F4 = c(rnorm(200,12,3), rnorm(200,8,2)))
12
dww

ggplot-Version des Gitterplots:

library(reshape2)
library(ggplot2)
df <- read.csv("TestData.csv", header=T)
df.m <- melt(df, id.var = "Label")

ggplot(data = df.m, aes(x=Label, y=value)) + 
         geom_boxplot() + facet_wrap(~variable,ncol = 4)

Plot: enter image description here

11
JT85

Ich weiß, dass dies eine ältere Frage ist, aber es ist auch eine, die ich hatte, und während die akzeptierten Antworten funktionieren, gibt es eine Möglichkeit, etwas Ähnliches zu tun ohne mit zusätzlichen Paketen wie ggplot oder Gitter. Es ist nicht ganz so schön, dass sich die Boxplots überlappen und nicht nebeneinander angezeigt werden, sondern:

boxplot(data1[,1:4])
boxplot(data2[,1:4],add=TRUE,border="red")

picture of what this does.

Dies fügt zwei Boxplot-Sätze ein, wobei der zweite einen Umriss (keine Füllung) in Rot aufweist und die Ausreißer ebenfalls in Rot. Das Schöne daran ist, dass es für zwei verschiedene Datenrahmen funktioniert, anstatt zu versuchen, sie umzugestalten. Schneller und schmutziger Weg.

5
user2103050

In der Basis R eine Formelschnittstelle mit Interaktionen (:) kann verwendet werden, um dies zu erreichen.

df <- read.csv("~/Desktop/TestData.csv")
df <- data.frame(stack(df[,-1]), Label=df$Label) # reshape to long format

boxplot(values ~ Label:ind, data=df, col=c("red", "limegreen"), las=2)

example