web-dev-qa-db-fra.com

tracer des graphiques à barres groupées dans R

j'essaie de tracer ces données dans R -

column1  column2  column3
1-2       abc       10
1-2       def       15
1-2       ghi       20
2-3       abc       80
2-3       def       95
2-3       ghi       10
3-4       abc       30
3-4       def       55
3-4       ghi       80

l'axe x serait la colonne1 (donc 1-2, 2-3 et 3-4 serait présent en tant qu'axe x), et sur l'axe y, les valeurs de la colonne3 devraient être tracées pour chacun des éléments de la colonne2. Il s’agit donc essentiellement d’un diagramme à barres "groupé".

Je ne suis pas en mesure de tracer ce diagramme à barres groupée à l'aide de R. L'extrait de code que j'utilise est ci-dessous:

dataset <- fetch(rs,n=-1)
plot_var <- table(dataset$percentage, dataset$age)
barplot(plot_var, names.arg,
        main="Title of Graph",
        xlab="Column1", col=c("darkblue","red"),
        legend = rownames(plot_var), beside=TRUE)

Comment puis-je obtenir ce graphique à barres groupées à afficher? Merci!

9
kallakafar

Votre problème semble résulter d'un mauvais formatage des données. Vous devez créer une matrice avec la structure de noms de lignes appropriée pour créer le tracé souhaité avec les graphiques de base. Voici votre solution:

#your data...
d <- data.frame(row.names=c("1-2","2-3","3-4"), abc = c(10,80, 30), 
                def = c(15, 95, 55), ghi = c(20, 10, 80))
#but you make a matrix out of it to create bar chart
d <- do.call(rbind, d)
#...and you are sorted
barplot(d, beside = TRUE, ylim=c(0,100), legend.text = rownames(d), 
        args.legend = list(x = "topleft", bty="n"))

enter image description here

Cependant, j’aime parfois utiliser lattice pour ce type de tâche. Cette fois, vous n'avez même pas besoin de créer de matrice, vous devez simplement conserver votre data.frame au format original:

d <- data.frame(column1=rep(c("1-2","2-3","3-4"), each=3), 
                column2=rep(c("abc", "def", "ghi"), 3), 
                column3=c(10, 15, 20, 80, 95, 10, 30, 55, 80))
require(lattice)
barchart(column3 ~ column1, groups=column2, d, auto.key = list(columns = 3))

enter image description here

14
Geek On Acid

J'aime utiliser ggplot2 pour ce genre de tâche.

#Make the data reproducible:
column1 <- c(rep("1-2", 3), rep("2-3", 3), rep("3-4", 3))
column2 <- gl(3, 1, 9, labels=c("abc", "def", "ghi"))
column3 <- c(10, 15, 20, 80, 95, 10, 30, 55, 80)

d <- data.frame(column1=column1, column2=column2, column3=column3)

require(ggplot2)
ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(position=position_dodge())

La raison pour laquelle je trouve cela intuitif (après un peu de période d'apprentissage) est que vous avez clairement indiqué ce que vous voulez sur les axes x et y, et nous disons simplement cela à ggplot (ainsi que la variable définissant la couleur de "remplissage", et quel type de parcelle - ici, geom_bar - à utiliser.

enter image description here

9
Drew Steen

J'ai trouvé l'aide de la réponse de Drew Steen, mais le code ci-dessus ne fonctionnait pas pour moi, comme indiqué ci-dessus. J'ai ajouté stat = "identité" et cela fonctionne.

require(ggplot2)
ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(stat="identity", position=position_dodge())

Merci Drew pour ta réponse.

0
J.Doe