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).
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))
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")
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
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
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")
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
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)))
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:
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")
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.