Изменение порядка уклоняемых баров в ggplot2 barplot - PullRequest
11 голосов
/ 12 ноября 2009

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

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

Ответы [ 4 ]

4 голосов
/ 14 ноября 2009

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

Цель состоит в том, чтобы столбцы с надписью «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")

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

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

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

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

4 голосов
/ 16 апреля 2012

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

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

Нету

4 голосов
/ 13 ноября 2009

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

1 голос
/ 04 августа 2017

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...