我要做一个柱状图,其中最大的柱状图离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轴,守门员条,最后是前锋条。
谢谢
如果图表列来自一个数值变量,如下面的数据框架所示,您可以使用一个更简单的解决方案:
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
当我发现这条线索时,这就是我一直在寻找的答案。希望对其他人有用。
另一种方法是使用重新排序来排列因子的级别。根据计数的升序(n)或降序(-n)。非常类似于使用forcats包中的fct_reorder:
降序排列
df %>%
count(Position) %>%
ggplot(aes(x = reorder(Position, -n), y = n)) +
geom_bar(stat = 'identity') +
xlab("Position")
升序排序
df % > %
数(位置)% > %
ggplot(aes(x = reorder(Position, n), y = n)) +
Geom_bar (stat = 'identity') +
xlab(“位置”)
数据帧:
df <- structure(list(Position = structure(c(3L, 3L, 1L, 1L, 1L, 2L), .Label = c("防御",
"前锋","Zoalkeeper"), class = "factor"), Name =结构(c(2L,
1 l, 3 l 5 l 4 l, 6 l), .Label = c(“弗兰克”,“詹姆斯”,“琼”,“约翰”,
"Steve", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA,
6 l))
我认为已经提供的解决方案过于冗长。使用ggplot进行频率排序barplot的一种更简洁的方法是
ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar()
它类似于Alex Brown的建议,但更简短,并且不需要任何函数定义。
更新
我认为我的旧解决方案在当时是好的,但现在我宁愿使用forcats::fct_infreq,它是按频率排序因子级别:
require(forcats)
ggplot(theTable, aes(fct_infreq(Position))) + geom_bar()