2014-07-16 30 views
10

Tôi có một dataframe d:ggplot thay đếm với tỷ lệ phần trăm trong 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 

Rằng tôi đang âm mưu với:

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

Bằng cách này mỗi thanh tượng trưng cho tỷ lệ phần trăm của nó trên toàn bộ dữ liệu.

Thay vào đó, tôi muốn rằng mỗi thanh đại diện cho một tỷ lệ tương đối; tức là tổng thanh thu được với groupchange = k phải là 1.

Trả lời

20

Đầu tiên tóm tắt và chuyển đổi dữ liệu của bạn:

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

Sau đó, bạn có thể vẽ nó:

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) 

này cung cấp cho:

enter image description here


Ngoài ra, y ou có thể sử dụng chức năng percent từ gói 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) 

mang đến cho:

enter image description here

0

Nếu mục tiêu của bạn là hình dung trong mã tối thiểu, sử dụng position = "fill" như một cuộc tranh cãi trong geom_bar().

Nếu bạn muốn trong tỷ lệ phần trăm nhóm, @ Jaap's dplyr câu trả lời trả lời là cách để thực hiện.

Dưới đây là một ví dụ tái sản xuất bằng cách sử dụng dữ liệu trên để sao chép/dán:

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

Các vấn đề liên quan