Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中绘制三维数据_R_Plot_3d - Fatal编程技术网

在R中绘制三维数据

在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

我有一个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
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")