Красочный сюжет с использованием Persp
2 ответа
Если вам просто нужна затененная красная кривая, попробуйте добавить col
параметр в вашей функции persp:
persp(TestMatrix,
theta = 30, phi = 30, expand = 0.19, scale=FALSE,
shade=0.4, col="red", border="blue",
box=FALSE)
Редактировать: Спасибо за ваши изменения, я не был уверен, что вам нужен двухцветный сюжет. Здесь есть вопрос по этой проблеме: Создать 3D-график, окрашенный по оси Z. Вам нужна цветовая матрица, чтобы указать цвета каждого фасета поверхности. Подтипной точкой является вычисление высоты (z) в середине каждого фасета, то есть среднего значения четырех вершин сетки (которые соответствуют значениям z). Приспосабливая ответ для своего графика, решение может быть чем-то вроде этого:
# Color palette (100 colors)
col.pal<-colorRampPalette(c("blue", "red"))
colors<-col.pal(100)
# height of facets
z.facet.center <- (z[-1, -1] + z[-1, -ncol(z)] + z[-nrow(z), -1] + z[-nrow(z), -ncol(z)])/4
# Range of the facet center on a 100-scale (number of colors)
z.facet.range<-cut(z.facet.center, 100)
persp(x, y, z,
theta = 30, phi = 30, expand = 0.19, scale=FALSE,
shade=NA, col=colors[z.facet.range], border="grey80",
box=FALSE)
Отделив часть создания палитры, мы можем реализовать функцию 3D-графики.plot.3d()
который принимаетpal.func
в качестве аргумента:
plot.3d <- function(x, y, z, pal.func, nlevels=50) {
colors <- pal_func(nlevels)
z.facet.center <- (z[-1, -1] + z[-1, -ncol(z)] + z[-nrow(z), -1] + z[-nrow(z), -ncol(z)])/4
z.facet.range <- cut(z.facet.center, nlevels)
persp(x, y, z, theta = 30, phi = 45, scale=FALSE,
expand = 0.2, col=colors[z.facet.range], box=FALSE)
}
x <- seq(-3,3,0.15)
y <- seq(-3,3,0.15)
s <- 1
z <- outer(x, y, function(x,y) 50/s^4/pi*(1-(x^2+y^2)/2/s^2)*exp(-(x^2+y^2)/2/s^2))
plot.3d(x, y, z, pal.func = colorRampPalette(c("blue", "red")))
используя библиотекуGA
мы можем получитьmaltlab
нравитьсяjet
цветовая карта
library(GA)
plot.3d(x, y, z, pal_func=jet.colors)