我有三个变量(第三个是两个物理值的相对频率)。
x <- rnorm(1398)
y <- rnorm(1398)
a1 <- rnorm(1398)
data <- data.frame(x, y, a1)
第一步是使用akima,后者是fill.contour。
fld <- with(data, interp(x,y,a1))
filled.contour(x=fld$x,y=fld$y,z=fld$z,
color.palette=colorRampPalette(c("white", "blue")))
此处出现的问题是颜色条标尺上的范围是0.0008-0.0018。 但是当我检查时
> max(a1)
[1] 0.004291845
> min(a1)
[1] 0.0007153076
如何计算fld以完全代表数据?
答案 0 :(得分:3)
来自interp
的文档,关于xo
参数:
输出网格的x坐标向量。 默认值为40分 均匀分布在x的范围内。
因此fld
中的x可能不包含与您的最大或最小a1值对应的x值。
通过增加xo
和yo
的点数,插值的最大z
值将更接近实际最大值。例如,
set.seed(100)
x <- rnorm(1398)
y <- rnorm(1398)
a1 <- rnorm(1398)
data <- data.frame(x, y, a1)
fld <- with(data, interp(x,y,a1))
fld2 <- with(data, interp(x,y,a1, xo=seq(min(x), max(x), length=1000), yo=seq(min(y), max(y), length=1000)))
max(a1, na.rm=TRUE)
#[1] 2.949
max(fld$z, na.rm=TRUE)
#[1] 2.481
max(fld2$z, na.rm=TRUE)
#[1] 2.902
此外,如果您希望插值z包含最大值和最小值a1,请将相应的x和y值添加到xo和yo。例如,这就是为什么要包含a1的最大值。
max.a1.x <- x[which.max(a1)]
max.a1.y <- y[which.max(a1)]
# these have to be sorted, since filled.contour will expect them to be.
xo <- sort(c(seq(min(x), max(x), length=40), max.a1.x))
yo <- sort(c(seq(min(y), max(y), length=40), max.a1.y))
fld3 <- with(data, interp(x,y,a1, xo=xo, yo=yo))
filled.contour(x=fld3$x,y=fld3$y,z=fld3$z,
color.palette=colorRampPalette(c("white", "blue")))
max(fld3$z, na.rm=TRUE)
# [1] 2.949
答案 1 :(得分:-1)
我在pastbin上添加了原始数据。
我认为它可以被读作data.frame。
关于这个问题,马修提出了更多的观点,是的,我已经尝试了这一点,但仍然只是略微改善了结果。
> max(fld2$z, na.rm=TRUE)
[1] 0.002222537
> max(a1, na.rm=TRUE)
[1] 0.004291845