2011-01-18 18 views
29

làm các khía cạnh trong ggplot Tôi thường muốn phần trăm được sử dụng thay vì đếm.phần trăm trên phòng thí nghiệm y trong một barchart ggplot mặt?

ví dụ:

test1 <- sample(letters[1:2], 100, replace=T) 
test2 <- sample(letters[3:8], 100, replace=T) 
test <- data.frame(cbind(test1,test2)) 
ggplot(test, aes(test2))+geom_bar()+facet_grid(~test1) 

này là rất dễ dàng nhưng nếu N là khác nhau ở khía cạnh Một khía cạnh so với B, nó sẽ là tốt hơn tôi nghĩ, để so sánh tỷ lệ phần trăm, theo một cách như vậy mà mỗi khía cạnh tiền đến 100%.

bạn sẽ đạt được điều này như thế nào?

Hy vọng câu hỏi của tôi có ý nghĩa.

Trân trọng.

Trả lời

20

Hãy thử điều này:

# first make a dataframe with frequencies 
df <- as.data.frame(with(test, table(test1,test2))) 
# or with count() from plyr package as Hadley suggested 
df <- count(test, vars=c('test1', 'test2')) 
# next: compute percentages per group 
df <- ddply(df, .(test1), transform, p = Freq/sum(Freq)) 
# and plot 
ggplot(df, aes(test2, p))+geom_bar()+facet_grid(~test1) 

alt text

Bạn cũng có thể thêm + scale_y_continuous(formatter = "percent") vào ô cho ggplot2 vers ion 0.8.9 hoặc + scale_y_continuous(labels = percent_format()) cho phiên bản 0.9.0.

+0

Đây là giải pháp tốt hơn nhiều. +1 – Chase

+0

Thats thực sự tốt - cảm ơn rất nhiều! :-D – Andreas

+0

@Chase và @Andreas: cảm ơn bạn! Tôi vừa đăng một phương thức đơn giản hơn (và tôi nghĩ: đẹp hơn) dựa trên câu hỏi này: http://stackoverflow.com/q/3695497/564164 – daroczig

1

Đây là giải pháp giúp bạn di chuyển đúng hướng. Tôi tò mò muốn xem liệu có cách nào hiệu quả hơn để thực hiện điều này vì điều này có vẻ hơi khó hiểu và phức tạp. Chúng tôi có thể sử dụng đối số được xây dựng trong đối số ..density.. cho số y aesthetic, nhưng các yếu tố không hoạt động ở đó. Vì vậy, chúng tôi cũng cần sử dụng scale_x_discrete để gắn nhãn trục một cách thích hợp khi chúng tôi đã chuyển đổi test2 thành đối tượng số.

ggplot(data = test, aes(x = as.numeric(test2)))+ 
geom_bar(aes(y = ..density..), binwidth = .5)+ 
scale_x_discrete(limits = sort(unique(test$test2))) + 
facet_grid(~test1) + xlab("Test 2") + ylab("Density") 

Nhưng hãy trao đổi và cho tôi biết suy nghĩ của bạn.

Ngoài ra, bạn có thể rút ngắn tạo dữ liệu thử nghiệm của bạn như vậy, mà tránh các đối tượng bổ sung trong môi trường của bạn và phải cbind chúng lại với nhau:

test <- data.frame(
    test1 = sample(letters[1:2], 100, replace = TRUE), 
    test2 = sample(letters[3:8], 100, replace = TRUE) 
) 
+1

vâng một chút phức tạp - nhưng vẫn cảm ơn - tốt hơn sau đó những gì tôi đã có :-) Tôi không biết nếu điều này nên là một tính năng của ggplot. Tôi có thể tưởng tượng nhiều tình huống mà nó sẽ tốt hơn sau đó đếm số lượng. Mặt khác - nó có thể là tốt nhất để giữ cho dữ liệu mungering af đồ họa riêng biệt :-) – Andreas

+0

Mật độ không giống như tỷ lệ phần trăm. – russellpierce

6

Một cách rất đơn giản:

ggplot(test, aes(test2)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_grid(~test1) 

Vì vậy, tôi chỉ thay đổi các tham số của geom_bar để aes(y = (..count..)/sum(..count..)). Sau khi thiết lập ylab để NULL và xác định định dạng, bạn có thể nhận được:

ggplot(test, aes(test2)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_grid(~test1) + 
    scale_y_continuous('', formatter="percent") 

Cập nhật Lưu ý rằng trong khi formatter = "percent") công trình cho ggplot2 phiên bản 0.8.9, 0.9.0 tại bạn muốn một cái gì đó như scale_y_continuous(labels = percent_format()). alt text

+0

ghezus - Tôi thực sự nghĩ rằng ai đó trên SO đã trả lời câu hỏi này cho tôi trước đây. Phức tạp cho tôi - hy vọng điều này sẽ xuất hiện trong tìm kiếm kể từ bây giờ. Cảm ơn một lần nữa. – Andreas

+4

thực sự là scale_y_continuous (nhãn = phần trăm) (sử dụng gói cân) – dickoa

+0

ai đó có thể giúp tôi hiểu ý nghĩa của .. trong câu lệnh trên (..count ..)/sum (.. count ..) ?? – Abhi

0

Tôi xử lý các tình huống tương tự khá thường xuyên, nhưng có cách tiếp cận rất khác sử dụng hai gói khác của Hadley, cụ thể là định hình lại và plyr. Chủ yếu là bởi vì tôi có một sở thích để xem xét những thứ như 100% thanh xếp chồng lên nhau (khi họ tổng số đến 100%).

test <- data.frame(sample(letters[1:2], 100, replace=T), sample(letters[3:8], 100, replace=T)) 
colnames(test) <- c("variable","value") 
test <- cast(test, variable + value ~ .) 
colnames(test)[3] <- "frequ" 

test <- ddply(test,"variable", function(x) { 
    x <- x[order(x$value),] 
    x$cfreq <- cumsum(x$frequ)/sum(x$frequ) 
    x$pos <- (c(0,x$cfreq[-nrow(x)])+x$cfreq)/2 
    x$freq <- (x$frequ)/sum(x$frequ) 
    x 
}) 

plot.tmp <- ggplot(test, aes(variable,frequ, fill=value)) + geom_bar(stat="identity", position="fill") + coord_flip() + scale_y_continuous("", formatter="percent") 
43

Đây là một trong ggplot phương pháp, sử dụng ..count....PANEL..:

ggplot(test, aes(test2)) + 
    geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])) + 
    facet_grid(~test1) 

Vì đây được tính toán một cách nhanh chóng, nó phải là mạnh mẽ để thay đổi để vẽ thông số.

+0

Đây là một cách tiếp cận tuyệt vời. Bạn có nghĩ rằng việc thêm nhãn phần trăm vào mỗi thanh có thể thêm vào 100% trong mỗi khía cạnh không? – marbel

+0

@ MartínBel Có vẻ như 'geom_text' không hoạt động với các biến được tính toán. Bạn có thể muốn đăng dưới dạng câu hỏi riêng. – James

+2

Chắc chắn. Đây là [câu hỏi] (http://stackoverflow.com/questions/20600900/r-faceted-bar-chart-with-percentages-labels-independent-for-each-plot) Tôi để nó ở đây để tham khảo trong tương lai. – marbel

0

Cảm ơn bạn đã chia sẻ "mẹo" PANEL trên phương thức ggplot.

Để biết thông tin: bạn có thể tạo ra tỷ lệ phần trăm trong y lab, trên biểu đồ thanh tương tự, bằng cách sử dụng countgroup trong ggplot phương pháp:

ggplot(test, aes(test2,fill=test1)) 
    + geom_bar(aes(y = (..count..)/tapply(..count..,..group..,sum)[..group..]), position="dodge") 
    + scale_y_continuous(labels = percent) 
+0

Trong khi những người khác có thể cảm thấy rằng điều này có lẽ phù hợp hơn với nhận xét và không phải là câu trả lời, tôi đã trả lời câu trả lời này +1 vì nó đã giúp tôi giải quyết vấn đề tôi đang gặp và muốn cảm ơn Lilly đã đăng bài này. – paleo13

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