首页 > 解决方案 > 在 3d rstudio 中绘制曲线的连续系列(例如浓度、时间)

问题描述

我在一台机器上运行样本,我的输出是无单位系数y与速度的关系图x。我改变给定化合物的浓度以发现曲线如何随浓度变化z。是否有一个包可以绘制以这种方式设置的数据的 3d 图,即作为系列?

我发现 rstudio 中常用的 3d 图包(lattice、scatterplot3d、rgl 等)似乎只在变量是相同大小的向量时才有效(即每个点都是一个样本):

常见示例 x,y,z 数据设置

我的数据看起来更像这样,可以说 z 轴上的每个“切片”代表一个样本:

示例系列数据

我可以使用曲面图在 Excel 中相当容易地绘制它,但那里的图形很糟糕、丑陋且不灵活。

我的目标图的最佳示例是:

纽约时报样本 3d 图

资料来源:https ://www.nytimes.com/interactive/2015/03/19/upshot/3d-yield-curve-economic-growth.html?ref=economy&abt=0002&abg=0

以下是我的数据示例。第一列包含 x 值(速度),第一行包含 z 值(浓度),其他一切都是 y 值(任意无单位系数)。因此,第一个单元格 (0) 不是数据的一部分。

structure(list(...1 = c(0, 1.17721e-08, 1.48056166666667e-08, 
1.86639666666667e-08, 2.35371333333333e-08, 2.96521333333333e-08
), ...2 = c(0.3, 0.000326036, 0.000789132, 0.00132642, 0.00196508, 
0.00272198), ...3 = c(3, 0.00038811, 0.000915256, 0.00152748, 
0.00224812, 0.00311174), ...4 = c(6, 0.000289036, 0.000692406, 
0.00115582, 0.00169984, 0.00234574), ...5 = c(15, 0.000266082, 
0.000647076, 0.00109054, 0.00161336, 0.00224112), ...6 = c(30, 
0.000361498, 0.000818448, 0.00134682, 0.00196732, 0.00271138), 
...7 = c(100, 0.000296934, 0.000714832, 0.0012111, 0.0018063, 
0.0025273)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

我将 'dput()' 存储为 'example.data' 并运行以下命令以获取此错误消息:

#Store x and y as vectors, z as matrix 
> x <- c(example.data[-1,1])
> y <- c(example.data[1,-1])
> z <- as.matrix(example.data[-1,-1], nrow = 5, ncol = 6)
> persp3d(x, z, y)
Error in rgl.surface(x = NULL, y = list(...2 = 0.3, ...3 = 3, ...4 = 6,  : 
'y' length != 'x' rows * 'z' cols

我在这里做错了什么?x 和 y 分别与矩阵 z 具有相同的行数和列数

标签: rgraph3d

解决方案


使用您的样本数据:

dat <- structure(list(...1 = c(0, 1.17721e-08, 1.48056166666667e-08, 
1.86639666666667e-08, 2.35371333333333e-08, 2.96521333333333e-08
), ...2 = c(0.3, 0.000326036, 0.000789132, 0.00132642, 0.00196508, 
0.00272198), ...3 = c(3, 0.00038811, 0.000915256, 0.00152748, 
0.00224812, 0.00311174), ...4 = c(6, 0.000289036, 0.000692406, 
0.00115582, 0.00169984, 0.00234574), ...5 = c(15, 0.000266082, 
0.000647076, 0.00109054, 0.00161336, 0.00224112), ...6 = c(30, 
0.000361498, 0.000818448, 0.00134682, 0.00196732, 0.00271138), 
...7 = c(100, 0.000296934, 0.000714832, 0.0012111, 0.0018063, 
0.0025273)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

通常最好将数据保留为matrix, 并为此保留x, y, 和z分开。您的初始子集会起作用,除了tibble故意将其保持为类似frame的东西,而不是“正常”data.frame的单列/行子集,并且需要dat[...,drop=FALSE]避免类转换。

x <- dat[-1,1][[1]]
y <- as.numeric(dat[1,-1])
z <- as.matrix(dat[-1,-1])
rgl::persp3d(x,y,z)

3d 绘图

您也可以转换为matrix first,那么您就不会在这里受到tibble' 的保护。

dat <- as.matrix(dat)
x <- dat[-1,1]
y <- dat[1,-1]
z <- dat[-1,-1]

推荐阅读