2009-11-12 2 views
9

У меня есть dataframe df.all, и я рисую его в строке с ggplot2, используя код ниже. Я бы хотел сделать так, чтобы порядок уклоненных баров перевернулся. То есть, чтобы бары с надписью «Singular» выходили перед барами с надписью «Plural».Изменение порядка уклонившихся баров в ggplot2 barplot

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")) 

Я пытался делать levels(df.all$number) = c("S", "P") думать, что, возможно, ggplot использует порядок уровней, чтобы решить, черчение порядка, но это не сработало. Я не уверен, что еще попробовать. Есть идеи?

Содержание df.all, в случае, если это полезно:

> 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 ... 
+3

Я думаю, что это ошибка в ggplot2 - он должен уважать порядок данных (или порядок эстетики) при уклонениях баров, но я думаю, что это не так. Трудно сказать без воспроизводимого примера. – hadley

+0

Хэдли, могу ли я отправить вам некоторые данные и код? Я очень хорошо воспроизвожу эту ошибку :) – pealco

ответ

4

Hadley предоставил решение. Вот репликация проблемы и решение.

Цель состоит в том, чтобы получить бары с надписью «S», которые должны находиться перед барами с надписью «P». Это не происходит по умолчанию, потому что R заказывает уровни в алфавитном порядке.

df <- read.csv("http://pealco.net/code/ggplot_dodge/df.txt") 
ggplot(df, aes(gram, V1, fill=number)) 
    + geom_bar(stat="identity", position="dodge") 

alt text http://pealco.net/code/ggplot_dodge/wrongorder.png

Как Hadley прокомментировал в другой ответ, «Вы должны изменить порядок на основе переменных х, а не переменной у». Хотя я не уверен, почему это работает.

Чтобы перевернуть порядок факторов в этом примере, вы можете преобразовать коэффициент в числовой и умножить на -1.

df <- with(df, df[order(gram, -as.numeric(number)), ]) 

Построение снова показывает, что его работы.

alt text http://pealco.net/code/ggplot_dodge/rightorder.png

я бы до сих пор, как так более подробного объяснения о том, почему df <- with(df, df[order(gram, -as.numeric(number)), ]) работ.

4

Я думаю df.all$number должен быть упорядоченным фактором. Попробуйте df.all$number <- ordered(df.all$number)

+1

Да, а затем вы можете вручную изменить порядок с помощью опции 'levels = c()' –

4

В некоторых случаях я не думаю, что это возможно:

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")) 

правильный порядок в стек:
г + geom_bar (стат = "идентичность", позиция = "стек") enter image description here

неправильный порядок увернуться:

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

enter image description here

давайте попробуем изменить порядок в 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") 

не кости

давайте попробуем изменить порядок фрейм данных

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") 

Нету

0

Изменение уровней фактора действительно измените порядок уклоненных баров! Обычная ловушка: цвета все еще остаются в определенном положении, поэтому быстрый взгляд заставляет его выглядеть как порядок не изменился. Но если вы посмотрите на значения, вы увидите, что заказ действительно изменился.

Редактировать: Мой предыдущий ответ ниже меняет порядок цветовой схемы, заданный для баров. Это по-прежнему полезно, так как мы часто можем изменить цветовую схему одновременно с изменением порядка штрихов:

Я использовал scale_fill_manual, потому что я хотел вручную заполнить цвета своих баров.

ggplot(data, aes_string(x = "countries", y = "population", fill = "agegroups")) + 
scale_fill_manual(values = CustomColorFunction(), limits = (levels(data$agegroups))) 

Проведенный в течение 5 часов с изменяющимися уровнями факторов и организацией кадра данных надеется, что это поможет кому-то!

Смежные вопросы