2013-06-23 47 views
10

Tôi có cốt truyện 3d sau:Formatting của cốt truyện persp3d

ro

Với tôi data tôi tạo ra nó với đoạn mã sau:

library(rugarch) 
library(rgl) 
library(fGarch) 

fd <- as.data.frame(modelfit, which = 'density') 
color <- rgb(85, 141, 85, maxColorValue=255) 

x <- seq(-0.2, 0.2, length=100) 
y <-c(1:2318) 

f <- function(s, t) { 
dged(s,mean=fd[t,'Mu'],sd=fd[t,'Sigma'],nu=fd[t,'Shape']) 

} 

z <- outer(x, y, f) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color, 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

Làm thế nào tôi có thể nhận được một màu tùy thuộc vào z giá trị? Tôi đã xem xét các giải pháp khác nhau, ví dụ: này one, nhưng tôi không thể tạo màu tùy thuộc vào giá trị z trong trường hợp này. Giải pháp theo this thread sẽ là như sau:

nrz <- nrow(z) 
ncz <- ncol(z) 
jet.colors <- colorRampPalette(c("#ffcccc", "#cc0000")) 
# Generate the desired number of colors from this palette 
nbcol <- 100 
color <- jet.colors(nbcol) 

# Compute the z-value at the facet centres 
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz] 
# Recode facet z-values into color indices 
facetcol <- cut(zfacet, nbcol) 

    persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[facetcol], 
      ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

Nhưng điều này không đưa ra một kết quả tốt, vì nó không màu cốt truyện phù hợp. Tôi muốn có bề mặt của tôi tăng đột biến, ví dụ: màu đỏ và giá trị thấp, ví dụ: trong màu xanh với một chuyển đổi suôn sẻ, nhưng loại màu này là những lát, vì vậy tùy thuộc vào thời gian? Vì vậy, các gai lớn cực lớn phải được tô màu khi có gai màu đỏ và các giá trị ở dưới cùng, ví dụ: màu xanh lá cây. Làm thế nào tôi có thể nhận được điều này?

Chỉnh sửa: Tôi tìm thấy giải pháp cho câu hỏi trước của tôi về ngày trên trục, vấn đề duy nhất còn lại, là màu thích hợp phụ thuộc vào giá trị z.

+0

Xin lưu ý: Tôi không biết tại sao nhưng tôi phải tải gói rgl trước khi mở không gian làm việc nếu không R của tôi bị lỗi, tôi không biết tại sao. –

Trả lời

21

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

nbcol = 100 
color = rev(rainbow(nbcol, start = 0/6, end = 4/6)) 
zcol = cut(z, nbcol) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[zcol], 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

theplot

Nếu bạn muốn màu được theo thời gian (do đó gai luôn đỏ) bạn có thể đặt màu cho mỗi lát thời gian:

mycut = function(x, breaks) as.numeric(cut(x=x, breaks=breaks)) # to combine different factors 
zcol2 = as.numeric(apply(z,2, mycut, breaks=nbcol)) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[zcol2], 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

theplot2

Bạn đã biết cách chỉnh sửa trục chính xác.

+1

Đây là cả hai câu trả lời tuyệt vời, cảm ơn rất nhiều sự giúp đỡ của bạn! –

6

Để xác nhận quyền kiểm soát các trục, bạn cần đặt axes=FALSE (như bạn đã nói hôm qua) trong cuộc gọi persp3d và sau đó sử dụng các chức năng axes3daxis3d với các đối số bạn chọn. Để chỉ định trục x có giá trị được hiển thị dọc theo phân đoạn hộp yz thấp hơn, hãy sử dụng edge= 'x--'. Để gán cho trục y với rownames, sử dụng 'nhãn' và 'at' đối số:

plot3d (..., axes=FALSE, ...) 
# repositions x axis and draws default z axis 
axes3d(c('x--','z')) 
# Use custom labels 
axis3d(edge= 'y+-', at =seq(500,2000,by=500), 
        labels = rownames(fd)[seq(500,2000,by=500)]) 

enter image description here

(Lưu ý: Để chơi SO trò chơi này đúng cách, bạn cần phải cung cấp tín dụng cho người khác Điều này không khác nhiều so với a question from yesterday và tôi thấy không có phản hồi tích cực cho những đóng góp hữu ích ở đó. Tôi tự hỏi nếu mọi người đang trở nên không quan tâm.)

+5

Tỷ lệ của tôi không "rõ ràng sai" (vì chú thích trục mong muốn chưa bao giờ được chỉ định), nhưng câu trả lời của bạn rõ ràng là xác nhận với tôi rằng sẽ có ít điểm trong nỗ lực hơn nữa của tôi. –

4

Sau đây là giải pháp để trả lời câu hỏi của bạn về tô màu bề mặt tùy thuộc vào giá trị z. Ý tưởng là gán một màu cho mỗi điểm của bề mặt dựa trên chiều cao (tương đối) của nó. Mã bên dưới bao gồm các tùy chỉnh trục được đề xuất bởi @DWin.

library(rugarch) 
library(rgl) 
library(fGarch) 

fd <- as.data.frame(modelfit, which = 'density') 
x <- seq(-0.2, 0.2, length=100) 
y <- c(1:2318) 

f <- function(s, t) { 
    dged(s,mean=fd[t,'Mu'],sd=fd[t,'Sigma'],nu=fd[t,'Shape']) 
} 

z <- outer(x, y, f) 

## Color definition of each point of the surface 
height <- (z - range(z)[1])/diff(range(z)) 
r.prop <- height 
g.prop <- 0 
b.prop <- 1 - height 
color <- rgb(r.prop, g.prop, b.prop, maxColorValue=1) 

persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color, 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=FALSE) 
axes3d(c('x--','z')) 
# Use custom labels 
axis3d(edge= 'y+-', at =seq(500,2000,by=500), 
     labels = rownames(fd)[seq(500,2000,by=500)]) 

theplot

+0

Đây là cả hai câu trả lời tuyệt vời, cảm ơn rất nhiều sự giúp đỡ của bạn! –

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