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