在 R 中构建灵敏度热图

Building sensitivity heat maps in R

我正在尝试在 R 中构建灵敏度热图,但在定义 x 轴和 y 轴的值时遇到了问题。

例如,我想构建热图,显示变量 L 以及 x 轴上的变量 nA 和 y 轴上的 nB。但是,我不知道如何为 nAnB 定义 x 和 y 轴,因为这些变量取决于人口规模 AB也用于定义变量 nAHnBH。使用我的代码,我在热图中获得了白线。这是我的代码:

## Define input parameters
dat <- expand.grid(V = 425,
                       A = round(seq(0, 4000, length.out = 100)),
                       B = round(seq(0, 3160, length.out = 100)),
                       C = 25,
                       fVA = 0.09,
                       fVB = 0.04,
                       gAV = 0.92,
                       gBV = 0.12, 
                       gVA = 0.83, 
                       gVB = 0.83, 
                       oV = 3.274796e-08,
                       pV = 425,
                       qV = 195903.7,
                       kVp = 425,
                       kVm = 42,
                       dA = 0.01,
                       dB = 0.001,
                       kA = 4000,
                       kB = 3160,
                       rA = 0.01,
                       rB = 0.019)

## Add new parameters
dat$nVH <- dat[,c("V")]/(dat[,c("A")] + dat[,c("B")] + dat[,c("C")])
dat$nAH <- dat[,c("A")]/(dat[,c("A")] + dat[,c("B")] + dat[,c("C")])
dat$nBH <- dat[,c("B")]/(dat[,c("A")] + dat[,c("B")] + dat[,c("C")])
dat$nA <- dat[,c("A")]/dat[,c("kA")]
dat$nB <- dat[,c("B")]/dat[,c("kB")]

## Define the equation for L: 
dat$L <- sqrt( (((dat$fVA)^2)*dat$gAV*dat$gVA*dat$nVH*dat$nAH)/((dat$oV*(dat$pV*dat$V + dat$kVp*dat$kVm + dat$qV))*(dat$dA + dat$rA*dat$nA)) +
                    (((dat$fVB)^2)*dat$gBV*dat$gVB*dat$nVH*dat$nBH)/((dat$oV*(dat$pV*dat$V + dat$kVp*dat$kVm + dat$qV))*(dat$dB + dat$rB*dat$nB)))
summary(dat)

## Build the sensitivity heat map
library(ggplot2)
ggplot(dat, aes(nA, nB, z = L)) +
  geom_tile(aes(fill = L)) +
  scale_fill_gradientn(colours = terrain.colors(10), name = "L") + 
  theme_bw() +
  theme(axis.title.x = element_text(size = 16),
        axis.text.x = element_text(size = 12),
        axis.title.y = element_text(size = 16),
        axis.text.y = element_text(size = 12),
        legend.title = element_text(size = 16))

这是生成的热图

预期结果将是一张没有白线的热图。

您也可以通过将 color 映射到 L 来解决此问题,然后将 color 渐变比例与 fill 渐变相匹配:

ggplot(dat, aes(nA, nB, fill = L, color = L)) +
  geom_tile() +
  scale_fill_gradientn(colours = terrain.colors(10), name = "L") + 
  scale_color_gradientn(colours = terrain.colors(10), name = "L") +
  theme_bw() +
  theme(axis.title.x = element_text(size = 16),
        axis.text.x = element_text(size = 12),
        axis.title.y = element_text(size = 16),
        axis.text.y = element_text(size = 12),
        legend.title = element_text(size = 16))