如何在R persp函数中沿z轴定位颜色方案?

时间:2015-11-04 09:05:05

标签: r colors

我有一个名为ht2的矩阵。我使用persp函数生成3D视图。

ht2 <- matrix(1, 29, 36)
ht2[4:26,4:33] <- 0
ht2[6:10,6:31] <- 3
ht2[13:17,6:31] <- 3
ht2[20:24,6:31] <- 3

persp(ht2, expand=0.03, theta=25, phi=25, shade=0.75, col=terrain.colors(999,alpha=1))

这给了我: Current Plot

如您所见,从绿色到黄色到棕色的颜色沿y轴变化。但是,我宁愿沿z轴改变它。

我正在寻找任何简单的方法。

2 个答案:

答案 0 :(得分:2)

我在这个网站找到了一个可能的解决方案:

https://stat.ethz.ch/pipermail/r-help/2003-July/036151.html

  levelpersp <- function(x, y, z, colors=topo.colors, ...) {
  ## getting the value of the midpoint
  zz <- (z[-1,-1] + z[-1,-ncol(z)] + z[-nrow(z),-1] + z[-nrow(z),-ncol(z)])/4
  ## calculating the breaks
  breaks <- hist(zz, plot=FALSE)$breaks
  ## cutting up zz
  cols <- colors(length(breaks)-1)
  zzz <- cut(zz, breaks=breaks, labels=cols)
  ## plotting
  persp(x, y, z, col=as.character(zzz), ...)
  ## return breaks and colors for the legend
  list(breaks=breaks, colors=cols)
  }


## Example
x <- seq(-10, 10, length=60)
y <- x
f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
levelpersp(x, y, z, theta = 30, phi = 30, expand = 0.5)

有人可能会建议在原始问题中实施此方法。

答案 1 :(得分:0)

原则上你只需要给col =一个矩阵,用你想要填充方块的颜色,就像一个简单的例子:

col=terrain.colors(max(ht2)+1)[ht2[-1,-1]+1]

(这个简单的版本有效,因为ht2包含整数,否则不会) 这将创建所需的所有颜色:terrain.colours(max(ht2)+1)
然后根据一个角为每个位置选择它们:[ht2 [-1,-1] +1]

Anuj Sharma的答案基本上是一个更好的版本,它假设你有十进制数字,所以它将它们分开(中断和切断)而不是采用一个角落它使用中间点的高度(平均值)获得中点时四个移位矩阵的数据)