r - 如何以数字向量的降序显示 ggplot2 中的条形图?

标签 r ggplot2 rank

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 类别”,“查理类别”,而不是像坐标翻转时似乎发生的相反顺序,那就太好了

最佳答案

这个答案没有利用 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

enter image description here

根据@Michael Bellhouse 的评论进行编辑 - “看来 alpha 类别已排名,但不是 bravo 或 charlie”

当 'choices' 是一个字符时,在 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.

关于r - 如何以数字向量的降序显示 ggplot2 中的条形图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816024/

相关文章:

r - R 中 7 个条的条形图中的纹理?

r - 使用ggplot多线和居中对齐x轴标签

mysql - 如何使用 MySQL 从复杂查询中获取条目的位置?

r - 为什么 order(order(x)) 等于 R 中的 rank(x)?

r - dplyr 在 mutate() 中使用 select() 助手

r - geom_point 具有不同的填充和形状图例

r - 用ggplot2中的交互变量覆盖图例

r - 如何重新排序几何图形的叠加顺序,但在 ggplot 中保持图例顺序完整

r - 强制 ggplot 比例开始,例如第一年,第一个月等

MySQL连续数字问题: the order of count query matters?