3d图
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
作者:李誉辉
四川大学在读研究生
前言
这篇是plot3D包绘图系列之二,前一篇请戳:
R_3D图(一)
,后面的章节会出3D柱形图,函数绘图,三维散点图等。敬请期待,做教程狠费精力的,别忘了点赞和转发。谢谢。2 辅助函数
2.1 色板xxx.col()
jet.col()
产生matlab类型的颜色
jet2.col()
与jet.col类似,但是缺少深蓝色色段。
gg.col()
( 产生ggpot2类型的颜色
gg2.col()
产生ggplot2类型的颜色
ramp.col()
通过插值产生颜色向量,离散色板连续化
alpha.col()
产生不同透明度的颜色向量
plot3D内置色板
library(ggforce)require(plot3D)library(scales)show_col(jet.col(n = 10, alpha = 0.5))show_col(jet2.col(n = 10, alpha = 0.5))show_col(gg.col(n = 10, alpha = 0.5))show_col(gg2.col(n = 10, alpha = 0.5))show_col(ramp.col(col = c("green", "magenta"), n = 10, alpha = 0.5))show_col(alpha.col(col = "magenta", alpha = seq(from = 0, to = 1, by = 0.1)))
2.2 colkey()
图例
colkey (col = NULL, clim, clab = NULL, clog = FALSE, add = FALSE, cex.clab = NULL, col.clab = NULL, side.clab = NULL, line.clab = NULL, adj.clab = NULL, font.clab = NULL, side = 4, length = 1, width = 1, dist = 0, shift = 0, addlines = FALSE, breaks = NULL, at = NULL, labels = TRUE, tick = TRUE, line = NA, pos = NA, outer = FALSE, font = NA, lty = 1, lwd = 1, lwd.ticks = 1, col.axis = NULL, col.ticks = NULL, col.box = NULL, hadj = NA, padj = NA, cex.axis = par("cex.axis"), mgp = NULL, tck = NULL, tcl = NULL, las = NULL)
参数解释:
整个图例:
side, 表示指定图例位置,c(1 = “bottom”, 2 = “left”, 3 = “top”, 4 = “right”)。
add, 表示是否将图例添加到现有图的边缘位置。FALSE则置于新图的中间。处于中间时,很多参数无法起作用。
dist, 表示指定图例与边缘的距离,正数表示靠近边缘,负数表示远离边缘。
合理的范围是[-0.5, 0.05]。 当add = FALSE时失效。
shift, 运动方向与dist垂直,当side=2或4时,正数表示向上移动。
当length = 1时,不能使用,合理的值应该是[-0.2, 0.2]。同样add = FALSE时失效。
图例标题:
clab, 表示指定图例标题内容,默认跟主标题在同一水平面上。 可以是多个标题内容,
cex.clab, 表示指定图例标题的尺寸大小,默认与轴标题一样大。
col.clab, 表示制定图例标题颜色,默认与主标题同一颜色。
side.clab, 表示指定图例标题环绕箱体的相对位置,默认与主标题一致,
c(1 = “bottom”, 2 = “left”, 3 = “top”, 4 = “right”)
adj.clab, 表示图例标题相对图例箱体两端的位置,从0(左)到1(右),默认0.5中间。
line.clab, 表示指定图例标题与图例箱体之间的距离,默认line.clab = 1.75 。
font.clab, 表示指定图例标题字型,1表示常规体,2表示粗体,3表示斜体,4表示粗斜体。中文失效。
图例箱体:
col, 表示指定图例颜色色板,默认
jet.col()
即红黄蓝色板。length, 表示指定图例箱体的相对长度,1表示等于坐标轴长度。
width, 表示指定图例箱体的相对宽度。
addlines, 表示是否增加分箱线,默认FALSE图例不增加。
col.box, 表示指定图例箱体边框颜色。默认为黑色。
图例刻度及刻度标签:
clim, 表示图例刻度范围值。无图时默认(0, 1) 表示全部范围。 可以是反区间
clog, 表示图例刻度是否对数变换。
col.axis, 表示图例坐标轴刻度标签颜色。
col.ticks, 表示图例刻度线颜色。
breaks, 为数字向量,表示图例刻度断点,默认等距增序排列,无序向量会被自动排序。
at, labels, tick, line, pos, outer, font, lty, lwd, lwd.ticks,
hadj, padj, cex.axis, mpg, tck, tcl, las, 表示其它控制图例刻度的参数。
require(plot3D)colkey(side = 1, add = FALSE, # 图例置于底部,不置于绘图对象, clab = "z", col.clab = "red", adj.clab = 0, # 图例标题颜色为红色,图例标题位置居左。 clim = c(0, 1)) # 刻度范围从0到1,colkey(side = 3, add = FALSE, clab = "z轴", # 图例置于顶部,不置于绘图对象 col.clab = "blue", adj.clab = 0.5, line.clab = 5, # 标题蓝色,相对两端居中,距离箱体为5个单位。 cex.clab = 3, clim = c(0.8, 0.2), # 标题文字尺寸为3个单位,刻度范围从0.8到0.2 clog = TRUE)# 图例刻度对数变换,colkey(side = 2, add = FALSE, # 图例置于左边 length = 0.5, width =1.5, # 图例箱体长度减半。图例箱体宽度增大。 clab = "我是图例",col.clab = "magenta", adj.clab = 0, # 标题颜色洋红,居于箱体一端 clim = c(0, 1), breaks = c(0, 0.1, 0.3, 0.4, 0.8, 1)) # 修改刻度断点,结果显示图例刻度等距排列colkey(side = 4, # 修改图例色板, 默认add=FALSE col = gg2.col(), clab = c("I am legend", "单位" ), # 修改箱体颜色色板,多个图例标题 col.box = "pink", # 箱体边框颜色为紫色 side.clab = 1, line.clab = 1, font.clab = 3, # 标题环绕箱体居于底部,距离箱体1个单位,字体斜体。 clim = c(1e-6, 1), clog = TRUE, col.axis = "magenta", col.ticks = "green", # 刻度对数变换 addlines = TRUE) # 增加图例分箱线
2.3 perspbox()
画box
perspbox()
画box及对应的labels,
语法:
perspbox (x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, length.out = ncol(z)), z, bty = c("b", "b2", "f", "g", "bl", "bl2", "u", "n"), ..., col.axis = "black", col.panel = NULL, lwd.panel = 1, col.grid = NULL, lwd.grid = 1, phi = 40, theta = 40, col = NULL, colkey = NULL, plot = TRUE)
参数解释:
x, y, 表示x, y坐标向量,需要比box内的对象范围更大。
z, 表示z轴坐标,可以是向量或矩阵。
如果z是矩阵,则必须满足
nrow(z) = length(x)
,ncol(z) = length(x)
。bty, 表示指定box类型,只有当
persp()
中box = TRUE
才有效, bty = c(“b”, “b2”, “f”, “g”, “bl”, “bl2”, “u”, “n”)其中之一。只有当
bty="u"
时,col.axis, col.panel, lwd.panel, col.grid, lwd.grid才不会被忽略。bty="f"
表示full box, 所有panels都显示并透明, 与persp()
默认一样。bty="b"
表示仅仅背景panels(3个panel)可见,bty="b2"
表示仅仅背景panels和grid可见。相当于“b1”和grid = "grey"
的组合。bty="bl"
表示仅仅黑色背景, 相当于: col.panel = “black”, col.axis = “grey”, lwd.grid = 2和col.grid = “white”。bty="bl2"
表示仅仅黑色背景和grid线。bty="g"
表示仅仅灰色背景和白色grid线。相当于:col.panel = grey(0.95), col.axis = “grey”, lwd.grid = 2和col.grid = “white”。
bty="u"
表示手动指定参数col.axis, col.panel, lwd.panel, col.grid, lwd.grid。bty="n"
表示不显示box, 相当于persp()
中box=FALSE
。col.axis, 表示指定坐标轴颜色
col.panel, 表示指定坐标轴panel颜色
col.grid, 表示指定grid颜色
lwd.panel, 表示指定panel border宽度。
lwd.grid, 表示grid线宽
theta, phi, 表示指定观察方向,与
persp()
中一样。col, 表示指定colvar变量的颜色, 仅仅用于评估是否应该绘制图例。
colkey, 为逻辑值或NULL(默认),或一个与
colkey()
中参数组成的列表用于绘制图例,plot, 为逻辑值,TRUE(默认)则绘制box, FALSE则返回转换矩阵数据。
…, 其它传递给
persp()
的参数, 如:xlim, ylim, zlim, xlab, ylab, zlab, main, sub, r, d,scale, expand, box, axes, nticks, ticktype, 只有scale和expand参数会影响坐标轴的尺寸。
require(plot3D)par(mfrow = c(2, 2), mar = c(1, 1, 1, 1)) # 多图排版,2*2矩阵排列# b类型boxperspbox(z = volcano, bty = "b", ticktype = "detailed", d = 2, # d=2>1降低透视度强度 main = "bty = 'b'") # 增加标题# f类型box,与persp()函数默认一样perspbox(z = volcano, bty = "f", ticktype = "detailed", # ticktype="detailed"表示显示坐标轴刻度及标签 d = 2, main = "bty = 'f'") # 增加标题# b2类型box, 背景panel与灰色gridperspbox(z = volcano, bty = "b2", ticktype = "detailed", d = 2, main = "bty = 'b2'") # 增加标题# g类型box, 类似ggplot2()默认风格,灰色背景和白色grid,perspbox(z = volcano, bty = "g", d = 2, main = "bty = 'g'") # 增加标题# 自定义box类型, bty = "u"par(mfrow = c(1, 1))perspbox(z = diag(2), bty = "u", ticktype = "detailed", col.panel = "cyan", col.axis = "magenta", # panels颜色为cyan,坐标轴颜色为洋红 lwd.panel = 8, lwd.grid = 2, # 指定panel宽度为8,grid宽度为2 scale = FALSE, expand = 0.4, col.grid = "pink", main = "user-defined") # grid颜色为粉红色
2.4 mesh()
mesh (x, y, z = NULL)
用于绘制2维或3维的网格数据。
本身并不产生图形,通过with后处理产生网格坐标信息,与向量外积计算结果相同。
但外积只能用于2个向量计算,而mesh
和with
可以用于3个向量计算。
返回1个列表,包含x,y,z三个数组。
参数解释:
x,y,z为向量,任意长度。
2.4.1 二维网格
library(plot3D)x <- c(-1 , 0, 1)y <- 1 : 4 # x,y长度不等# 2维网格M <- mesh(x, y)class(M); # 结果为列表,元素为x,y# 使用with函数计算,因为是二维数据源,所以返回一个矩阵V <- with (M, x/2 * sin(y)); class(V)# 与向量外积计算结果一样V2 <- outer(x, y, FUN = function(x, y) x/2*sin(y)) # outer内的Fun参数与with内的Fun参数一致
2.4.2 三维网格
library(plot3D)x <- y <- z <- c(-1, 0, 1)# 三维网格M <- mesh(x, y, z)class(M) # 返回列表# with后处理,返回1个数组V <- with(M, x/2 * sin(y) * sqrt(z + 2))class(V)# 使用坐标数据绘制三维散点图scatter3D(M$x, M$y, M$z, colvar = V, pch = "G", cex = 2, colkey = FALSE) # pch点型还可以指定字符,cex大小
2.5 tran3D()
与tran3d()
构建转换空间。使用pmat参数将一个绘图对象转换为转换空间
tran3d()
属于grDevices包。
tran3d()
可以查看小节: #基础图形中,##三维地形图persp()
,###tran3d()
上添加几何对象
tran3D()
如下:
library(plot3D)x <- y <- z <- c(-1, 0, 1)# 构建三维网格M <- mesh(x, y, z)pmat <- scatter3D(M$x, M$y, M$z, pch = "+", cex = 3, colkey = FALSE)# 构建转换空间,XY <- trans3D(x = c(-1, 1), y = c(-1, 1), z = c(-1, 1), pmat = pmat) # x, y, z表示坐标范围# 在转换空间中添加线lines(XY, lwd = 2, col = "blue")
2.6 plotdev()
,getplist()
等
getplist()
查询上一个绘图对象的参数组成的列表
seplist()
保留更改后的列表参数。
plotdev()
绘制更改参数后的绘图对象。
也可以直接更改观察角度,光照角度等参数。
还可以设定图形对象的显示范围。
selectplist()
筛选列表中的部件,根据自定义函数筛选, 可以筛选部件,也可以筛选图形显示范围。
比较复杂,
2.6.1 getplist()
与setplist()
library(plot3D)# 随便绘个图coord_2 <- data.frame(x = c(1, 4, 6, 2), y = c(1, 3, 7, 4), z = c(1, 1, 3, 3))polygon3D(coord_2$x, coord_2$y, coord_2$z, col = "cyan", alpha = 0.5, border = "magenta", lwd = 4)# getplist函数检索绘图绘图参数列表plist <- getplist()names(plist) # 打印列表元素名称plist$poly # 列表索引# 手动更改列表中参数,由于R的深copy对象,plist并没有更改,而是更改复制的对象plist$poly$col <- "magenta" # 更改网格面颜色plist$poly$border <- "cyan" # 更改网格边框颜色# setplist更新列表参数,这是才保留更改plist列表中的参数setplist(plist)# 绘图参数更改的绘图对象plotdev()
2.6.2 selectplist()
library(plot3D)# 绘制很多个图层的图set.seed(421)polygon3D(runif(10), runif(10), runif(10), col = "red", alpha = 0.2, plot = FALSE, ticktype = "detailed", xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))set.seed(422)polygon3D(runif(10) * 0.5, runif(10), runif(10), col = "yellow", alpha = 0.2, plot = FALSE, add = TRUE)set.seed(423)polygon3D(runif(10) * 0.5 + 0.5, runif(10), runif(10), col = "green", alpha = 0.2, plot = FALSE, add = TRUE)set.seed(424)points3D(runif(10), runif(10), runif(10), col = "blue", add = TRUE, plot = FALSE)set.seed(425)segments3D(x0 = runif(10), y0 = runif(10), z0 = runif(10), x1 = runif(10), y1 = runif(10), z1 = runif(10), colvar = 1:10, add = TRUE, lwd = 3)# 索引绘图参数列表plist <- getplist()names(plist)# 自定义筛选部件和显示范围的函数SS <- function(x, y, z) { sel <- rep(TRUE, length.out = length(x)) sel[x < 0.5] <- FALSE # 删除x<0.5的数据 return(sel)}# 打印更改绘图对象,调用更改参数的函数。plot(x = selectplist(plist, SS), xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))
2.6.3 plotdev()
plotdev(...)
对已经存在的绘图对象进行缩放,切换视角,更改显示范围,更改透明度和阴影等处理。
参数解释:
* theta, phi, xlim, ylim, zlim, d, r, scale, expand,与persp()
中一致。
require(plot3D)par(mfrow = c(2, 2), mar = c(2, 2, 2, 2)) # 多图排版,2*2矩阵排列# 创建数据x <- seq(1, nrow(volcano), by = 2)y <- seq(1, ncol(volcano), by = 2)V <- volcano[x, y]# 创建绘图对象persp3D(z = V, col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))# 旋转plotdev(theta = 0)# 对曲面打光,设定打光方向,设定透明度plotdev(lighting = TRUE, lphi = 90, alpha = 0.6)# 局部放大: 就是设定局部的显示范围,更改视角plotdev(xlim = c(0.2, 0.6), ylim = c(0.2, 0.6), phi = 60)
#循环绘制多个视角require(plot3D)par(mar = c(2, 2, 2, 2))# equation of a sphereM <- mesh(seq(0, 2 * pi, length.out = 100), -seq(0, pi, length.out = 100))u <- M$xv <- M$yx <- cos(u) * sin(v)y <- sin(u) * sin(v)z <- cos(v)# 画第一个图层surf3D(x, y, z, colvar = z, theta = 45, phi = 20, bty = "b", col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1), xlim = c(-1.5, 1.5), ylim = c(-1, 2), zlim = c(-1.5, 1.5), plot = FALSE)# 增加1个图层,相当于第一个图层中的图形对象向y轴正向偏移1个单位surf3D(x, y + 1, z, colvar = z, add = TRUE, col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1), facets = FALSE, plot = FALSE)# 定义一个平面:z=0Nx <- 100Ny <- 100x <- seq(-1.5, 1.5, length.out = Nx)y <- seq(-1, 2, length.out = Ny)# 在z=0处绘制一个平面,给现有的绘图对象增加图层image3D(x = x, y = y, z = 0, add = TRUE, colvar = NULL, col = "green", facets = TRUE, plot = FALSE)# 定义一个平面:y=0x <- seq(-1, 1, length.out = 50)z <- seq(-1, 1, length.out = 50)# 在y=0处绘制一个平面,给现有的绘图对象增加图层image3D(x = x, y = 0, z = z, colvar = NULL, add = TRUE, col = NA, border = "green", facets = TRUE, plot = TRUE) # plot = TRUE,最后一个图层绘制后才一起显示出来 # 循环绘制不同视角的图形,共36个图形 for (angle in seq(0, 360, by = 10))# plotdev(theta = angle)
····
往期精彩:
R_插值_拟合_回归_样条
R_circlize包_和弦图(一)
R_circlize包_和弦图(二)
R_ggplot2基础(一)
R_ggplot2基础(二)
R_ggplot2基础(三)
R_ggplot2基础(四
)
····
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
相关阅读
VRay 3.6 for 3ds Max 2018渲染器64位汉化安装教程+破
V-Ray3.6是一款由专业的渲染器开发公司CHAOSGROUP开发的渲染软件,VRay是目前业界最受欢迎的渲染引擎,可以完美地集成到每个3D艺术家
SDK安装以及编译1、下载SDK,地址如下:http://www.ogre3d.org/download/sdk2、安装SDK,直接解压到相应目录,如D:/ogreSDK3、我用的是1
我们知道,Android的开放性赢得了一大票硬件厂商的支持,但也造成了Android设备硬件分化的问题。Android设备的硬件分化在很大程度上