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

时间:2015-11-09 16:13:23

标签: 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)

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

enter image description here

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

我想要做的是将df $ player轴排序为&#34; TRUE&#34;值,使它看起来像这样:

enter image description here

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

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

但实际数据中有更多的玩家名称&#39;。另外我想要与胜利百分比等类似的事情。所以自动排序会很棒。胜率百分比低于

的示例

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 个答案:

答案 0 :(得分: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()

enter image description here

reorder(x, X, FUN)需要

  • x,重新排序的因素。
  • Xx长度相同的向量。该向量将被拆分为每个级别的子集,并传递给函数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()

enter image description here