Изменение порядка уклонения брусков в баржетах ggplot2
У меня есть dataframe df.all
, и я рисую его на графике с ggplot2, используя приведенный ниже код. Я бы хотел сделать так, чтобы порядок уклоненных баров перевернулся. То есть, чтобы бары с надписью "Singular" попали в бары с надписью "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"))
Я пробовал сделать 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 ...
Ответы
Ответ 1
Хэдли предоставила решение. Здесь тиражирование проблемы и решение.
Цель состоит в том, чтобы столбцы, обозначенные буквой "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)), ])
работает.
Ответ 2
Я думаю, что df.all$number
должен быть упорядоченным. Попробуйте df.all$number <- ordered(df.all$number)
Ответ 3
В некоторых случаях я не думаю, что это возможно:
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]()
неправильный порядок в dodge:
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
Изменение уровней факторов действительно изменяет порядок уклоненных баров! Обычная ловушка: цвета все еще остаются в определенном положении, поэтому быстрый взгляд заставляет его выглядеть как порядок не изменился. Но если вы посмотрите на значения, вы увидите, что порядок действительно изменился.
Изменить: Мой предыдущий ответ ниже меняет порядок цветовой схемы, заданный для баров. Это по-прежнему полезно, так как часто может потребоваться изменить цветовую схему одновременно с изменением порядка строк:
Я использовал scale_fill_manual, потому что я хотел вручную заполнить цвета своих баров.
ggplot(data, aes_string(x = "countries", y = "population", fill = "agegroups")) +
scale_fill_manual(values = CustomColorFunction(), limits = (levels(data$agegroups)))
Отработал 5 часов, переделывая с меняющимися уровнями факторов и устраивая фреймворк, который помогает кому-то!