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 ...
Foi útil?

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") enter descrição da imagem aqui

ordem incorreta em Dodge:

g+geom_bar(stat="identity",position="dodge")

enter descrição da imagem aqui

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top