ggplot中条形图的排序

51

我已经查看了这个论坛中的答案,但似乎找不到针对这个具体问题的答案。我有以下数据,并希望创建一个条形图,其中条形按“值”从大到小排序,而不是按字母顺序排序:

breadth_data <- read.table(textConnection("Stakeholder  Value
'Grantseekers'  0.90
'Donors'    0.89
'Community' 0.55
'Hurricane Relief Fund' 0.24
'Media' 0.19
'Employment Seekers'    0.12
'Affiliates'    0.10
'Youth' 0.09
'Women' 0.02
'Former Board Members'  0.01"), header=TRUE)

然后是基本条形图:

c <- ggplot(breadth_data, aes(x=Stakeholder, y=Value))
c + geom_bar(stat="identity") + coord_flip() + scale_y_continuous('') + scale_x_discrete('')

我已经尝试了许多在StackOverflow上看到的不同重新排序和转换方法,但似乎找不到可行的方法。我相信这可能相当简单,但我会非常感激任何帮助!

谢谢,

Greg

2个回答

71

你想要函数 reorder()

breadth_data <- transform(breadth_data, 
                          Stakeholder = reorder(Stakeholder, Value))

这将给出以下结果:

重新排序的条形图

如果你想让它们反过来,一个简单的方法就是在reorder()调用内部对Value使用order()

breadth_data <- transform(breadth_data,
                          Stakeholder = reorder(Stakeholder, 
                                                order(Value, decreasing = TRUE)))

8
在调用reorder时,可以使用-Value来改变排序方向。 - Richie Cotton
@Richie - 当然(扇自己一巴掌!)- 下午显然没想清楚! - Gavin Simpson
1
我也使用1/Value来按相反的顺序重新排序。它奏效了! :-) - George D Girton

0
另一个选择可能是使用fct_reorder函数,它来自forcats包。这里有一个可重现的例子:
library(ggplot2)
library(forcats)
ggplot(breadth_data, aes(x=fct_reorder(Stakeholder, Value), y=Value)) +
  geom_bar(stat="identity") + 
  coord_flip() + 
  scale_y_continuous('') + 
  scale_x_discrete('')

使用fct_rev来反转顺序:
# Reverse order
ggplot(breadth_data, aes(x=fct_rev(fct_reorder(Stakeholder, Value)), y=Value)) +
  geom_bar(stat="identity") + 
  coord_flip() + 
  scale_y_continuous('') + 
  scale_x_discrete('')

使用reprex v2.0.2于2022年10月28日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接