是否可以使用要填充的"Value"列将以下点图转换为感人的六角形热图?

library(ggplot2)

rows = 1:10; cols = 1:10
grid_data = expand.grid(rows, cols)
colnames(grid_data) <- c("x", "y")
set.seed(123)
grid_data$value = sample(1:100, size = nrow(grid_data), replace = TRUE)

ggplot(grid_data, aes(x = x, y = y, color = value)) + geom_point() + theme_void()

enter image description here

非常感谢!

我期待着一张感人的六边形热图或点阵图,上面标有"Value".

推荐答案

在不显著扭曲点的相对位置的情况下,不可能直接将正方形的值网格转换为六边形的值网格.

另一种方法是将值手动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))

enter image description here


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()

enter image description here

如果我们覆盖我们的原始点,我们可以看到原始值在每个位置都被保留:

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()

enter image description here

如果您愿意,也可以使用填充轮廓:

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()

enter image description here

R相关问答推荐

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

保存包含循环和ifelse的函数的输出

找出疾病消失的受试者

gt()从gt为相同内容的单元格 colored颜色 不同?

如何使下一个按钮只出现在Rshiny 的一段时间后?""

在GGPLATE中将突出的点放在前面

使用列/行匹配将两个不同维度的矩阵相加

使用for循环和粘贴创建多个变量

`lazy_dt`不支持`dplyr/across`?

在不丢失空值的情况下取消列出嵌套列表

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

如何提取R中其他字符串和数字之间的字符串?

将列的值乘以在不同数据集中找到的值

快速合并R内的值

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

如何获取R chromote中的当前URL?

如何在R中的两列以上使用联合(&U)?

从单个html段落中提取键-值对

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`