2012-06-04 30 views
6

Tôi muốn một âm mưu như thế này ngoại trừ rằng mỗi khía cạnh khía cạnh 100%. Ngay bây giờ nhóm M là 0,05 + 0,25 = 0,30 thay vì 0,20 + 0,80 = 1,00.ggplot: tần số tương đối của hai nhóm

df <- rbind(
    data.frame(gender=c(rep('M',5)), outcome=c(rep('1',4),'0')), 
    data.frame(gender=c(rep('F',10)), outcome=c(rep('1',7),rep('0',3))) 
) 

df 

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 

(Sử dụng y = ..density .. cho kết quả tồi tệ hơn.)

+0

Câu trả lời được cung cấp tại đây là phương pháp đúng. Phương thức .. mật độ .. được cung cấp trong nhiều câu trả lời khác, http://stackoverflow.com/questions/10064080/plot-relative-frequencies-with-dodged-bar-plots-in-ggplot2, http: // stackoverflow. com/questions/17368223/ggplot2-đa nhóm-biểu đồ-với-trong-tỷ lệ nhóm-thay vì tần số, http://stackoverflow.com/questions/3695497/ggplot-showing-instead-of-counts- các biểu đồ-of-categorical-variables mang lại các giá trị không chính xác cho các mức độ khác nhau. – russellpierce

Trả lời

9

Tôi thường làm điều này bằng cách đơn giản precalculating các giá trị bên ngoài của ggplot2 và sử dụng stat = "identity":

df1 <- melt(ddply(df,.(gender),function(x){prop.table(table(x$outcome))}),id.vars = 1) 

ggplot(df1, aes(x = variable,y = value)) + 
    facet_wrap(~gender, nrow=2, ncol=1) + 
    geom_bar(stat = "identity") 
+0

Điều này là chính xác. Tôi hy vọng cho một câu trả lời đơn giản hơn cho những gì có vẻ giống như một loại biểu đồ tương đối phổ biến. :) – Andrew

+0

@andrew - Tôi làm điều này * rất nhiều *. Nó là tương đối dễ dàng để làm cho riêng của bạn 'geom', và điều này sẽ là một bổ sung tuyệt vời để xây dựng trong các công cụ cho ggplot2. – Chase

+0

@Chúng tôi có thể sai, nhưng tôi nghĩ rằng nó sẽ mất nhiều hơn một geom mới bởi vì (tôi nghĩ) thẩm mỹ được ánh xạ tới các biến _before_ các faceting được thực hiện. Vì vậy, tôi nghĩ rằng đây có thể là một tính năng thiết kế cách ngược dòng của geom. – joran

16

đây là một cách khác

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = ..count../sapply(PANEL, FUN=function(x) sum(count[PANEL == x])))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 
+1

Thật là một điều thú vị! – joran

+0

Tôi thích cách này ngắn, nhưng khi tôi cố gắng chuyển từ khía cạnh sang vị trí = dodge, tổng chiều cao đến 100% trên tất cả các nhóm (thay vì trong nhóm) – Andrew

+0

Tôi ước mình có thể nâng cao hơn. – Eduardo

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