2014-07-16 12 views
10

Ho un dataframe d:ggplot sostituire il conte con percentuale geom_bar

> head(d,20) 
    groupchange Symscore3 
1   4   1 
2   4   2 
3   4   1 
4   4   2 
5   5   0 
6   5   0 
7   5   0 
8   4   0 
9   2   2 
10   5   0 
11   5   0 
12   5   1 
13   5   0 
14   4   1 
15   5   1 
16   1   0 
17   4   0 
18   1   1 
19   5   0 
20   4   0 

Che sto tramando con:

ggplot(d, aes(groupchange, y=..count../sum(..count..), fill=Symscore3)) + 
    geom_bar(position = "dodge") 

In questo modo ogni barra rappresenta la percentuale su tutti i dati.

Invece vorrei che ogni barra rappresentasse una percentuale relativa; vale a dire la somma della barra ottenuta con groupchange = k deve essere 1.

risposta

20

Prima riassumere e trasformare i dati:

library(dplyr) 
d2 <- d %>% 
    group_by(groupchange,Symscore3) %>% 
    summarise(count=n()) %>% 
    mutate(perc=count/sum(count)) 

Quindi è possibile tracciarla:

ggplot(d2, aes(x = factor(groupchange), y = perc*100, fill = factor(Symscore3))) + 
    geom_bar(stat="identity", width = 0.7) + 
    labs(x = "Groupchange", y = "percent", fill = "Symscore") + 
    theme_minimal(base_size = 14) 

questo dà:

enter image description here


In alternativa, y ou possibile utilizzare la funzione percent dal pacchetto scales:

brks <- c(0, 0.25, 0.5, 0.75, 1) 

ggplot(d2, aes(x = factor(groupchange), y = perc, fill = factor(Symscore3))) + 
    geom_bar(stat="identity", width = 0.7) + 
    scale_y_continuous(breaks = brks, labels = scales::percent(brks)) + 
    labs(x = "Groupchange", y = NULL, fill = "Symscore") + 
    theme_minimal(base_size = 14) 

che dà:

enter image description here

0

Se il vostro obiettivo è la visualizzazione in codice minimo, utilizzare position = "fill" come argomento in geom_bar().

Se si desidera all'interno di percentuali di gruppo, la risposta di risposta di @ Jaap dplyr è la strada da seguire.

Ecco un esempio riproducibile utilizzando il set di dati di cui sopra per copiare/incollare:

library(tidyverse) 

d <- data_frame(groupchange = c(4,4,4,4,5,5,5,4,2,5,5,5,5,4,5,1,4,1,5,4), 
       Symscore3 = c(1,2,1,2,0,0,0,0,2,0,0,1,0,1,1,0,0,1,1,0)) 

ggplot(d, aes(x = factor(groupchange), fill = factor(Symscore3))) + 
    geom_bar(position="fill") 

enter image description here

Problemi correlati