在 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) 更喜欢,使用它。
  • 价格。