2012-10-07 37 views
11

Tôi muốn tạo một ô ruy-băng (thực sự nó là một cốt truyện của nhiều nhóm của một biến phân loại) nhưng được hiển thị theo kiểu 3D. Điều này sẽ giống như thế này:Cách tạo ô băng?

Ribbon plot example

Vì vậy, có lẽ chúng ta sẽ muốn âm mưu dữ liệu mẫu sau đây là một âm mưu ribbon:

set.seed(10) 
fun <- function(i) data.frame(person=rep(LETTERS[i], 26), 
    letter=letters, count=sample(0:100, 26, T)) 
dat <- do.call(rbind, lapply(1:10, function(i) fun(i))) 

library(ggplot2) #a traditional 2-d line plot of the data 
ggplot(data=dat, aes(x=letter, y=count, group=person, color=person)) + 
    geom_line() 

Làm thế nào điều này có thể đạt được trong R? Tôi biết có thể có cách tốt hơn để hiển thị dữ liệu nhưng sự quan tâm của tôi hiện tại là sản xuất cốt truyện kiểu dải.

Trả lời

16

Hy vọng ví dụ dưới đây sẽ giúp bạn điểm đúng hướng:

# data 
mat <- matrix(dpois(rep(1:20, 10), lambda=rep(10:1, each=20)), ncol=10) 

# 2d line plot 
matplot(mat, type="l", col="black", lty=1) 

# 3d ribbon plots 
par(mar = c(0, 1, 0, 1)) 
par(mfrow=c(1,2)) 
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5, 
     border=NULL, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1)) 
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5, 
     border=NA, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1)) 
par(mfrow=c(1,1)) 
par(mar = c(5,4,4,2)+.1) 

ribbon_example

Như bạn có thể thấy, ý tưởng cơ bản ở đây là khá đơn giản. Chúng tôi tổ chức các giá trị của chúng tôi để được vẽ thành ma trận, sao chép các cột trong ma trận sao cho chúng theo cặp và sau đó vẽ giá trị bằng cách sử dụng persp(), đảm bảo thay thế giữa màu trong suốt và màu đục. Tuy nhiên, có một vài chi tiết phức tạp vẫn còn được làm việc, đặc biệt là liên quan đến những gì cần làm với tham số biên giới. Tôi sẽ để lại những chi tiết đó cho bạn.

Hy vọng điều này sẽ hữu ích.

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