2015-11-09 6 views
2

пример данных:рода гистограмма по сумме значений в ggplot

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 на сумму значений «TRUE», так что это выглядит примерно так:

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

ответ

3

Вы можете использовать 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() 

enter image description here

+0

Благодаря это именно то, что я искал. Если бы увидели переупорядочивание в нескольких поисках, но до сих пор это не знак. – user3564760

+0

У меня возникла проблема с вышеперечисленным выражением: 'x = reorder (player, df $ is.winner ==" TRUE ", sum', поскольку общее количество выигрышей не обязательно означает больший процент выигрыша Есть ли простое решение? – user3564760

+1

да, измените 'sum' на' mean' – while

Смежные вопросы