2012-03-05 35 views
43

Tôi có một data.frame như thế này:Tạo barplot xếp chồng lên nhau trong đó mỗi ngăn xếp được thu nhỏ để tổng hợp đến 100%

df <- read.csv(text = "ONE,TWO,THREE 
         23,234,324 
         34,534,12 
         56,324,124 
         34,234,124 
         123,534,654") 

Tôi muốn tạo ra một âm mưu thanh phần trăm mà trông như thế này (thực hiện trong LibreOffice Calc) : enter image description here

Do đó, các thanh phải được standarized nên tất cả các ngăn xếp đều có cùng chiều cao và tổng cộng tới 100%. Cho đến nay tất cả những gì tôi có thể nhận được là một thanh xếp chồng lên nhau (không phải phần trăm), sử dụng:

barplot(as.matrix(df)) 

Bất kỳ trợ giúp nào?

Trả lời

71

Vì bạn gắn thẻ ged này với ggplot2 đây là giải pháp sử dụng gói đó (phiên bản 0.9.0) ngoài những gì bạn đã nhận được cho đến nay.

Chúng tôi sử dụng đối số position của geom_bar được đặt thành position = "fill". Bạn cũng có thể sử dụng position = position_fill() nếu bạn muốn sử dụng các đối số của position_fill() (vjustreverse).

Lưu ý rằng dữ liệu của bạn ở định dạng 'rộng', trong khi ggplot2 yêu cầu định dạng phải dài. Vì vậy, trước tiên chúng ta cần phải melt dữ liệu.

dat <- read.table(text = " ONE TWO THREE 
1 23 234 324 
2 34 534 12 
3 56 324 124 
4 34 234 124 
5 123 534 654",sep = "",header = TRUE) 

#Add an id variable for the filled regions 
library(reshape) 
datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind')) 

library(scales) 
ggplot(datm,aes(x = variable, y = value,fill = ind)) + 
    geom_bar(position = "fill",stat = "identity") + 
    # or: 
    # geom_bar(position = position_fill(), stat = "identity") 
    scale_y_continuous(labels = percent_format()) 

enter image description here

+1

gì gói được làm tan chảy() một phần của? Là nó reshape2? –

+3

Có; lời xin lỗi của tôi.Đối với một thời gian dài ggplot2 nạp các gói trên riêng của mình, tôi đã phát triển mạnh. – joran

+0

Tôi đã thử nó bằng cách sử dụng tan chảy từ gói reshape và tôi nhận được lỗi sau: "Lỗi quy mô $ nhãn (ngắt): đối số không sử dụng (ngắt)" Tôi tự hỏi nếu đó là vì tôi đọc từ một csv. –

3

Bạn chỉ cần chia từng phần tử cho tổng các giá trị trong cột của nó.

Việc làm này là đủ:

data.perc <- apply(data, 2, function(x){x/sum(x)}) 

Lưu ý rằng tham số thứ hai kể apply để áp dụng các chức năng cung cấp cho các cột (sử dụng 1 bạn sẽ áp dụng nó vào hàng). Sau đó, hàm ẩn danh sẽ được chuyển mỗi cột dữ liệu, mỗi lần một.

12

prop.table là một cách thân thiện để có được tỷ lệ bảng.

m <- matrix(1:4,2) 

m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

Bỏ trống lề mang đến cho bạn tỷ lệ của toàn bộ bảng

prop.table(m, margin=NULL) 
    [,1] [,2] 
[1,] 0.1 0.3 
[2,] 0.2 0.4 

Giving it 1 mang đến cho bạn hàng tỷ lệ

prop.table(m, 1) 
     [,1]  [,2] 
[1,] 0.2500000 0.7500000 
[2,] 0.3333333 0.6666667 

Và 2 là tỷ lệ cột

prop.table(m, 2) 
      [,1]  [,2] 
[1,] 0.3333333 0.4285714 
[2,] 0.6666667 0.5714286 
10

Chris Beeley là rigth, bạn chỉ cần tỷ lệ theo cột. Sử dụng dữ liệu của bạn là:

your_matrix<-( 
       rbind(
         c(23,234,324), 
         c(34,534,12), 
         c(56,324,124), 
         c(34,234,124), 
         c(123,534,654) 
        ) 
       ) 

barplot(prop.table(your_matrix, 2)) 

Cung cấp:

enter image description here

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