张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

三维图中的颜色渲染

已有 6575 次阅读 2013-12-30 22:31 |个人分类:科研笔记|系统分类:科研笔记

三维图中的颜色渲染

Jinlong Zhang

jinlongzhang01@gmail.com


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

 

### 给出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))

 








https://blog.sciencenet.cn/blog-255662-754317.html

上一篇:新西兰Dunedin的杜鹃花海
下一篇:AAplus天文算法C++库在R中的实现:skycalc程序包
收藏 IP: 203.210.7.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-19 11:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部