Ich habe meine Daten als .csv
Datei mit 12 Spalten gespeichert. Die Spalten zwei bis 11 (beschriftet F1, F2, ..., F11
) sind features
. Column one
enthält die label
dieser Funktionen entweder good
oder bad
.
Ich möchte ein plotten boxplot
von allen diesen 11 Funktionen gegen die label
, aber getrennt von good
oder bad
. Mein bisheriger Code lautet:
qplot(Label, F1, data=testData, geom = "boxplot", fill=Label,
binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")
Dies zeigt sich jedoch nur F1
gegen die label
.
Meine Frage ist: Wie kann man mit einigen F2, F3, ..., F11
gegen die label
in einem Diagramm zeigen dodge position
? Ich habe die Funktionen so normalisiert, dass sie innerhalb des Bereichs [0 1] im gleichen Maßstab liegen.
Die Testdaten finden Sie hier . Ich habe etwas von Hand gezeichnet, um das Problem zu erklären (siehe unten).
dput(testData)
die Ausgabe hier verwenden und einfügen, damit Benutzer direkt auf ihr System kopieren / einfügen können.Antworten:
Sie sollten Ihre Daten in einem bestimmten Format erhalten, indem Sie Ihre Daten vor dem Plotten schmelzen (siehe unten, wie geschmolzene Daten aussehen). 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))
Bearbeiten: Mir ist klar, dass Sie möglicherweise Facetten 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 Hinzufügen
x-labels
,y-labels
,title
, ändernlegend heading
, ein hinzufügenjitter
?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
Bearbeiten 3: Wie werden
geom_point()
Punkte an der Mitte des Boxplots ausgerichtet? Es könnte mit gemacht werdenposition_dodge
. 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
quelle
Da Sie kein Plot-Paket erwähnen, schlage ich hier die Verwendung der
Lattice
Version vor (ich denke, es gibt mehr ggplot2-Antworten als Gitter-Antworten, 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")
quelle
ylab="value"
,xlab="treatment"
zur bwplot-AnweisungMithilfe von Basisgrafiken können wir die
at =
Position der Box steuern, kombiniert mitboxwex =
der Breite der Boxen. Die 1.boxplot
Anweisung erstellt ein leeres Diagramm. Fügen Sie dann die 2 Spuren in den folgenden zwei Anweisungen hinzu.Beachten Sie, dass wir im Folgenden
df[,-1]
die 1. Spalte (id) von den zu zeichnenden Werten ausschließen. Bei verschiedenen Datenrahmen kann es erforderlich sein, diese in eine Teilmenge für die Spalten zu ändern, die 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)))
quelle
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)
Handlung:
quelle
Ich weiß, dass dies eine etwas ä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 zusätzliche Pakete wie ggplot oder gattice zu verwenden. Es ist nicht ganz so schön, dass sich die Boxplots überlappen, anstatt nebeneinander zu zeigen, aber:
boxplot(data1[,1:4]) boxplot(data2[,1:4],add=TRUE,border="red")
Dadurch werden zwei Sätze von Boxplots eingefügt, wobei der zweite einen Umriss (keine Füllung) in Rot aufweist und die Ausreißer ebenfalls in Rot. Das Schöne ist, dass es für zwei verschiedene Datenrahmen funktioniert, anstatt zu versuchen, sie neu zu formen. Schneller und schmutziger Weg.
quelle
In Basis R kann eine Formelschnittstelle mit Interaktionen (
:
) 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)
quelle