Tracer plusieurs boîtes à moustaches dans un graphique

J’ai enregistré mes données dans un fichier .csv avec 12 colonnes. Les colonnes 2 à 11 (étiquetées F1, F2, ..., F11 ) sont des features . Column one contient l’ label de ces fonctionnalités, qu’elles soient good ou bad .

Je voudrais tracer une boxplot de toutes ces 11 caractéristiques par rapport à l’ label , mais en les séparant par le good ou le bad . Mon code jusqu’à présent est le suivant:

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

Cependant, cela ne montre que F1 rapport à l’ label .

Ma question est la suivante: comment afficher F2, F3, ..., F11 sur l’ label d’un graphique avec une dodge position ? J’ai normalisé les caractéristiques pour qu’elles soient dans la même échelle dans la plage [0 1].

Les données de test peuvent être trouvées ici . J’ai dessiné quelque chose à la main pour expliquer le problème (voir ci-dessous).

exemple de boîte dessinée à la main

Vous devriez obtenir vos données dans un format spécifique en fondant vos données (voir ci-dessous à quoi ressemblent les données fondues) avant de tracer. Sinon, ce que vous avez fait semble aller bien.

 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: Je me rends compte que vous pourriez avoir besoin de facette. Voici une mise en œuvre de cela également:

 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: Comment append x-labels y-labels , un title , changer le legend heading , append une 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 

ggplot2_geom_plot

Edit 3: Comment aligner les points geom_point() sur le centre de box-plot? Cela pourrait être fait en utilisant position_dodge . Cela devrait fonctionner.

 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

Comme vous ne mentionnez pas de paquetage de tracé, je propose ici d’utiliser la version Lattice (je pense qu’il y a plus de réponses de ggplot2 que de treillis, du moins depuis que je suis dans SO).

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

entrer la description de l'image ici

version ggplot du tracé du réseau:

 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) 

Terrain: entrer la description de l'image ici

En utilisant des graphiques de base, nous pouvons utiliser at = pour contrôler la position de la boîte, combinée avec boxwex = pour la largeur des boîtes. La première déclaration boxplot crée un tracé vide. Ajoutez ensuite les 2 traces dans les deux instructions suivantes.

Notez que dans ce qui suit, nous utilisons df[,-1] pour exclure la première colonne (id) des valeurs à tracer. Avec des trames de données différentes, il peut être nécessaire de modifier ce paramètre pour devenir un sous-ensemble, quelles que soient les colonnes contenant les données que vous souhaitez tracer.

 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))) boxplot(df[,-1], xlim = c(0.5, ncol(df[,-1])+0.5), boxfill=rgb(1, 1, 1, alpha=1), border=rgb(1, 1, 1, alpha=1)) #invisible boxes boxplot(df[which(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[which(df$id=="Bad"), -1], xaxt = "n", add = TRUE, boxfill="blue", boxwex=0.25, at = 1:ncol(df[,-1]) + 0.15) #shift these right by +0.15 

entrer la description de l'image ici

Je sais que c’est une question un peu ancienne, mais c’est une question que j’ai eue, et bien que les réponses acceptées fonctionnent, il existe un moyen de faire quelque chose de similaire sans utiliser de paquets supplémentaires comme ggplot ou lattice. Ce n’est pas tout à fait aussi bien que les boîtes à moustaches se chevauchent plutôt que d’être affichées côte à côte, mais:

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

image de ce que cela fait.

Cela met deux séries de boîtes à moustaches, la seconde ayant un contour (sans remplissage) en rouge, et met également les valeurs aberrantes en rouge. Ce qui est bien, c’est que cela fonctionne pour deux types de données différents plutôt que d’essayer de les modifier. Manière rapide et sale.