我要做一个柱状图,其中最大的柱状图离y轴最近,最短的柱状图离y轴最远。这有点像我的表格

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

所以我试图建立一个条形图,根据位置显示球员的数量

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

但是图表显示的是门将栏,然后是防守栏,最后是前锋栏。我希望图表的顺序是,防守条最靠近y轴,守门员条,最后是前锋条。 谢谢


当前回答

你只需要指定Position列为一个有序因子,其中级别是按它们的计数排序的:

theTable <- transform( theTable,
       Position = ordered(Position, levels = names( sort(-table(Position)))))

(请注意,表(Position)产生了Position列的频率计数。)

然后,您的ggplot函数将以计数递减的顺序显示条形图。 我不知道在geom_bar中是否有一个选项可以在不显式地创建有序因子的情况下做到这一点。

其他回答

你只需要指定Position列为一个有序因子,其中级别是按它们的计数排序的:

theTable <- transform( theTable,
       Position = ordered(Position, levels = names( sort(-table(Position)))))

(请注意,表(Position)产生了Position列的频率计数。)

然后,您的ggplot函数将以计数递减的顺序显示条形图。 我不知道在geom_bar中是否有一个选项可以在不显式地创建有序因子的情况下做到这一点。

如果不想使用ggplot2,还有一个ggpubr,它为ggbarplot函数提供了一个非常有用的参数。你可以对条形图进行排序。Val在“desc”和“asc”中是这样的:

library(dplyr)
library(ggpubr)
# desc
df %>%
  count(Position) %>%
  ggbarplot(x = "Position", 
            y = "n",
            sort.val = "desc")

# asc
df %>%
  count(Position) %>%
  ggbarplot(x = "Position", 
            y = "n",
            sort.val = "asc")

由reprex包于2022-08-14创建(v2.0.1)

如您所见,对条形进行排序非常简单。如果条形图是分组的,也可以这样做。查看上面的链接,获取一些有用的例子。

我同意zach的观点,在dplyr内计数是最好的解决方案。我发现这是最短的版本:

dplyr::count(theTable, Position) %>%
          arrange(-n) %>%
          mutate(Position = factor(Position, Position)) %>%
          ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")

这也将比事先重新排序因子级别快得多,因为计数是在dplyr中完成的,而不是在ggplot或使用table中完成的。

如果图表列来自一个数值变量,如下面的数据框架所示,您可以使用一个更简单的解决方案:

ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) 
+ geom_bar(stat = "identity")  

排序变量(-Qty)前面的负号控制排序方向(升序/降序)

以下是一些用于测试的数据:

df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"),  
                 Qty = c(7,4,5,1,3,6)
                )

**Sample data:**
  Colors Qty
1  Green   7
2 Yellow   4
3   Blue   5
4    Red   1
5 Yellow   3
6   Blue   6

当我发现这条线索时,这就是我一直在寻找的答案。希望对其他人有用。

排序的关键是按照您想要的顺序设置因子的级别。不需要有序因子;一个有序因子中的额外信息是不必要的,如果这些数据被用于任何统计模型中,可能会导致错误的参数化——多项式对比不适用于这样的名义数据。

## set the levels in order we want
theTable <- within(theTable, 
                   Position <- factor(Position, 
                                      levels=names(sort(table(Position), 
                                                        decreasing=TRUE))))
## plot
ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)

在最一般的意义上,我们只需要将因子级别设置为所需的顺序。如果不指定,因子的级别将按字母顺序排序。您还可以如上所述在因子调用中指定级别顺序,也可以采用其他方法。

theTable$Position <- factor(theTable$Position, levels = c(...))