如何对仅含单个变量的ggplot条形图进行排序?
解决ggplot单变量条形图排序问题
我明白你现在的困扰——当只有一个分类变量作为x轴(这里是color),同时用fill映射另一个分类变量(cut)时,直接用reorder(color, fill=cut)确实行不通,因为reorder()需要的是数值型的排序依据,而不是分类变量。下面给你几个实用的解决办法,结合你的代码来调整:
方法1:按每个color的总计数排序
如果想让条形按color对应的钻石总数从高到低(或低到高)排列,可以利用geom_bar()默认计算的计数统计量..count..,搭配reorder()实现:
cbp2 <- c("#44bcd8", "#b97455", "#042f66", "#1c100b", "#ff3300", "#006600", "#660033", "#660066","#ffcc00","#99ff99","#669999") ggplot(data = diamonds)+ geom_bar(mapping = aes(x = reorder(color, ..count.., FUN = sum), fill = cut))+ theme(aspect.ratio = 1) + scale_fill_manual(values = cbp2)+ labs(x = NULL, y = NULL)+ coord_flip()
FUN=sum是对每个color下所有cut的计数求和,作为排序依据;- 想反转排序顺序的话,给
..count..加负号:reorder(color, -..count.., FUN=sum)。
方法2:按某个特定cut类别的计数排序
如果你想按某类特定cut(比如"Premium")的数量来排序color,可以先计算对应统计量,再用它做排序依据:
# 先计算每个color下Premium cut的数量 diamonds_summary <- diamonds %>% group_by(color) %>% summarise(premium_count = sum(cut == "Premium")) # 用统计量排序 ggplot(data = diamonds)+ geom_bar(mapping = aes(x = reorder(color, -premium_count, data = diamonds_summary), fill = cut))+ theme(aspect.ratio = 1) + scale_fill_manual(values = cbp2)+ labs(x = NULL, y = NULL)+ coord_flip()
data=diamonds_summary用来告诉reorder()去哪里找排序用的数值;- 去掉负号就能改成从低到高排序。
方法3:手动指定自定义顺序
如果想完全按自己的需求定义color的顺序,直接把color转成带指定levels的因子即可:
# 自定义你想要的颜色顺序(示例为钻石颜色从优到劣的顺序) custom_order <- c("D", "E", "F", "G", "H", "I", "J") ggplot(data = diamonds)+ geom_bar(mapping = aes(x = factor(color, levels = custom_order), fill = cut))+ theme(aspect.ratio = 1) + scale_fill_manual(values = cbp2)+ labs(x = NULL, y = NULL)+ coord_flip()
为什么你之前的方法无效?
你尝试的reorder(color, fill=cut)里,fill=cut是把分类变量cut作为排序参数,但reorder()的第二个参数必须是数值向量(用来计算每个x类别的排序权重),分类变量无法直接提供排序依据,所以才会失效。
内容的提问来源于stack exchange,提问作者aqkhan
相关产品推荐
相关产品推荐

