Como você pede as colors de preenchimento dentro de ggplot2 geom_bar

Eu estou chamando a function ggplot

ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity") 

O resultado é um barplot com barras preenchidas por várias colors correspondentes à categoria. No entanto, a ordenação das colors não é consistente de barra para barra. Diga que há rosa, verde e azul. Alguns bares vão rosa, verde, azul de baixo para cima e alguns vão verde, rosa, azul. Eu não vejo nenhum padrão óbvio.

Como essas ordenações são escolhidas? Como posso mudá-lo? No mínimo, como posso fazer o ggplot escolher uma ordem consistente?

A class de (x, y e categoria) é (inteiro, numérico e fator) respectivamente. Se eu fizer da categoria um fator ordenado, isso não alterará esse comportamento.

Alguém sabe como consertar isso?

Exemplo reproduzível:

 dput(data) structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L, 10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L, 7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L, 9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L, 6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L, 8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L, 8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", "Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up" ), class = c("ordered", "factor")), NG = c(222614.67, 9998.17, 351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52, 15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21, 120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06, 4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26, 384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96, 3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG" ), row.names = c(NA, -40L), class = "data.frame") ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity") 

Você precisa especificar a order estética também.

 ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+ geom_bar(stat="identity") 

insira a descrição da imagem aqui

Isso pode ou não ser um bug .

A partir de ggplot2_2.0.0, a estética do order não está mais disponível. Para obter um gráfico com as pilhas ordenadas pela cor de preenchimento, você pode simplesmente solicitar o dataset pela variável de agrupamento que deseja ordenar.

Costumo usar arrange de dplyr para isso. Aqui estou pedindo o dataset pelo fator de fill dentro da chamada ggplot vez de criar um dataset ordenado, mas também funcionará bem.

 library(dplyr) ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) + geom_bar(stat = "identity") 

Isso é feito facilmente na base R, é claro, usando a order clássica com os extratos:

 ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) + geom_bar(stat = "identity") 

Com o gráfico resultante em ambos os casos agora na ordem desejada: insira a descrição da imagem aqui

atualização ggplot2_2.2.0

Em ggplot_2.2.0, a ordem de preenchimento é baseada na ordem dos níveis dos fatores. A ordem padrão irá traçar o primeiro nível no topo da pilha, em vez do inferior.

Se você quiser o primeiro nível na parte inferior da pilha, você pode usar reverse = TRUE em position_stack . Note que você também pode usar geom_col como atalho para geom_bar(stat = "identity") .

 ggplot(data, aes(mon, NG, fill = gclass)) + geom_col(position = position_stack(reverse = TRUE)) 

Você pode alterar a cor usando as funções scale_fill_ . Por exemplo:

 ggplot(dd,aes(mon,NG,fill=gclass)) + geom_bar(stat="identity") + scale_fill_brewer(palette="blues") 

Para obter uma ordem consistente nas bars , você precisa solicitar o quadro de dados:

 dd = dd[with(dd, order(gclass, -NG)), ] 

Para alterar a ordenação da legenda, altere o fator gclass . Então, algo como:

 dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE)) 

insira a descrição da imagem aqui

Para pedir, você deve usar o parâmetro levels e informar o pedido. Como isso:

 data$gclass (data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity")