按ggplot中的值之和排序条形图

tas*_*alk 4 r

示例数据:

player <- c("a", "b", "a", "b", "c", 
            "a", "a", "b", "c", "b", 
            "c", "a", "c", "c", "a")
is.winner <- c(TRUE, FALSE, TRUE, TRUE, TRUE, 
               FALSE, TRUE, TRUE, TRUE, FALSE, 
               TRUE, TRUE, TRUE, TRUE, FALSE)

df <- data.frame(player, is.winner)
Run Code Online (Sandbox Code Playgroud)

我的第一张图看起来像这样

在此输入图像描述

ggplot(data=df, aes(x=player, y=as.numeric(is.winner))) +
  geom_bar(stat="summary", fun.y=sum) + 
  coord_flip()
Run Code Online (Sandbox Code Playgroud)

我想要做的是将df $ player轴排序为"TR​​UE"值的总和,这样它看起来像这样:

在此输入图像描述

我意识到我可以使用这样的东西:

df$player <- factor(df$player, levels=c("b", "a", "c"))
Run Code Online (Sandbox Code Playgroud)

但实际数据中有更多"玩家名字".另外我想要与胜利百分比等类似的事情.所以自动排序会很棒.以下获胜百分比的示例

在此输入图像描述

df$is.winner <- factor(df$is.winner, levels=c("TRUE", "FALSE"))
df$player <- factor(df$player, levels=c("c", "b", "a"))

library(scales)
library(RColorBrewer)
ggplot(data=df, aes(x=player)) +
  geom_bar(aes(fill=is.winner),position='fill')+
  scale_y_continuous(labels=percent)+
  scale_fill_brewer(palette="Set2") +
  coord_flip()
Run Code Online (Sandbox Code Playgroud)

whi*_*ile 7

您可以使用reorder哪个函数根据某个谓词重新排序因子的级别.

ggplot(data=df, aes(x=reorder(player, is.winner, function(x){ sum(x) }), 
                    y=as.numeric(is.winner))) +
geom_bar(stat="summary", fun.y=sum) +
coord_flip()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

reorder(x, X, FUN) 需要

  • x,重新排序的因素.
  • X一个长度相同的矢量x.该向量将被拆分为每个级别的子集并传递给该函数FUN.
  • FUN应用于每个级别子集的函数.此函数应采用向量并返回将用于排序因子级别的标量.

在上一个示例中,您需要再次将向量转换为布尔值,以便能够对其进行求和:

df$is.winner <- factor(df$is.winner, levels=c("TRUE", "FALSE"))

ggplot(data=df, aes(x=reorder(player, df$is.winner=="TRUE", sum), fill=is.winner)) +
  geom_bar(position='fill') +
  scale_y_continuous(labels=percent) +
  scale_fill_brewer(palette="Set2") +
  xlab("player") + 
  coord_flip()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述