首页 > 解决方案 > 在ggplot中平滑热图

问题描述

我有一个如下所示的数据框:

X = c(6,6.2,6.4,6.6,6.8,5.6,5.8,6,6.2,6.4,6.6,6.8,7,7.2,7.4,7.6,7.8,8,2.8,3,3.2,3.4,3.6,3.8,4,4.2,4.4,4.6,4.8,5)
Y = c(2.2,2.2,2.2,2.2,2.2,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.6,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8)
Value = c(0,0.00683254,0,0.007595654,0.015517884,0,0,0,0,0,0,0,0,0,0.005219395,0,0,0,0,0,0,0,0,0,0,0,0.002892342,0,0.002758141,0)
table = data.frame(X, Y, Value)

我根据以下命令在 R 中整理了一个热图:

  ggplot(data = table, mapping = aes(x = X, y = Y)) + 
    geom_tile(aes(fill = Value), colour = 'black') + 
    theme_void() + 
    scale_fill_gradient2(low = "white", high = "black") + xlab(label = "X") + ylab(label = "Y") 

由于不是每个 X 和 Y 都有一个值,因此会导致如下图所示。

在此处输入图像描述

我正在尝试平滑情节并提出以下问题:

由于绘制的值之间存在小的空白,如何将这些空白着色为中值强度?换句话说,在将非零“值”绘制在顶部(叠加)之前,我将如何首先创建一个具有非零中值“值”的初始层?

下面显示了一个示例,该示例已“平滑”,看起来更接近所需的输出。 在此处输入图像描述

标签: rggplot2

解决方案


我不确定它是否完全符合您的需要,但据我了解,您有一些缺失值以及 X 和 Y 的组合。

因此,您可以使用complete函数 fromtidyr获取 X 和 Y 的所有不同组合(那些没有值的将被填充NA),然后通过na.value在函数中使用参数scale_fill_gradient2,您可以将这些NA值的值设置为中点值的相同颜色:

library(tidyr)
library(dplyr)
library(ggplot2)
table %>% complete(X,Y) %>%
  ggplot(aes(x = X, y = Y))+
  geom_raster(aes(fill = Value), interpolate = TRUE)+
  scale_fill_gradient2(low = "white", mid = "grey",high = "black",
                       na.value = "grey")

在此处输入图像描述 它回答了你的问题吗?


推荐阅读