Je voudrais créer un graphique empilé en utilisant ggplot2 et geom_bar.
Voici mes données sources:
Rank F1 F2 F3
1 500 250 50
2 400 100 30
3 300 155 100
4 200 90 10
Je veux un graphique empilé où x est le rang et y les valeurs de F1, F2, F3.
# Getting Source Data
sample.data <- read.csv('sample.data.csv')
# Plot Chart
c <- ggplot(sample.data, aes(x = sample.data$Rank, y = sample.data$F1))
c + geom_bar(stat = "identity")
Ceci est aussi loin que je peux obtenir. Je ne sais pas comment empiler le reste des valeurs de champ.
Peut-être que mon data.frame n'est pas dans un bon format?
Tu as dit :
Peut-être que mon data.frame n'est pas dans un bon format?
Oui c'est vrai. Vos données sont au format large Vous devez les mettre au format long. De manière générale, le format long est préférable pour comparaison de variables.
En utilisant reshape2
_ par exemple, vous faites ceci en utilisant melt
:
dat.m <- melt(dat,id.vars = "Rank") ## just melt(dat) should work
Ensuite, vous obtenez votre barplot:
ggplot(dat.m, aes(x = Rank, y = value,fill=variable)) +
geom_bar(stat='identity')
Mais en utilisant lattice
et barchart
, la notation de formule intelligente, vous n'avez pas besoin de remodeler vos données, procédez comme suit:
barchart(F1+F2+F3~Rank,data=dat)
Vous devez transformer vos données au format long sans utiliser $
à l'intérieur aes
:
DF <- read.table(text="Rank F1 F2 F3
1 500 250 50
2 400 100 30
3 300 155 100
4 200 90 10", header=TRUE)
library(reshape2)
DF1 <- melt(DF, id.var="Rank")
library(ggplot2)
ggplot(DF1, aes(x = Rank, y = value, fill = variable)) +
geom_bar(stat = "identity")
S'appuyant sur la réponse de Roland, en utilisant tidyr
pour remodeler les données de large à long:
library(tidyr)
library(ggplot2)
df <- read.table(text="Rank F1 F2 F3
1 500 250 50
2 400 100 30
3 300 155 100
4 200 90 10", header=TRUE)
df %>%
gather(variable, value, F1:F3) %>%
ggplot(aes(x = Rank, y = value, fill = variable)) +
geom_bar(stat = "identity")
Vous aurez besoin de melt
votre cadre de données pour le convertir au format long:
require(reshape2)
sample.data.M <- melt(sample.data)
Maintenant, vos valeurs de champ sont représentées par leurs propres lignes et identifiées par le biais de la colonne de variable. Ceci peut maintenant être exploité dans l'esthétique de ggplot:
require(ggplot2)
c <- ggplot(sample.data.M, aes(x = Rank, y = value, fill = variable))
c + geom_bar(stat = "identity")
Plutôt que d'empiler, vous voudrez peut-être aussi montrer plusieurs parcelles à l'aide de facettes:
c <- ggplot(sample.data.M, aes(x = Rank, y = value))
c + facet_wrap(~ variable) + geom_bar(stat = "identity")