Alterando a ordem de bares desviou de em ggplot2 barplot
Pergunta
Eu tenho um df.all
trama de dados e eu estou traçando-o em uma trama bar com ggplot2 usando o código abaixo. Eu gostaria de fazê-lo assim que a ordem das barras desviou de é invertida. Ou seja, para que as barras identificado como "Singular" vir antes das barras rotuladas "Plural".
ggplot(df.all, aes(gram, V1, fill=number)) +
geom_bar(stat="identity", position="dodge") +
scale_x_discrete(labels=c("Grammatical","Ungrammatical")) +
scale_y_continuous(formatter="percent", limits=c(0,1)) +
facet_grid(. ~ experiment) +
scale_fill_hue("Attractor", breaks=c("S","P"), labels=c("Singular","Plural"))
Eu tentei fazer levels(df.all$number) = c("S", "P")
pensamento que usos talvez ggplot a ordem dos níveis de decidir ordem tramando, mas que não funcionou. Eu não tenho certeza o que mais tentar. Alguma idéia?
O conteúdo do df.all
, no caso, é útil:
> df.all
number gram experiment V1
1 S G BERIMBAU_AGR_A 0.8133333
2 S G BERIMBAU_AGR_B 0.8658537
3 S U BERIMBAU_AGR_A 0.5436242
4 S U BERIMBAU_AGR_B 0.4597701
5 P G BERIMBAU_AGR_A 0.8580645
6 P G BERIMBAU_AGR_B 0.8536585
7 P U BERIMBAU_AGR_A 0.3087248
8 P U BERIMBAU_AGR_B 0.3975904
> str(df.all)
'data.frame': 8 obs. of 4 variables:
$ number : Factor w/ 2 levels "S","P": 2 2 2 2 1 1 1 1
..- attr(*, "scores")= num [1:2(1d)] 0 -1
.. ..- attr(*, "dimnames")=List of 1
.. .. ..$ : chr "P" "S"
$ gram : Factor w/ 2 levels "G","U": 1 1 2 2 1 1 2 2
$ experiment: Factor w/ 4 levels "BERIMBAU_AGR_A",..: 1 4 1 4 1 4 1 4
$ V1 : num 0.813 0.866 0.544 0.46 0.858 ...
Solução 3
Hadley forneceu uma solução. Aqui está uma réplica do problema e da solução.
O objetivo é fazer com que as barras rotulado de "S" para vir antes dos bares rotulado como "P". Isso não acontece por padrão porque as ordens R níveis em ordem alfabética.
df <- read.csv("http://pealco.net/code/ggplot_dodge/df.txt")
ggplot(df, aes(gram, V1, fill=number))
+ geom_bar(stat="identity", position="dodge")
Como Hadley comentou em outra resposta, "você precisa reordenar com base nas variáveis ??x, não a variável y". Embora eu não tenho certeza por que isso funciona.
Para inverter a ordem dos fatores neste exemplo, você pode converter o fator para numérico e multiplique por -1.
df <- with(df, df[order(gram, -as.numeric(number)), ])
Eu ainda gostaria mais alguma explicação sobre o porquê de obras df <- with(df, df[order(gram, -as.numeric(number)), ])
.
Outras dicas
Eu penso necessidades df.all$number
ser um fator ordenada. Tente df.all$number <- ordered(df.all$number)
Em alguns casos, eu não acho que isso é possível:
layerCake<-data.frame(group=c(rep("normal",4),rep("tumor",4)),
class=factor(rep(c("exon","intron","intergenic","unmapped"),2),levels=rev(c("exon","intron","intergenic","unmapped")),ordered=TRUE),
fraction=c(.02,.25,.50,.23,.015,.20,.555,.23)
)
layerCake[layerCake$group=='normal',"reads"]<-130948403*layerCake[layerCake$group=='normal',"fraction"]
layerCake[layerCake$group=='tumor',"reads"]<-200948403*layerCake[layerCake$group=='tumor',"fraction"]
g<-ggplot(layerCake, aes(x=factor(group),y=reads, fill=factor(class),order = as.numeric(class)))+xlab("Group")+scale_fill_discrete(name="Anno Class",breaks=c("exon","intron","intergenic","unmapped"))
ordem correta em empilhados:
g + geom_bar (status = "identidade", a posição = "pilha")
ordem incorreta em Dodge:
g+geom_bar(stat="identity",position="dodge")
vamos tentar inverter a ordem em ggplot:
g<-ggplot(lc, aes(x=factor(group),y=reads, fill=factor(class),order = -as.numeric(class)))+xlab("Group")+scale_fill_discrete(name="Anno Class",breaks=c("exon","intron","intergenic","unmapped"))
g+geom_bar(stat="identity",position="dodge")
nenhum dado
vamos tentar reordenar o quadro de dados
lc <- with(lc, lc[order(-as.numeric(class)), ])
g<-ggplot(lc, aes(x=factor(group),y=reads, fill=factor(class),order = -as.numeric(class)))+xlab("Group")+scale_fill_discrete(name="Anno Class",breaks=c("exon","intron","intergenic","unmapped"))
g+geom_bar(stat="identity",position="dodge")
Nope
Alterando níveis de fator realmente alterar a ordem dos bares desviou de! armadilha comum: as cores ainda permanecer em uma determinada posição, assim que tomar uma rápida olhada faz parecer que a ordem não mudou. Mas se você olhar para os valores que você vai ver que a ordem realmente mudou.
Edit: A minha resposta anterior abaixo só muda ordem de esquema de cores dada aos bares. Este é ainda útil, como podemos muitas vezes querem inverter o esquema de cores ao mesmo tempo como alterar a ordem das barras:
Eu estava usando scale_fill_manual porque eu queria para preencher manualmente as cores dos meus bares.
ggplot(data, aes_string(x = "countries", y = "population", fill = "agegroups")) +
scale_fill_manual(values = CustomColorFunction(), limits = (levels(data$agegroups)))
Passado 5 horas mexer com alteração dos níveis de fator e organizar a trama de dados de espera que isso ajude alguém!