在不显著扭曲点的相对位置的情况下,不可能直接将正方形的值网格转换为六边形的值网格.
另一种方法是将值手动2D插补到六边形栅格上:
library(tidyverse)
m1 <- interp::interp(grid_data$x, grid_data$y, grid_data$value,
xo = 0:11, yo = seq(0, 11, sqrt(3)/2))
m2 <- interp::interp(grid_data$x, grid_data$y, grid_data$value,
xo = 0:11 + 0.5, yo = seq(0, 11, sqrt(3)/2))
m1$y <- m1$y[ seq_along(m1$y) %% 2 == 1]
m1$z <- m1$z[, seq_along(m1$x) %% 2 == 1]
m2$y <- m2$y[ seq_along(m2$y) %% 2 == 0]
m2$z <- m2$z[, seq_along(m2$x) %% 2 == 0]
interp::interp2xyz(m1) |>
as.data.frame() |>
rbind(interp::interp2xyz(m2) |> as.data.frame()) %>%
filter(!is.na(z)) %>%
mutate(group = row_number()) %>%
rowwise() %>%
reframe(x = x + hexbin::hexcoords(0.5, sqrt(3)/6)$x,
y = y + hexbin::hexcoords(0.5, sqrt(3)/6)$y,
z = first(z),
group = first(group)) %>%
ggplot(aes(x, y)) +
geom_polygon(aes( fill = z, group = group), color = 'white') +
scale_fill_viridis_c() +
theme_minimal() +
coord_equal(xlim = c(0, 11), ylim = c(0, 11))
EDIT个
如果您想要值的空间填充内插,其中实际数据点将被保留,则不需要使用六角形存储箱:
library(akima)
with(grid_data, interp(x, y, value, nx = 500, ny = 500, linear = FALSE)) |>
interp::interp2xyz() |>
as.data.frame() |>
ggplot(aes(x = x, y = y, fill = z)) +
scale_fill_viridis_c("value") +
geom_raster() +
theme_void(base_size = 20) +
coord_equal()
如果我们覆盖我们的原始点,我们可以看到原始值在每个位置都被保留:
with(grid_data, interp(x, y, value, linear = FALSE, nx = 500, ny = 500)) |>
interp::interp2xyz() |>
as.data.frame() |>
ggplot(aes(x = x, y = y, fill = z)) +
scale_fill_viridis_c("value", limits = c(-10, 110), na.value = NA) +
geom_raster() +
geom_point(data = grid_data, shape = 21, size = 5, aes(fill = value)) +
theme_void(base_size = 20) +
coord_equal()
如果您愿意,也可以使用填充轮廓:
with(grid_data, interp(x, y, value, nx = 500, ny = 500, linear = FALSE)) |>
interp::interp2xyz() |>
as.data.frame() |>
ggplot(aes(x = x, y = y, z = z)) +
geom_contour_filled() +
theme_void(base_size = 20) +
coord_equal()