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