在 R 中绘制 3D:octane 函数中的经典光谱汽油
Plot 3D in R: Classical spectral gasoline in function of octane
在 pls 包中加载包含 60 个汽油样品在 401 个波长下的光谱强度及其 octane 等级的数据集。在我的例子中:
library(pls)
#Data set
data(gasoline)
'data.frame': 60 obs. of 2 variables:
$ octane: num 85.3 85.2 88.5 83.4 87.9 ...
$ NIR : 'AsIs' num [1:60, 1:401] -0.0502 -0.0442 -0.0469 -0.0467 -0.0509 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr "1" "2" "3" "4" ...
.. ..$ : chr "900 nm" "902 nm" "904 nm" "906 nm"
我想根据 octane 绘制 NIR 的 3D 表示,我的圣杯图是:
但是这个输出图是在 matlab 中创建的,而不是在 R 中创建的。原始代码是 (https://it.mathworks.com/help/stats/examples/partial-least-squares-regression-and-principal-components-regression.html):
load spectra
whos NIR octane
[dummy,h] = sort(octane);
oldorder = get(gcf,'DefaultAxesColorOrder');
set(gcf,'DefaultAxesColorOrder',jet(60));
plot3(repmat(1:401,60,1)',repmat(octane(h),1,401)',NIR(h,:)');
set(gcf,'DefaultAxesColorOrder',oldorder);
xlabel('Wavelength Index'); ylabel('Octane'); axis('tight');
grid on
请在 R 中提出任何想法或类似 function/packages?
提前致谢!
这给出了类似 Matlab 图的东西:
library(rgl)
library(pls)
data(gasoline)
str(gasoline)
gasoline$ID <- seq(1:length(gasoline[,1]))
open3d()
x <- gasoline$octane
y <- gasoline$NIR
z <- gasoline$ID
plot3d(x, 1:ncol(y), y, type = "n", xlab = "", ylab = "", zlab = "")
cols <- rainbow(1000)[(x - min(x))/(max(x) - min(x))*999 + 1]
for (i in seq_along(x))
lines3d(x[i], 1:ncol(y), y[i,], col = cols[i])
有几点不同:
- 坐标系的旋向性。 (Octane 在 rgl 图中向观察者增加。)如果你真的想要 Matlab 风格,你可以使用
par3d("userMatrix" = par3d("userMatrix") %*% diag(c(-1, 1,1,1)))
在 rgl
中更改它。
- 我没有画轴标签。
rgl
中的默认值有点难看,我
懒得用mtext3d
画更好的
- 我没有理会背景网格。我不喜欢它们,但如果你真的想要它们,你可以用
grid3d
. 得到它们
- Matlab 不显示透视图。如果那是你想要的,请使用
par3d(FOV = 0)
.
- 纵横比不同。我认为 Matlab 使用的是
aspect3d(1, 1, 0.75)
. 之类的东西
- 颜色。
rgl
使用 R 颜色系统,所以如果你能找到一个调色板,你
比 rainbow(1000)
更喜欢,使用它。
- 价格。
在 pls 包中加载包含 60 个汽油样品在 401 个波长下的光谱强度及其 octane 等级的数据集。在我的例子中:
library(pls)
#Data set
data(gasoline)
'data.frame': 60 obs. of 2 variables:
$ octane: num 85.3 85.2 88.5 83.4 87.9 ...
$ NIR : 'AsIs' num [1:60, 1:401] -0.0502 -0.0442 -0.0469 -0.0467 -0.0509 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr "1" "2" "3" "4" ...
.. ..$ : chr "900 nm" "902 nm" "904 nm" "906 nm"
我想根据 octane 绘制 NIR 的 3D 表示,我的圣杯图是:
但是这个输出图是在 matlab 中创建的,而不是在 R 中创建的。原始代码是 (https://it.mathworks.com/help/stats/examples/partial-least-squares-regression-and-principal-components-regression.html):
load spectra
whos NIR octane
[dummy,h] = sort(octane);
oldorder = get(gcf,'DefaultAxesColorOrder');
set(gcf,'DefaultAxesColorOrder',jet(60));
plot3(repmat(1:401,60,1)',repmat(octane(h),1,401)',NIR(h,:)');
set(gcf,'DefaultAxesColorOrder',oldorder);
xlabel('Wavelength Index'); ylabel('Octane'); axis('tight');
grid on
请在 R 中提出任何想法或类似 function/packages? 提前致谢!
这给出了类似 Matlab 图的东西:
library(rgl)
library(pls)
data(gasoline)
str(gasoline)
gasoline$ID <- seq(1:length(gasoline[,1]))
open3d()
x <- gasoline$octane
y <- gasoline$NIR
z <- gasoline$ID
plot3d(x, 1:ncol(y), y, type = "n", xlab = "", ylab = "", zlab = "")
cols <- rainbow(1000)[(x - min(x))/(max(x) - min(x))*999 + 1]
for (i in seq_along(x))
lines3d(x[i], 1:ncol(y), y[i,], col = cols[i])
有几点不同:
- 坐标系的旋向性。 (Octane 在 rgl 图中向观察者增加。)如果你真的想要 Matlab 风格,你可以使用
par3d("userMatrix" = par3d("userMatrix") %*% diag(c(-1, 1,1,1)))
在rgl
中更改它。 - 我没有画轴标签。
rgl
中的默认值有点难看,我 懒得用mtext3d
画更好的 - 我没有理会背景网格。我不喜欢它们,但如果你真的想要它们,你可以用
grid3d
. 得到它们
- Matlab 不显示透视图。如果那是你想要的,请使用
par3d(FOV = 0)
. - 纵横比不同。我认为 Matlab 使用的是
aspect3d(1, 1, 0.75)
. 之类的东西
- 颜色。
rgl
使用 R 颜色系统,所以如果你能找到一个调色板,你 比rainbow(1000)
更喜欢,使用它。 - 价格。