我要做一个柱状图,其中最大的柱状图离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轴,守门员条,最后是前锋条。
谢谢
如果不想使用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中完成的。
你只需要指定Position列为一个有序因子,其中级别是按它们的计数排序的:
theTable <- transform( theTable,
Position = ordered(Position, levels = names( sort(-table(Position)))))
(请注意,表(Position)产生了Position列的频率计数。)
然后,您的ggplot函数将以计数递减的顺序显示条形图。
我不知道在geom_bar中是否有一个选项可以在不显式地创建有序因子的情况下做到这一点。