示例数据:
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轴排序为"TRUE"值的总和,这样它看起来像这样:
我意识到我可以使用这样的东西:
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)
您可以使用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)