R中的filled.contour():非线性键范围

时间:2013-07-22 06:44:27

标签: r heatmap levelplot

我使用filled.contour()来绘制存储在矩阵中的数据。数据由(高度)非线性函数生成,因此其分布根本不均匀,范围非常大。

因此,我必须使用“水平”选项来微调情节。但是,filled.contour()不会使用这些自定义级别为热图制作合适的颜色键,我觉得这很令人惊讶。

这是我的意思的一个简单例子:

    x = c(20:200/100)
    y = c(20:200/100)
    z = as.matrix(exp(x^2)) %*% exp(y^2)
    filled.contour(x=x,y=y,z=z,color.palette=colorRampPalette(c('green','yellow','red')),levels=c(1:60/3,30,50,150,250,1000,3000))

正如您所看到的,使用上面代码生成的颜色键几乎没用。我想使用某种投影(也许是sin(x)或tanh(x)?),这样上面的范围就不会在键中过度表示(以线性方式)。

此时,我想:

1)知道是否有一些非常简单/明显的东西,例如:一种选择,使这个“关键范围适应”自动化; 2)如果1)的答案是否定的,请寻求自己如何做的建议/帮助。

非常感谢!

PS:我为我的英语道歉,这远非完美。如果您需要我澄清任何事情,请告诉我。

1 个答案:

答案 0 :(得分:3)

我感到沮丧。我从未找到使用filled contour执行此操作的方法,因此通常会恢复使用image,然后将我自己的比例添加为单独的图表。我编写了函数image.scale来帮助解决这个问题(link)。下面是一个示例,说明如何为比例提供对数变换以拉伸小值 - 然后使用非对数转换值作为标签标记比例:

实施例

source("image.scale.R") # http://menugget.blogspot.de/2011/08/adding-scale-to-image-plot.html

x = c(20:200/100)
y = c(20:200/100)
z = as.matrix(exp(x^2)) %*% exp(y^2)

pal <- colorRampPalette(c('green','yellow','red'))
breaks <- c(1:60/3,30,50,150,250,1000,3000)
ncolors <- length(breaks)-1
labs <- c(0.5, 1, 3,30,50,150,250,1000,3000)

#x11(width=6, height=6)
layout(matrix(1:2, nrow=1, ncol=2), widths=c(5,1), heights=c(6))
layout.show(2)

par(mar=c(5,5,1,1))
image(x=x,y=y,z=log(z), col=pal(ncolors), breaks=log(breaks))
box()

par(mar=c(5,0,1,4))
image.scale(log(z), col=pal(ncolors), breaks=log(breaks), horiz=FALSE, xlab="", ylab="", xaxt="n", yaxt="n")
axis(4, at=log(labs), labels=labs)
box()

结果:

enter image description here