Gráfico de barras empilhado

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

quero um gráfico empilhado onde x é o posto 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 é o mais longe que consigo chegar. Não sei como posso empilhar o resto dos valores do campo.

Talvez os meus dados.a moldura não está num bom formato?

Author: zx8754, 2014-01-20

4 answers

Disseste:
Talvez os meus dados.a moldura não está num bom formato?
Sim, é verdade. Os seus dados estão no formato largo que precisa de colocar no formato longo. De um modo geral, o formato longo é melhor para comparação de variáveis .

Usando reshape2 por exemplo, faça isto usando melt:

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

Depois recebes o teu barplot:

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

Mas usando lattice e barchart notação de Fórmula inteligente, não é necessário reformule os seus dados, apenas faça isto: [9]}

barchart(F1+F2+F3~Rank,data=dat)
 32
Author: agstudy, 2014-01-20 14:25:49

Tem de transformar os seus dados num formato longo e não deve usar $ lá dentro 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

 36
Author: Roland, 2014-01-20 14:20:31

Terá de {[3] } o seu dataframe para o colocar no chamado formato longo:

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

Agora os seus valores de campo são representados pelas suas próprias linhas e identificados através da coluna variável. Isto pode agora ser alavancado 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 também poderá estar interessado em mostrar várias parcelas usando facetas:

c <- ggplot(sample.data.M, aes(x = Rank, y = value))
c + facet_wrap(~ variable) + geom_bar(stat = "identity")
 3
Author: CMichael, 2014-01-20 14:28:45

Baseado na resposta do Roland, usando tidyr para reformular os dados de grande para longo:

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

 0
Author: sbha, 2018-02-19 20:41:15