三维图中的颜色渲染

在R中绘制三维图常用persp, 但是persp函数并未提供颜色渲染的相应参数。这里提供了一种方法,在persp中, 按照取值不同, 添加相应的颜色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
### 给出x,y以及f取值序列, 要绘制的是f的函数面
x <-seq(-10, 10, length=30)
y <- x
f <-function(x, y){ r <-sqrt(x^2+y^2); 10*sin(r)/r }
z <-outer(x, y, f)
z[is.na(z)]<-1
op <-par(bg ="white", mar=c(1,1,1,1))
### 生成颜色序列
col.table1 <- topo.colors(400)
col.table2 <- heat.colors(400)
col.table3 <- terrain.colors(400)
col.table4 <- cm.colors(400)
### 计算行列
ncz <-ncol(z)
nrz <-nrow(z)
### zfacet是用来做cut的, 如果想获得与矩阵相同的grid数目, 需要在行列的开始和结束,都减去1
### 这里的zfacet是 breaks
zfacet <- z[-1, -1]+z[-1, -ncz]+z[-nrz, -1]+ z[-nrz, -ncz]
### 进行cut, 生成400种颜色, 生成每个方格,所属的颜色等级
col.ind <- as.numeric(cut(zfacet, 400))
###col.table1[col.ind] 本句是将col.table1颜色序列, 按照zfacet的值进行排列, 以保证对应的方格, 出现对应等级的颜色。 因为z矩阵的保存方式实际上是一个vector。 col.ind能够才能够和grid的颜色匹配。
par(mfrow =c(2,2), mar = c(1, 1, 1, 1))
### 四种颜色的三维图
persp(x, y, z, theta =30, phi =30, expand =0.5, col= col.table1[col.ind], main ="topo.colors")
persp(x, y, z, theta =30, phi =30, expand =0.5, col= col.table2[col.ind], main ="heat.colors")
persp(x, y, z, theta =30, phi =30, expand =0.5, col= col.table3[col.ind], main ="terrain.colors")
persp(x, y, z, theta =30, phi =30, expand =0.5, col= col.table4[col.ind], main ="cm.colors")
注: lattice程序包的wireframe函数提供了颜色的渲染方法。
wireframe(volcano, drape =TRUE, aspect =c(61/87, 0.4))
wireframe(volcano, shade =TRUE, aspect =c(61/87, 0.4))
wireframe(z, shade =TRUE, aspect =c(61/87, 0.4))
wireframe(z, drape =TRUE, aspect =c(61/87, 0.4))