2012-09-12 28 views
17

Tôi muốn tạo ra một hình ảnh mà trông giống như sau:R âm mưu thanh tỷ lệ xếp chồng lên nhau với tỷ lệ yếu tố nhị phân và nhãn (với ggplot)

enter image description here

bộ dữ liệu ban đầu của tôi trông giống như sau:

> bb[sample(nrow(bb), 20), ] 
     IMG QUANT FIX 
25663 1  1 0 
7936 2  2 0 
23586 3  2 0 
23017 2  2 1 
31363 1  3 1 
7886 2  2 0 
23819 3  3 1 
29838 2  2 1 
8169 2  3 1 
9870 2  3 0 
31440 2  1 0 
35564 3  1 0 
24066 1  2 0 
12020 3  2 0 
6742 3  2 0 
6189 2  3 0 
26692 2  3 0 
1387 3  2 0 
31839 2  3 1 
28637 3  2 0 

Vì vậy, ý tưởng là các thanh hiển thị nơi FIX = 1 mỗi yếu tố QUANT và mỗi yếu tố IMG.

tôi đã tổng hợp dữ liệu của tôi đặt vào tỷ lệ sử dụng plyr

library(plyr) 
bb.perc <- ddply(bb,.(QUANT,IMG),summarise,FIX.PROP = sum(FIX)/length(FIX)) 

gần điều đúng đắn:

QUANT IMG FIX.PROP 
1  1 1 0.52439024 
2  1 2 0.19085366 
3  1 3 0.13658537 
4  2 1 0.20414201 
5  2 2 0.53964497 
6  2 3 0.09585799 
7  3 1 0.29000000 
8  3 2 0.13000000 
9  3 3 0.40705882 

Nhưng bây giờ nếu tôi thực hiện một đồ thị, nó không tài khoản cho các trường hợp FIX==0, nghĩa là tất cả các thanh có cùng chiều cao, cụ thể là 100%, đó không phải là những gì tôi muốn. Lưu ý cách subframes Quant cá nhân không thêm lên đến 100%:

> sum(bb.perc[1:3,]$FIX.PROP) 
[1] 0.8518293 
> sum(bb.perc[4:6,]$FIX.PROP) 
[1] 0.839645 
> sum(bb.perc[7:9,]$FIX.PROP) 
[1] 0.8270588 

Điều tốt nhất tôi có thể làm với R là để hiển thị đếm:

# Take only the positive samples 
bb.pos <- bb[bb$FIX == 1,] 
# Plot the counts 
ggplot(bb,aes(factor(QUANT),fill=factor(IMG))) + geom_bar() + 
    scale_y_continous(labels=percent) 

Và kết quả trong: enter image description here Đây là cũng không phải những gì tôi muốn:

  • Tỷ lệ phần trăm là cách tắt. Tôi cần một cách để vượt qua điểm 100% đến hàm percent, nhưng tôi không biết làm cách nào.
  • Nó thiếu nhãn.

Có rất nhiều tương tự câu hỏi về SO đã có, nhưng tôi dường như thiếu khoản tiền phù hợp của thông tin tình báo (hoặc hiểu biết về R) để ngoại suy từ họ đến một giải pháp cho vấn đề cụ thể của tôi.

Cảm ơn mọi con trỏ!

EDIT: Sven Hohenstein cung cấp một câu trả lời đã có, nhưng đây là cách tôi đã kết thúc làm việc đó bản thân mình cũng như:

> ggplot(bb.perc,aes(x=factor(QUANT),y=FIX.PROP,label=paste(round(FIX.PROP*100), 
    "%"),fill=factor(IMG)))+ geom_bar(stat="identity") + geom_text(position="stack", 
    aes(ymax=1),vjust=5) + scale_y_continuous(labels = percent) 

Sử dụng bb.perc mà tôi định nghĩa hơn nữa bằng cách sử dụng plyr. Điều này có lợi thế rằng tỷ lệ phần trăm được tính cục bộ trên mỗi cột và không phải là trên toàn cầu.

Cảm ơn mọi người đã trợ giúp.Các đáng kể sau hai câu hỏi và tương ứng câu trả lời của họ đã giúp tôi trong việc đó đúng:

Stacked Bar Graph Labels with ggplot2

Adding labels to ggplot bar chart

Những gì tôi đã làm sai bước đầu, đã vượt qua các tham số position = "fill" để geom_bar(), mà vì một lý do làm cho tất cả các thanh có cùng chiều cao!

Trả lời

21

Đây là một cách để tạo ra cốt truyện:

ggplot(bb[bb$FIX == 1, ],aes(x = factor(QUANT), fill = factor(IMG), 
          y = (..count..)/sum(..count..))) + 
geom_bar() + 
stat_bin(geom = "text", 
      aes(label = paste(round((..count..)/sum(..count..)*100), "%")), 
      vjust = 5) + 
scale_y_continuous(labels = percent) 

Thay đổi giá trị của tham số vjust để điều chỉnh vị trí dọc của nhãn.

enter image description here

+0

Thật tuyệt vời, cảm ơn! Tôi thực sự đã có ngay bây giờ nhận được đến điểm mà tôi đã có cốt truyện chính xác là tốt, nhưng tôi đã sử dụng cách 'plyr' để làm điều đó. Tôi không biết nó có thể từ bên trong ggplot! –

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