2013-06-23 10 views
10

Mam następujący 3d działki:Formatowanie persp3d działki

ro

z moim data stworzyłem ją z następującego kodu:

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) 

Jak mogę uzyskać zabarwienie w zależności od z wartości? Przyjrzałem się różnym rozwiązaniom, np. to one, ale nie mogłem utworzyć kolorowania w zależności od wartości z w tym przypadku. Rozwiązanie według this thread byłby następujący:

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) 

Ale to nie daje dobrych rezultatów, ponieważ nie zabarwić odpowiednią działkę. Chcę mieć skoki mojej powierzchni, na przykład na czerwono i niskie wartości np. na niebiesko z ładnym płynnym przejściem, ale ten rodzaj kolorów kroi plasterki, więc w zależności od czasu? Tak więc ekstremalne duże skoki powinny być zabarwione na kolcach na czerwono, a wartości na dole, np. w zielonym. Jak mogę to zdobyć?

Edytuj: Znalazłem rozwiązanie mojego poprzedniego pytania o datę na osi, jedynym problemem, jaki pozostał, jest odpowiednia kolorystyka zależna od wartości z.

+0

Uwaga: nie wiem dlaczego, ale muszę załadować pakiet rgl przed otwarciem obszaru roboczego, inaczej mój R przestaje działać, nie wiem dlaczego. –

Odpowiedz

21

Spróbuj tego:

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

Jeśli chcesz kolorystyka będzie przez czas (tak kolce są zawsze czerwone) można ustawić kolorystykę dla każdego przedział czasowy:

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

Już wiesz, jak poprawnie edytować osie.

+1

Są to doskonałe odpowiedzi, bardzo dziękuję za pomoc! –

6

Aby dochodzić kontrolę nad osiami, trzeba ustawić axes=FALSE (jak powiedziano wczoraj) w zaproszeniu persp3d, a następnie użyj funkcji axes3d i axis3d z argumentami swojego wyboru. Aby określić oś x z wartościami wyświetlanymi wzdłuż dolnego segmentu segmentu yz-box, należy użyć edge= 'x--'. Aby oznaczyć oś y z rownames, użyj „etykiety” i „na” argumenty:

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

(Uwaga: Aby grać to tak gra prawidłowo, trzeba dać kredyt do innych, którzy To nie różni się zbytnio od a question from yesterday i nie widzę żadnej pozytywnej odpowiedzi na pomocne odpowiedzi.Jestem zastanawia się, czy ludzie stają się niezainteresowani.)

+5

Moje skalowanie nie jest "wyraźnie błędne" (ponieważ nigdy nie podano adnotacji w osi), ale twoja odpowiedź wyraźnie potwierdza, że ​​nie będę miał większego sensu w moim wysiłku. –

4

Poniżej znajduje się rozwiązanie, aby odpowiedzieć na pytanie dotyczące barwienia powierzchnia w zależności od wartości z. Chodzi o to, aby przypisać kolor do każdego punktu powierzchni na podstawie jego (względnej) wysokości. Poniższy kod zawiera dostosowanie osi zaproponowane przez @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

Są to zarówno doskonałe odpowiedzi, bardzo dziękuję za pomoc! –