web-dev-qa-db-fra.com

Diagramme à barres empilées

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?

43
WongSifu

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

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

enter image description here

41
Roland

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

enter image description here

4
sbha

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")
3
CMichael