2

我正在使用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:我为我的英语道歉,这远非完美。如果您需要我澄清任何事情,请告诉我。

4

1 回答 1

3

我感觉到你的沮丧。我从来没有找到一种方法来做到这一点filled contour,所以通常会恢复使用image然后添加我自己的比例作为单独的情节。我编写了函数image.scale来帮助解决这个问题(链接)。下面是一个示例,说明如何为比例提供对数变换以扩展小值 - 然后使用非对数变换值作为标签标记比例:

例子:

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

结果:

在此处输入图像描述

于 2013-07-22T07:32:21.160 回答