Ответ 1
Этот ответ не использует возможности в ggplot
для преобразования переменных и масштабов (см. @Чистый ответ в сетке), но вместо этого переменные заранее преобразуются.
В пределах каждой категории переупорядочивайте выбор, основываясь на рейтингах. Убедитесь, что "выбор" - это character
. Если это factor
, вы должны преобразовать его в символ с помощью as.character
, потому что переупорядочение с фактором в качестве входных данных не дает нам того, что мы хотим (см. Ниже).
str(df$choices)
# chr [1:9] "alpha1" "alpha2" "alpha3" ...
library(plyr)
df <- ddply(.data = df, .variables = .(Categories), mutate,
choices = reorder(choices, ratings))
Обратные уровни "Категории"
df$Categories <- as.factor(df$Categories)
levels(df$Categories) <- rev(levels(df$Categories))
земля
df.plot <- ggplot(df, aes(x = Categories, y = ratings, fill = choices)) +
geom_bar(position = "dodge", stat = "identity") +
coord_flip() +
theme_classic(base_size = 16, base_family = "") +
scale_fill_brewer(palette = "Paired") +
scale_y_continuous(breaks = seq(0, 100, by = 10), limits = c(0, 80)) +
ylab("Ratings") +
theme(axis.text.y = element_text(size = 16))
df.plot
Изменить комментарий к комментарию от @Michael Bellhouse - "похоже, что альфа-категория ранжирована, но не bravo или charlie"
Когда "выбор" является символом, уровни факторов, которые генерируются и переупорядочиваются в ddply
, основываются на каждом подмножестве "вариантов". Что хорошо работает. С другой стороны, когда "выбор" является фактором исходных данных, его уровни основаны на всех уровнях, присутствующих в данных. В ddply
подмножество уровней "выбор" затем переупорядочивается, но переупорядочение происходит в пределах полного набора уровней. Это приводит к трем наборам конфликтных уровней и используется только первый.
# reorder character version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
choices.ro = reorder(choices, ratings))
# check levels
lapply(ll, function(x) levels(x$choices.ro))
# $`Alpha Category`
# [1] "alpha1" "alpha3" "alpha2"
#
# $`Bravo Category`
# [1] "bravo3" "bravo1" "bravo2"
#
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1"
# choices as factor
df$choices.fac <- as.factor(df$choices)
levels(df$choices.fac)
# [1] "alpha1" "alpha2" "alpha3" "bravo1" "bravo2" "bravo3" "charlie1" "charlie2"
# [9] "charlie3"
# reorder factor version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
choices.fac.ro = reorder(choices.fac, ratings))
# reordering takes place _within_ each Category, but on the _full set_ of levels
# $`Alpha Category`
# [1] "alpha1" "alpha3" "alpha2" "bravo1" "bravo2" "bravo3" "charlie1" "charlie2"
# [9] "charlie3"
# This set of levels will be used in ggplot if you start with choices as a factor.
# Hence @Michael Bellhouse comment: "alpha category is ranked but not bravo or charlie"
# $`Bravo Category`
# [1] "bravo3" "bravo1" "bravo2" "alpha1" "alpha2" "alpha3" "charlie1" "charlie2"
# [9] "charlie3"
#
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1" "alpha1" "alpha2" "alpha3" "bravo1" "bravo2"
# [9] "bravo3"
# Because a factor only can have one set of levels,
# the first set is used - $`Alpha Category`
# Thus, relordered within category Alpha only.