Ответ 1
Вам нужно также указать эстетику order
.
ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
geom_bar(stat="identity")
Это может быть или не быть ошибка.
Я вызываю функцию ggplot
ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity")
В результате получается панель с барами, заполненными различными цветами, соответствующими категории. Однако порядок цветов не соответствует от бара до бара. Скажем, розовый, зеленый и синий. Некоторые бары становятся розовыми, зелеными, синими снизу вверх, а некоторые идут зеленым, розовым, синим. Я не вижу никакой очевидной картины.
Как выбираются эти упорядочения? Как я могу его изменить? По крайней мере, как я могу заставить ggplot выбрать последовательный порядок?
Класс (x, y и category) является (целым числом, числом и коэффициентом) соответственно. Если я сделаю категорию упорядоченным фактором, это не изменит это поведение.
Кто-нибудь знает, как это исправить?
Воспроизводимый пример:
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")
Вам нужно также указать эстетику order
.
ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
geom_bar(stat="identity")
Это может быть или не быть ошибка.
Начиная с 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")
С полученным графиком в обоих случаях теперь в нужном порядке:
Обновление 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))
Вы можете изменить цвет с помощью функций 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))
Чтобы заказать, вы должны использовать параметр 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")