使用R-package image.plot
中的fields
我在图例条上获得随机偏差。正如您在下面的图像中看到的那样,从一种颜色到下一种颜色的转换并不总是确切地设置了中断的位置。例如,在第一张图片中,500断点比轴上的500更左侧。在最后一张图片中,它更靠右边。
在其他例子中,我的偏差更大,但我试图提供一个最小的例子来重现这种现象:
library("fields")
png("fields%03d.png", width=600)
for(seed in c(1,2,13)){
set.seed(seed)
mat <- matrix(runif(100, 0,3500), nrow=10)
breaks <- c(0,seq(500, 3500, 1000))
colors <- gray(seq(0, 1, length.out=length(breaks)-1))
image.plot(mat, col=colors, breaks=breaks, horizontal=T)
}
dev.off()
我在定义断点和颜色时做错了吗?
我的会话信息:
> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C
[3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8
[5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8
[7] LC_PAPER=de_DE.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] grid stats graphics grDevices utils
[6] datasets methods base
other attached packages:
[1] fields_6.9.1 maps_2.3-6 spam_0.41-0
[4] R.utils_1.29.8 R.oo_1.18.0 R.methodsS3_1.6.1
loaded via a namespace (and not attached):
[1] tools_3.1.0
答案 0 :(得分:1)
这非常令人困惑。你没有做错任何事;该函数如何解释这些参数只是有点滑稽。 image.plot
所做的是将观察到的数据范围分解为nlevels=
个块。基本上那些块被绘制为图例。因此,这些块中断可能与您传递的显式中断完全不一致。这就是它受种子影响的原因,因为每个随机集将具有不同的观察范围,因此不同的块中断。
第二个“问题”是图例是使用基础image
函数绘制的。图像函数将断点解释为颜色块的中点而不是边缘,就像您希望标记它们一样。因此,为了使颜色更改显示在特定值,您必须对可能导致该模式的断点进行反向工程。
所以我需要做两件事来“修复”这个功能。首先,我将定义一个帮助函数,它将进行计算以找到一个断点位置,为您提供您喜欢的标签。这个功能是
imagerev<-function(br, left=TRUE) {
m<-length(br)
n<-m-1
A<-diag(n)
if(left) {
A[1,1:2]<-c(1.5,-.5)
A[cbind(rep(2:n,each=2), as.vector(t(embed(1:n,2))))]<-.5
br<-br[1:n]
} else {
A[n,(n-1):n]<-c(-.5,1.5)
A[cbind(rep(1:(n-1),each=2), as.vector(t(embed(1:n,2))))]<-.5
br<-br[2:m]
}
solve(A,br)
}
现在我们需要欺骗image.plot
使用此函数来计算图例的y值。我们实际上会复制image.plot
函数,然后替换一行代码来使其工作。
image.plot2<-image.plot
body(image.plot2)[[17]]<-quote(iy<-imagerev(breaks))
现在我们有了一个新函数image.plot2
,它可以更好地将颜色中断与图例值对齐。所以我们来试试
set.seed(13)
mat <- matrix(runif(100, 0,3500), nrow=10)
breaks <- c(0,seq(500, 3500, 1000))
colors <- gray(seq(0, 1, length.out=length(breaks)-1))
image.plot2(mat, col=colors, breaks=breaks, horizontal=T, lab.breaks=breaks)
所以你可以看到对齐更好。但这种方法绝不是完美的。使用这种逆向工程方法除了非常特殊的情况外,根本不可能完全恢复图例。所以我不确定你对这个功能特别喜欢什么;如果它只是颜色条的图例,那么你自己写一个不使用image
函数的结果可能会更好。也许尝试heatmap.2
或其他什么。