按照 ggplot 中数值总和排序条形图

6

示例数据:

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)

我的第一个图表大致长这样

enter image description here

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

我希望做的是按照“TRUE”值的总和对df$player轴进行排序,使其看起来像这样:

enter image description here

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

df$player <- factor(df$player, levels=c("b", "a", "c"))

但实际数据中有更多的“玩家名称”。此外,我希望对胜率等内容进行类似处理。因此,自动排序将非常有用。以下是胜率示例。

enter image description here

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()
1个回答

12

您可以使用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()

enter image description here

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()

输入图像描述


谢谢,这正是我一直在寻找的。之前在几次搜索中看到了“重新排序”,但直到现在才真正满意。 - tastycanofmalk
我在上面的重新排序语句中遇到了一些问题:x=reorder(player, df$is.winner=="TRUE", sum),因为总胜利次数并不一定意味着更高的胜率。这个问题有简单的解决方案吗? - tastycanofmalk
1
把“sum”改成“mean”。 - while

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