2013-07-15 62 views
5

Làm thế nào tôi có thể vẽ tỷ lệ tương đối của hai nhóm bằng cách sử dụng tính thẩm mỹ trong ggplot2?Làm thế nào tôi có thể vẽ tỷ lệ tương đối của hai nhóm bằng cách sử dụng tính thẩm mỹ trong ggplot2?

Tôi hỏi câu hỏi này ở đây vì một vài câu trả lời khác về chủ đề này có vẻ không chính xác (ex1, ex2, và ex3), nhưng Hội Chữ thập Validated dường như có thắc mắc về mặt chức năng cấm R cụ thể (CV meta). ..density.. liên quan đến khái niệm, nhưng khác với tỷ lệ (ex4ex5). Vì vậy, câu trả lời đúng dường như không liên quan đến mật độ.

Ví dụ:

set.seed(1200) 
test <- data.frame(
    test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]), 
    test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8]) 
) 
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge") 
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138 
counts <- with(test,table(test1,test2)) 
counts/matrix(rowSums(counts),nrow=2,ncol=6) 

Câu trả lời mà dường như mang lại một kết quả đó là correct khu nghỉ mát đến một giải pháp mà không sử dụng ggplot2 (tính nó ngoài ggplot2) hoặc yêu cầu một bảng điều khiển được sử dụng chứ không phải là một thẩm mỹ điền.

Chỉnh sửa: Đưa vào sản lượng stat_bin mà hàm cuối cùng được gọi là bin, nhưng chỉ được chuyển qua giá trị trong aes x. Nếu không viết lại stat_bin (hoặc thực hiện một stat_) thì hack đã được áp dụng trong câu trả lời được tham chiếu ở trên có thể được tổng quát thành aes khi không có nhóm ae với mã sau cho a aes: y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x])). Điều này chỉ thay thế PANEL (cột ẩn hiện tại cuối StatBin) với điền). Có lẽ các biến ẩn khác có thể nhận được sự đối xử tương tự.

+0

Làm thế nào điều này không khái quát đối với trường hợp tôi có, tiếng nói, một âm mưu chia thành các nhóm và sau đó sắc cạnh thành bảng? – RoyalTS

+0

@RoyalTS: Tôi tin rằng cùng một vấn đề được áp dụng vì vấn đề là không có (hoặc không ít nhất) một hàm stat_ thích hợp trong ggplot2. Tôi đã viết một giải pháp dự thảo hoạt động như một trình đơn thả xuống với ggplot2 ... nhưng tôi không chắc chắn về độ rắn của nó, vì vậy tôi đã không đăng nó. – russellpierce

Trả lời

5

Đây là một hack aweful, nhưng có vẻ như để làm những gì bạn muốn ...

ggplot(test, aes(test2)) + geom_bar(aes(y = ..count../rep(c(sum(..count..[1:6]), sum(..count..[7:12])), each=6), 
            group=test1, fill=test1) ,position="dodge") + 
             scale_y_continuous(name="proportion") 
+4

+1 mặc dù nó là một hack khủng khiếp. Làm cách nào bạn xác định cấu trúc dữ liệu cơ bản của ..count .. để tìm ra điều này? Biết rằng đó là chìa khóa để đến với bất cứ thứ gì trông giống như một giải pháp chung. – russellpierce