来自字段包的image.plot中的轴和中断的偏差

时间:2014-06-02 11:50:40

标签: r

使用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()

我在定义断点和颜色时做错了吗?

random seed = 1 random seed = 2 random seed = 13

我的会话信息:

> 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

1 个答案:

答案 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)

updated output

所以你可以看到对齐更好。但这种方法绝不是完美的。使用这种逆向工程方法除了非常特殊的情况外,根本不可能完全恢复图例。所以我不确定你对这个功能特别喜欢什么;如果它只是颜色条的图例,那么你自己写一个不使用image函数的结果可能会更好。也许尝试heatmap.2或其他什么。