Форматирование графика persp3d
У меня есть следующий трехмерный график:
![ro]()
С помощью данных я создал его со следующим кодом:
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)
Как я могу получить раскраску в зависимости от значений z? Я рассмотрел различные решения, например. этот один, но я не мог создать раскраску в зависимости от значений z в этом случае.
Решение в соответствии с этой нитью было бы следующим:
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)
Но это не дает хорошего результата, поскольку он не окрашивает сюжет. Я хочу, чтобы шипы моей поверхности были, например, в красном и низкие значения, например, в синем с приятным плавным переходом, но этот цвет расцветает, так что в зависимости от времени? Поэтому экстремальные большие всплески должны быть окрашены красными пиками и значениями внизу, например. в зеленом цвете. Как я могу получить это?
Изменить: я нашел решение своего предыдущего вопроса о дате на оси, единственная проблема, оставшаяся, - это соответствующая раскраска, зависящая от значений z.
Ответы
Ответ 1
Попробуйте следующее:
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]()
Если вы хотите, чтобы раскраска была по времени (так что пики всегда красные), вы можете установить расцветку для каждого временного фрагмента:
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]()
Вы уже знаете, как правильно отредактировать оси.
Ответ 2
Чтобы утвердить контроль над осями, вам нужно установить axes=FALSE
(как было сказано вчера) в вызове persp3d
, а затем использовать функции axes3d
и axis3d
с аргументами по вашему выбору. Чтобы указать ось x со значениями, отображаемыми вдоль нижнего сегмента yz-box, используйте edge= 'x--'
. Чтобы пометить ось y с именами ростов, используйте аргументы 'labels' и 'at':
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]()
(Примечание: Чтобы играть в эту игру SO правильно, вам нужно отдать должное другим, которые предложили помощь. Это не сильно отличается от со вчерашнего вопроса и Я не вижу положительного ответа на полезный вклад. Мне интересно, не становятся ли люди незаинтересованными.)
Ответ 3
Ниже приведено решение ответить на ваш вопрос о окрашивании поверхности в зависимости от значений z. Идея состоит в том, чтобы назначить цвет каждой точке поверхности на основании ее (относительной) высоты.
Код ниже включает настройку осей, предложенную @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]()