К сожалению, используемый набор данных недоступен, поэтому невозможно точно воспроизвести изображение и расширить детали.
Для создания поверхности контура интересно использовать пакет ggplot2
с функцией geom_raster
. Но это вернет непрерывную поверхность.
library(ggplot2)
library(dplyr)
x <- seq(1, 6, 1)
y <- seq(0, 3, 1)
grid <- expand.grid(x = x,
y = y)
m <- matrix(c(7,73,195,195,416,625,120,52,178,178,349,454,6,
83,164,164,244,0,3,52,150,150,329,330),
nrow = 4, ncol = 6, byrow = T)
m2 <- m %>%
t %>% as.data.frame()
grid <- grid %>%
dplyr::mutate(response = c(m2$V1, m2$V2, m2$V3, m2$V4))
Palet <- c("royalblue2", "orangered3", "lavenderblush3", "gold3")
ggplot2::ggplot(grid, aes(x, y, z = response)) +
geom_raster(aes(fill = response)) +
scale_fill_gradientn(colours = Palet, limits = c(0, 800)) +
theme_void() +
theme(legend.position = "bottom")
Кроме того, можно выполнять манипуляции с данными и работать с дискретными fill
. Где для каждого интервала будет назначен цвет.
grid2 <- grid %>%
dplyr::mutate(cor = ifelse(response >= 0 & response < 200, 1,
ifelse(response >= 200 & response < 400, 2,
ifelse(response >= 400 & response < 600, 3,
ifelse(response >= 600, 4, "error")))))
ggplot2::ggplot(grid2, aes(x, y, z = response)) +
geom_raster(aes(fill = cor)) +
scale_fill_manual(values = Palet, labels = c("0-200", "200-400",
"400-600", "600-800"),
name = "") +
theme_void() +
theme(legend.position = "bottom")
Однако, если считать, что в матрице m
каждая ячейка является интенсивностью, можно создать трехмерный график.
library(plot3D)
persp3D(z = m, theta = 60)
3D-график поверхности из 2D-матрицы
График 3D-данных в R
Впечатляющий пакет для 3D и 4D графиков - программное обеспечение R и визуализация данных