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?
4 answers
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)
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")
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")
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")