2011-02-17 39 views
20

Câu hỏi này là sự tiếp nối của question trước đó tôi đã hỏi.Bắt một ô khu vực xếp chồng lên nhau trong R

Bây giờ tôi có một trường hợp đó cũng là một cột loại với Prop. Vì vậy, các bộ dữ liệu trở nên như

Hour Category  Prop2 

00  A   25 
00  B   59 
00  A   55 
00  C   5 
00  B   50 
... 
01  C   56 
01  B   45 
01  A   56 
01  B   35 
... 
23  D   58 
23  A   52 
23  B   50 
23  B   35 
23  B   15 

Trong trường hợp này tôi cần phải thực hiện một âm mưu khu vực xếp chồng lên nhau trong R với tỷ lệ phần trăm của những các danh mục khác nhau cho mỗi ngày. Vì vậy, kết quả sẽ như thế nào.

 A   B  C  D 
00  20%  30%  35%  15% 
01  25%  10%  40%  25% 
02  20%  40%  10%  30% 
. 
. 
. 
20 
21 
22  25%  10%  30%  35% 
23  35%  20%  20%  25% 

Vì vậy, bây giờ tôi sẽ nhận được cổ phần của từng loại trong mỗi giờ và sau đó âm mưu này là một âm mưu khu vực xếp chồng lên nhau như thế này mà trục x là giờ và trục y tỷ lệ Prop2 cho mỗi thể loại đưa ra bởi các màu sắc khác nhau this

+1

tôi muốn nói đây là thay vì một trường hợp tài sản (197) ... ;-) –

Trả lời

7

Bạn có thể sử dụng stackpoly từ gói plotrix:

library(plotrix) 
#create proportions table 
pdat <- prop.table(xtabs(Prop2~Hour+Category,Dat),margin=1) 
#draw chart 
stackpoly(pdat,stack=T,xaxlab=rownames(pdat)) 
#add legend 
legend(1,colnames(pdat),bg="#ffffff55",fill=rainbow(dim(pdat)[2])) 
+0

Điều này dường như làm việc và mang lại cho tôi những âm mưu ngăn xếp, nhưng không có huyền thoại để nói ngăn xếp màu nào đại diện cho Danh mục nào? – sfactor

+0

Trước tiên, bạn cần phân loại các danh mục của mình để bạn biết được danh mục nào và sau đó tạo chú thích của riêng bạn bằng lệnh chú giải(). – John

+0

@sfactor Đã thêm chú thích mẫu, đọc '? Legend' để biết thêm chi tiết về cách thức hoạt động này – James

26

Bạn có thể sử dụng gói ggplot2 từ Hadley Wickham cho điều đó.

R> library(ggplot2) 

Một bộ dữ liệu ví dụ:

R> d <- data.frame(t=rep(0:23,each=4),var=rep(LETTERS[1:4],4),val=round(runif(4*24,0,50))) 
R> head(d,10) 
    t var val 
1 0 A 1 
2 0 B 45 
3 0 C 6 
4 0 D 14 
5 1 A 35 
6 1 B 21 
7 1 C 13 
8 1 D 22 
9 2 A 20 
10 2 B 44 

Và sau đó bạn có thể sử dụng ggplot với geom_area:

R> ggplot(d, aes(x=t,y=val,group=var,fill=var)) + geom_area(position="fill") 

enter image description here

+0

cảm ơn nhưng về chia sẻ (phần trăm hoặc tỷ lệ) của từng danh mục cho mỗi giờ từ bảng ban đầu sang biểu mẫu bạn hiển thị trong tập dữ liệu 'd' ở đây? – sfactor

+0

Rất tiếc, tôi không thấy câu hỏi này từ câu hỏi của bạn. Trong thực tế, tôi nghĩ rằng 'ggplot2' có thể làm điều đó cho bạn: Tôi đã chỉnh sửa bài đăng của mình để chỉ cách thực hiện. – juba

+0

xin lỗi để làm phiền một lần nữa bạn vẫn làm cho một đơn giản hóa liên quan đến dữ liệu, trong hình thức ban đầu có sự lặp lại của Thể loại cho mỗi giờ. Vì vậy, có thể có nhiều hàng của Danh mục A trong giờ 0, vậy làm cách nào để tổng hợp từng danh mục này cho mỗi giờ trước để đưa nó vào biểu mẫu mà bạn đã hiển thị ở đây? – sfactor

-2

Nếu bạn muốn tận biên giới xa bạn có thể sử dụng scale_x_discretecoord_cartesian cách này

p <- ggplot(d, aes(x=Date,y=Volume,group=Platform,fill=Platform)) + geom_area(position="fill") 
base_size <- 9 
p + theme_set(theme_bw(base_size=9)) + scale_x_discrete(expand = c(0, 0)) + coord_cartesian(ylim=c(0,1)) 
+0

Đối với tôi, điều này sẽ chồng lên toàn bộ đồ thị để chiếm một phần nhỏ của khu vực ô bên phải. –

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