3

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

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)增量,以便获得以下图

在此处输入图像描述

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

这可能吗?我希望有一个基本的 R 解决方案,但如果这不可能,任何解决方案都会很好(ggplot,lattice)

4

3 回答 3

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

填充轮廓

于 2013-01-06T20:38:40.117 回答
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)

在此处输入图像描述

于 2013-01-06T19:20:46.723 回答
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

结果(点击链接查看)

于 2018-02-01T14:03:56.117 回答