Gráfico de barras empilhadas

Eu gostaria de criar um gráfico empilhado usando ggplot2 e geom_bar.

Aqui estão os meus dados de origem:

Rank F1 F2 F3 1 500 250 50 2 400 100 30 3 300 155 100 4 200 90 10 

Eu quero um gráfico empilhado onde x é a sorting e y são os valores em 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") 

Isto é, tanto quanto eu posso conseguir. Não tenho certeza de como posso empilhar o restante dos valores de campo.

Talvez meu data.frame não esteja em um bom formato?

Você disse :

Talvez meu data.frame não esteja em um bom formato?

Sim isso é verdade. Seus dados estão no formato wide Você precisa colocá-los no formato longo . De um modo geral, o formato longo é melhor para comparação de variables .

Usando reshape2 por exemplo, você faz isso usando o melt :

 dat.m < - melt(dat,id.vars = "Rank") ## just melt(dat) should work 

Então você pega o seu barplot:

 ggplot(dat.m, aes(x = Rank, y = value,fill=variable)) + geom_bar(stat='identity') 

Mas, usando a notação de fórmula inteligente de lattice e barchart , você não precisa reformular seus dados, apenas faça o seguinte:

 barchart(F1+F2+F3~Rank,data=dat) 

Você precisa transformar seus dados em formato longo e não deve usar $ dentro de 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") 

insira a descrição da imagem aqui

Você precisará melt seu dataframe para obtê-lo no chamado formato longo:

 require(reshape2) sample.data.M < - melt(sample.data) 

Agora seus valores de campo são representados por suas próprias linhas e identificados por meio da coluna variável. Isso agora pode ser aproveitado dentro da estética ggplot:

 require(ggplot2) c < - ggplot(sample.data.M, aes(x = Rank, y = value, fill = variable)) c + geom_bar(stat = "identity") 

Em vez de empilhar, você também pode estar interessado em mostrar vários charts usando facetas:

 c < - ggplot(sample.data.M, aes(x = Rank, y = value)) c + facet_wrap(~ variable) + geom_bar(stat = "identity") 

Com base na resposta de Roland, usando o tidyr para reformular os dados de largura para longa:

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

insira a descrição da imagem aqui