在R中绘制三维数据
我有一个3D数据集:在R中绘制三维数据,r,plot,3d,R,Plot,3d,我有一个3D数据集: data = data.frame( x = rep( c(0.1, 0.2, 0.3, 0.4, 0.5), each=5), y = rep( c(1, 2, 3, 4, 5), 5) ) data$z = runif( 25, min = (data$x*data$y - 0.1 * (data$x*data$y)), max = (data$x*data$y + 0.1 * (data$x*data$y)) ) data
data = data.frame(
x = rep( c(0.1, 0.2, 0.3, 0.4, 0.5), each=5),
y = rep( c(1, 2, 3, 4, 5), 5)
)
data$z = runif(
25,
min = (data$x*data$y - 0.1 * (data$x*data$y)),
max = (data$x*data$y + 0.1 * (data$x*data$y))
)
data
str(data)
我想画出来,但是R alwyas的内置函数给出了错误
应增加“x”和“y”值
当我在互联网上搜索时,我发现当X和Y值的组合不是唯一的时,会出现此消息。但在这里它们是独一无二的
我尝试了一些其他的库,在那里它工作没有问题。但是我不喜欢绘图的默认样式(内置函数应该满足我的期望)
为什么内置函数不接受我的数据集?我认为下面的代码与您想要的非常接近
x <- c(0.1, 0.2, 0.3, 0.4, 0.5)
y <- c(1, 2, 3, 4, 5)
zfun <- function(a,b) {a*b * ( 0.9 + 0.2*runif(a*b) )}
z <- outer(x, y, FUN="zfun")
和一个类似于
persp(x, y, z)
我使用
lattice
包来处理我在R中绘制的几乎所有内容,它有一个与persp
对应的绘图,称为线框。让data
成为Sven定义它的方式
wireframe(z ~ x * y, data=data)
或者,这如何(中图6.3的修改):
此图像可以使用鼠标自由旋转和缩放,也可以使用其他命令进行修改,如果满意,可以使用rgl.snapshot
保存
rgl.snapshot("myplot.png")
如果您使用的是网格间隔和序列不能保证增加或唯一的“真实”数据(希望(x,y,z)
组合至少是唯一的,即使这些三元组是重复的),我建议使用akima
包从不规则网格插值到规则网格
使用您对数据的定义
:
library(akima)
im <- with(data,interp(x,y,z))
with(im,image(x,y,z))
但是当然,这可以通过将参数xo
和yo
传递给akima::interp
来覆盖,我不确定上面的代码为什么不能用于库rgl
,但是下面的链接有一个关于同一库的很好的例子。
在R中运行代码,您将获得一个漂亮的3d绘图,可以从各个角度旋转
########################################################################
##我个人研究中的另一个3d绘图示例,使用rgl库
########################################################################
#三维可视化设备系统
图书馆(rgl);
数据(火山)
暗淡(火山)
peak.height除了其他人的解决方案之外,我建议使用R
的软件包,因为这对我很有效
下面,我使用的是上面建议的重新格式化的数据集,从xyz三倍体到轴向量x和y以及矩阵z:
x <- 1:5/10
y <- 1:5
z <- x %o% y
z <- z + .2*z*runif(25) - .1*z
library(plotly)
plot_ly(x=x,y=y,z=z, type="surface")
我想知道答案。问题是我使用的是真实数据。在这里,您永远不知道创建数据的函数。我使用这个函数只是为了创建一个人工数据集。我想问题是你是否可以重新排列你的真实数据,这样z
就是一个矩阵,x
和y
向量。要使用persp
和image
以这种方式将z
定义为n
通过m
矩阵,其中n
,m
是x
,y
(定义为Henry所做的)。image(data$x,data$y,matrix(data$z,5,5))我稍微修改了命令,使其更为通用,并添加了“unique”-函数,因为在原始数据集中有一个相同x和y值的多个副本:image(unique(data$x),unique(data$y)、matrix(data$z、length(unique(data$x))、length(unique(data$y)))
Hi,我试图复制/粘贴您的代码,但最后没有发生任何事情。如何将其可视化?@ilFonta如果您使用的是RStudio,图形应该显示在查看器窗格中,而不是绘图窗格中。
p <- wireframe(z ~ x * y, data=data)
npanel <- c(4, 2)
rotx <- c(-50, -80)
rotz <- seq(30, 300, length = npanel[1]+1)
update(p[rep(1, prod(npanel))], layout = npanel,
panel = function(..., screen) {
panel.wireframe(..., screen = list(z = rotz[current.column()],
x = rotx[current.row()]))
})
x <- 1:5/10
y <- 1:5
z <- x %o% y
z <- z + .2*z*runif(25) - .1*z
library(rgl)
persp3d(x, y, z, col="skyblue")
rgl.snapshot("myplot.png")
library(akima)
im <- with(data,interp(x,y,z))
with(im,image(x,y,z))
> formals(akima::interp)[c("xo","yo")]
$xo
seq(min(x), max(x), length = 40)
$yo
seq(min(y), max(y), length = 40)
########################################################################
## another example of 3d plot from my personal reserach, use rgl library
########################################################################
# 3D visualization device system
library(rgl);
data(volcano)
dim(volcano)
peak.height <- volcano;
ppm.index <- (1:nrow(volcano));
sample.index <- (1:ncol(volcano));
zlim <- range(peak.height)
zlen <- zlim[2] - zlim[1] + 1
colorlut <- terrain.colors(zlen) # height color lookup table
col <- colorlut[(peak.height-zlim[1]+1)] # assign colors to heights for each point
open3d()
ppm.index1 <- ppm.index*zlim[2]/max(ppm.index);
sample.index1 <- sample.index*zlim[2]/max(sample.index)
title.name <- paste("plot3d ", "volcano", sep = "");
surface3d(ppm.index1, sample.index1, peak.height, color=col, back="lines", main = title.name);
grid3d(c("x", "y+", "z"), n =20)
sample.name <- paste("col.", 1:ncol(volcano), sep="");
sample.label <- as.integer(seq(1, length(sample.name), length = 5));
axis3d('y+',at = sample.index1[sample.label], sample.name[sample.label], cex = 0.3);
axis3d('y',at = sample.index1[sample.label], sample.name[sample.label], cex = 0.3)
axis3d('z',pos=c(0, 0, NA))
ppm.label <- as.integer(seq(1, length(ppm.index), length = 10));
axes3d('x', at=c(ppm.index1[ppm.label], 0, 0), abs(round(ppm.index[ppm.label], 2)), cex = 0.3);
title3d(main = title.name, sub = "test", xlab = "ppm", ylab = "samples", zlab = "peak")
rgl.bringtotop();
x <- 1:5/10
y <- 1:5
z <- x %o% y
z <- z + .2*z*runif(25) - .1*z
library(plotly)
plot_ly(x=x,y=y,z=z, type="surface")
plot_ly(z=volcano, type="surface")