2013-03-06 3 views
24

Я вызываю функцию ggplotКак прикажет заполняющий цвет в ggplot2 geom_bar

ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity") 

В результате barplot с барами, заполненных различными цветами, соответствующих категорию. Однако порядок цветов не соответствует от бара до бара. Скажем, розовый, зеленый и синий. Некоторые бары становятся розовыми, зелеными, синими снизу вверх, а некоторые идут зеленым, розовым, синим. Я не вижу никакой очевидной картины.

Как выбираются эти заказы? Как я могу его изменить? По крайней мере, как я могу заставить ggplot выбрать последовательный заказ?

Класс (x, y и категория) (целочисленный, числовой и коэффициент) соответственно. Если я сделаю категорию упорядоченным фактором, это не изменит это поведение.

Кто-нибудь знает, как это исправить?

Возпроизводимо пример:

dput(data) 

structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L, 
10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L, 
7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L, 
9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L, 
6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L, 
8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L, 
8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", 
"Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up" 
), class = c("ordered", "factor")), NG = c(222614.67, 9998.17, 
351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52, 
15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21, 
120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06, 
4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26, 
384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96, 
3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG" 
), row.names = c(NA, -40L), class = "data.frame") 

ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity") 
+2

воспроизводимый пример пожалуйста? –

+0

BTW: Брайан подтвердил, что это на самом деле (несколько давняя) ошибка. – joran

+0

Читайте осторожно - это поведение, к сожалению, несколько раз изменилось в новейшей истории ggplot2, и некоторые из примеров в ответах больше не работают. –

ответ

21

Необходимо также указать эстетику order.

ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+ 
    geom_bar(stat="identity") 

enter image description here

Это может или не может быть bug.

+2

Awesome. Это и есть. – Dave31415

4

Вы можете изменить цвет, используя scale_fill_ функции. Например:

ggplot(dd,aes(mon,NG,fill=gclass)) + 
    geom_bar(stat="identity") + 
    scale_fill_brewer(palette="blues") 

Чтобы получить последовательное упорядочение в bars, то вам необходимо заказать фрейм данных:

dd = dd[with(dd, order(gclass, -NG)), ] 

Для того, чтобы изменить порядок легенды, изменять gclass фактор. Так что-то вроде:

dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE)) 

enter image description here

+1

Это похоже на последовательный заказ на вас? У меня та же проблема, что и OP с его данными. Здесь происходит что-то рыбное. – joran

+0

@joran Ahh, я вижу проблему сейчас! – csgillespie

+0

@ Dave31415 Я думаю, что я ответил на вопрос, однако, мое понимание **, почему ** эта работа немного верна. – csgillespie

1

Чтобы сделать заказ, вы должны использовать параметр levels и сообщить порядок. Например:

data$gclass 
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order 
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity") 
38

Начиная с ggplot2_2.0.0, артикул order больше не доступен. Чтобы получить график со стеками, упорядоченными по цвету заливки, вы можете просто заказать набор данных с помощью переменной группировки, которую вы хотите заказать.

Я часто использую arrange от dplyr для этого. Здесь я заказываю набор данных по коэффициенту fill в вызове ggplot вместо создания упорядоченного набора данных, но либо будет работать нормально.

library(dplyr) 

ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) + 
    geom_bar(stat = "identity") 

Это легко сделать в базе R, конечно, с помощью классического order с экстрактом скобках:

ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) + 
    geom_bar(stat = "identity") 

С полученного участка в обоих случаях в настоящее время в нужном порядке: enter image description here

обновление ggplot2_2.2.0

В ggplot_2.2.0 порядок заполнения основан на порядке уровней факторов. Порядок по умолчанию будет отображать первый уровень на верхнем вершине стека вместо дна.

Если вы хотите первый уровень в нижней части стека, вы можете использовать reverse = TRUE в position_stack. Примечание. Вы также можете использовать geom_col как ярлык для geom_bar(stat = "identity").

ggplot(data, aes(mon, NG, fill = gclass)) + 
    geom_col(position = position_stack(reverse = TRUE)) 
+0

Это похоже на работу с stat = "identity", но с ошибкой geom_bar (stat = "summary", fun.y = median). В этом случае я должен был обобщить данные и использовать stat = «identity», чтобы получить соответствующий порядок. Я верю, что это новое, поскольку 2.0 –

+0

@ EtienneLow-Décarie Возможно, для этого является 'stat_summary_bin'. Вы пытались использовать 'stat =" summary_bin "' вместо 'stat =" summary "'? – aosmith

+0

Ух, это было очень неприятно. Может кто-нибудь прокомментировать, почему эстетика 'order' была удалена? Для справки: https://github.com/hadley/ggplot2/issues/1593 – fanli

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