df <- data.frame (Categories=c("Alpha Category", "Alpha Category",
"Alpha Category", "Bravo Category",
"Bravo Category", "Bravo Category",
"Charlie Category", "Charlie Category",
"Charlie Category"),
choices=c("alpha1", "alpha2", "alpha3", "bravo1",
"bravo2", "bravo3", "charlie1", "charlie2",
"charlie3") ,
ratings=c(20,60,40, 55,75,25,65,35,45))
df.plot <- ggplot(df, aes(Categories, ratings, fill = choices))
+ geom_bar(position="dodge", stat="identity")
+ coord_flip()
df.plot <- df.plot
+ theme_classic(base_size = 16, base_family = "")
+ scale_fill_brewer(palette="Paired")
df.plot <- df.plot
+ scale_y_continuous(breaks=seq(0,100,by=10),limits=c(0,80) )
+ ylab("Ratings")
+ theme(axis.text.y = element_text(size=16)) #change font size of y axis label
df.plot
最重要的是,我想按其“等级”的降序显示每个“类别”中的“选择”,例如,“查理类别”将显示charlie1,然后charlie3,然后charlie2。
老实说,我已经在网上寻找解决方案大约一个星期,但找不到它。我目前的想法是我应该将选择转换为因素,但是我还没有弄清楚如何正确地做到这一点。
次要重要的是,如果可以从上至下列出“类别”,“ Alpha类别”,“ Bravo类别”,“ Charlie类别”,而不是以相反的顺序列出,这似乎很好,被翻转
此答案未利用ggplot
中的可能性来转换变量和比例(请参阅@Metric的简洁答案),而是预先对变量进行转换。
在每个类别中,根据等级重新排序选择。检查“选择项”是否为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
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9NNEptQi5wbmcifQ==” alt =“在此处输入图像描述”>
根据@Michael Bellhouse的评论进行编辑-“看来alpha类别已排名,但不算勇敢或查理”
['choices'是一个字符时,在ddply
中生成和重新排序的因子级别基于'choices'的每个subset。哪个工作正常。另一方面,当“选择”是原始数据的一个因素时,其级别将基于数据中存在的所有级别。然后在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.
library(ggplot2)
df.plot <- ggplot(df, aes(x=Categories,y=reorder(choices,ratings), fill = choices)) +
geom_bar(position = "dodge", stat = "identity") + coord_flip() +
scale_x_discrete(limits = rev(levels(df$Categories)))
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8zbDAweS5qcGcifQ==” alt =“在此处输入图像描述”>