Meerdere boxplots in één grafiek plotten

Ik heb mijn gegevens opgeslagen als een .csv-bestand met 12 kolommen. Kolommen twee tot en met 11 (met het label F1, F2, ..., F11) zijn features. Column onebevat het labelvan deze functies, ofwel goodof bad.

Ik wil graag een boxplotvan al deze 11 kenmerkenuitzetten tegen het label, maar gescheiden door goodof bad. Mijn code tot nu toe is:

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

Dit toont echter alleen F1tegen het label.

Mijn vraag is: Hoe toon ik F2, F3, ..., F11tegen het labelin één grafiek met een dodge position? Ik heb de functies genormaliseerd, zodat ze binnen het bereik van [0 1] op dezelfde schaal liggen.

De testgegevens zijn hierte vinden. Ik heb iets met de hand getekend om het probleem uit te leggen (zie hieronder).


Antwoord 1, autoriteit 100%

U moet uw gegevens in een specifieke indeling krijgen door uw gegevens te smelten (zie hieronder hoe gesmolten gegevens eruitzien) voordat u gaat plotten. Anders lijkt het goed te zijn wat je hebt gedaan.

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))

bewerken: Ik realiseer me dat je misschien facet nodig hebt. Hier is ook een implementatie van dat:

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

Edit 2: Hoe toevoegen x-labels, y-labels, title, wijzig legend heading, voeg een jitter?

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 

Bewerken 3:Hoe lijn je geom_point()punten uit met het midden van de box-plot? Het kan worden gedaan met behulp van position_dodge. Dit zou moeten werken.

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 


Antwoord 2, autoriteit 19%

Met behulp van basisafbeeldingen kunnen we at =gebruiken om de positie van de box te bepalen, gecombineerd met boxwex =voor de breedte van de boxen. De eerste boxplot-instructie creëert een blanco plot. Voeg vervolgens de 2 sporen toe in de volgende twee instructies.

Houd er rekening mee dat we in het volgende df[,-1]gebruiken om de eerste (id) kolom uit te sluiten van de te plotten waarden. Met verschillende gegevensframes kan het nodig zijn om dit te wijzigen in een subset voor de kolommen die de gegevens bevatten die u wilt plotten.

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

Sommige dummy-gegevens:

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)))

Antwoord 3, Autoriteit 16%

Aangezien u geen plotpakket noemt, stel ik hier voor gebruik met LatticeVersie (ik denk dat er meer ggplot2-antwoorden zijn dan roostice-exemplaren, althans sinds ik hier in zo ben).

## 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")


Antwoord 4, Autoriteit 10%

GGPLOT-versie van het Rattice-plot:

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)

perceel:


Antwoord 5, Autoriteit 6%

Ik weet dat dit een wat oudere vraag is, maar ik had er ook een, en hoewel de geaccepteerde antwoorden werken, is er een manier om iets soortgelijks te doen zonderextra pakketten te gebruiken, zoals ggplot of rooster. Het is niet zo mooi omdat de boxplots elkaar overlappen in plaats van naast elkaar te laten zien, maar:

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

Hiermee worden twee sets boxplots weergegeven, waarbij de tweede een omtrek (geen vulling) in rood heeft, en ook de uitbijters in rood. Het leuke is dat het voor twee verschillende dataframes werkt in plaats van te proberen ze opnieuw vorm te geven. Snelle en vuile manier.


Antwoord 6, autoriteit 3%

In basis R kan hiervoor een formule-interface met interacties (:) worden gebruikt.

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)

Other episodes