在 R 中构建灵敏度热图
Building sensitivity heat maps in R
我正在尝试在 R 中构建灵敏度热图,但在定义 x 轴和 y 轴的值时遇到了问题。
例如,我想构建热图,显示变量 L
以及 x 轴上的变量 nA
和 y 轴上的 nB
。但是,我不知道如何为 nA
和 nB
定义 x 和 y 轴,因为这些变量取决于人口规模 A
和 B
也用于定义变量 nAH
和 nBH
。使用我的代码,我在热图中获得了白线。这是我的代码:
## 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))
我正在尝试在 R 中构建灵敏度热图,但在定义 x 轴和 y 轴的值时遇到了问题。
例如,我想构建热图,显示变量 L
以及 x 轴上的变量 nA
和 y 轴上的 nB
。但是,我不知道如何为 nA
和 nB
定义 x 和 y 轴,因为这些变量取决于人口规模 A
和 B
也用于定义变量 nAH
和 nBH
。使用我的代码,我在热图中获得了白线。这是我的代码:
## 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))