R 如何排列两个热图的颜色比例(plot3D软件包中的image2D函数)?
编辑:原来是“只是”在R 如何排列两个热图的颜色比例(plot3D软件包中的image2D函数)?,r,R,编辑:原来是“只是”在densite\u cauchy\u norm中放错了括号,结果出现了偏差,现在一切正常。 我有三个二维直方图(热图)需要比较。 出于某种原因,其中一个(封闭图像上的第二个)将值映射为不同于其他两个的颜色(例如,第二个直方图上的密度为0.020与其他两个直方图上的密度为0.015的颜色相同)。 这些数据来自蒙特卡罗模拟,我需要将两个样本(X_1,X_2)的直方图与实际“密度”(f_tilde,未规范化)进行比较,从中采样(图3)。 所以,在它们都有相同的颜色映射之前,我无
densite\u cauchy\u norm
中放错了括号,结果出现了偏差,现在一切正常。我有三个二维直方图(热图)需要比较。
出于某种原因,其中一个(封闭图像上的第二个)将值映射为不同于其他两个的颜色(例如,第二个直方图上的密度为0.020与其他两个直方图上的密度为0.015的颜色相同)。 这些数据来自蒙特卡罗模拟,我需要将两个样本(
X_1,X_2
)的直方图与实际“密度”(f_tilde
,未规范化)进行比较,从中采样(图3)。
所以,在它们都有相同的颜色映射之前,我无法真正显示它们与理论值有多接近
对于前两个直方图,我对样本X_1和X_2使用了相同的命令
看看下面的代码;您可以在底部找到数据:
library(plot3D)
par(mfcol = c(1, 3));
n <- 100000;
X_1 <- simu_f_1(n);
X_2<- simu_f_2(n);
x_s <- 50; y_s <- 50;
mon_histo(X_1, x_s, y_s, opt_3D = FALSE);
mon_histo(X_2, x_s, y_s, opt_3D = FALSE);
z <- outer(seq.int(0, 4, length= x_s), seq.int(0, 2, length = y_s), f_tilde);
image2D(z=z/sum(z), x = seq.int(0, 4, length= x_s),y = seq.int(0, 2,
length = y_s), border="black", contour = FALSE);
库(plot3D)
par(mfcol=c(1,3));
n什么是f_tilde
?两个样本的理论密度函数应与我使用的是plot3D的热图而不是ggplot2的热图相同,我将在中编辑它。如果无法使用image2D修复绘图,我将切换到ggplot2,thanks@M-M这不适用于ggplot
。这可能是另一种选择,但不是plot3D
的直接解决方案。
densite_unif_norm <- function(x,y) { return(dnorm(x, mean = 2, sd = 1) * dunif(y, min = 0, max = 2)); }
densite_cauchy_norm <- function(x,y) { return( dnorm(x, mean = 2, sd = 1)) * dcauchy(y, location = 1, scale = 0.5); }
f_tilde <- function(x,y) {
return( (x>=0)*(x<=4)*(y>=0)*(y<=2) * exp(-0.5*(x-2)**2)*
(cos(x)**2+(2*sin(y)**2)*(cos(x)**4)) / (1+4*(y-1)**2) );
}
simu_f_1 <- function(n) { #simulates size n sample X_1 ~ "density" f_tilde by rejection sampling
M <- 6*sqrt(2*pi); # M = 15.04
f <- function(x) {
repeat{
Y <- c(rnorm(n = 1, mean = 2, sd = 1), runif(n = 1, min = 0, max = 2));
U <- runif(n = 1, min = 0, max = M*densite_unif_norm(Y[1], Y[2]));
if(U < f_tilde(Y[1], Y[2])) { break; } #la boucle s'arrête à la dernière valeur de y t.q u < f_tilde(y)
}
return(rbind(Y[1], Y[2]));
}
return(Vectorize(f)(1:n));
}
simu_f_2 <- function(n) {
M <- 3*(pi^1.5)/sqrt(2); # M = 11.81
f <- function(x) {
repeat{
Y <- c(rnorm(n = 1, mean = 2, sd = 1), rcauchy(n = 1, location = 1, scale = 0.5));
U <- runif(n = 1, min = 0, max = M*densite_cauchy_norm(Y[1], Y[2]));
if(U < f_tilde(Y[1], Y[2])) { break; }
}
return(rbind(Y[1], Y[2]));
}
return(Vectorize(f)(1:n));
}
mon_histo <- function(X, x_sub, y_sub, opt_3D = FALSE) {
x_c <- cut(X[1,], x_sub);
y_c <- cut(X[2,], y_sub);
z <- table(x_c, y_c);
if(opt_3D) {hist3D(z=z, border="black"); }
else {
u <- seq(from = range(X[1,])[1], to = range(X[1,])[2], length.out = x_sub);
v = seq(from = range(X[2,])[1], to = range(X[2,])[2], length.out = y_sub);
image2D( z=z/length(X[1,]), border="black", x = u, y = v);
}
}