filled.contour - 描述z值级别的变化

时间:2013-01-06 17:54:36

标签: r graphics

我必须生成{z}值中具有某种对称性的filled.contour图,如下面的代码所示

x <- 1:5
y <- 1:5
z <- matrix(outer(x,y,"+"),nrow=5)
filled.contour(x,y,z)
filled.contour(x,y,z,color.palette=rainbow)
z2 <- z
z2[5,5] <- Inf
filled.contour(x,y,z2,col=rainbow(200),nlevels=200)

我希望能够描述z值的水平,例如某些水平或增量(2,4,6,8,10)增量,以获得以下图表

enter image description here

我希望保留col=rainbow(200)的级别以绘制平滑的颜色和颜色过渡,但我想描绘某些值/增量。

这可能吗?我会很感激基础R解决方案,但如果不可能,任何解决方案都会很好(ggplot,lattice)

3 个答案:

答案 0 :(得分:4)

您可以使用countourLines()添加行和text()来添加文本:

txtlab <- c("2", "4", "6", "8", "Inf")
txtpos <- c(1.25, 2, 3, 4, 4.75)
ctlns <- contourLines(x, y, z2, levels=c(3, 5, 7, 9))
filled.contour(x,y,z2,col=rainbow(200),nlevels=200, 
     plot.axes={axis(1); axis(2); text(txtpos, txtpos, txtlab, cex=1.5);
     sapply(1:4, function(x) lines(ctlns[[x]][[2]], ctlns[[x]][[3]], lwd=2))
})

Filled contour

答案 1 :(得分:1)

这里的每个整数都是黑色的(使用is.integer中的一个例子),可以修改为只返回black,甚至整数都很容易:

getcolor <- function(z, n) {
  is.wholenumber <-
    function(x, tol = .Machine$double.eps^0.5)  abs(x - round(x)) < tol
  pp <- pretty(range(z, finite=TRUE), n)
  ifelse(is.wholenumber(pp), 'black', rainbow(n))
}

filled.contour(x,y,z2,col=getcolor(z2, 200),nlevels=200)

enter image description here

答案 2 :(得分:0)

我最近做过类似的事情而且我使用了那种类型的代码:

x <- 1:5
y <- 1:5
z <- matrix(outer(x,y,"+"),nrow=5)
z2 <- z
z2[5,5] <- Inf
filled.contour(x,y,z2,col=rainbow(200),nlevels=200
plot.axis = {axis(1);axis(2);contour(x,y,z2,add=TRUE)}) #that's when you add the contours

Result (click on link to see)