Сюжет 3D в R: Классический спектральный бензин в зависимости от октана - PullRequest
0 голосов
/ 20 апреля 2019

Загрузите набор данных, содержащий спектральные интенсивности 60 образцов бензина при длине волны 401 и их октановые числа в пакете PLS.В моем примере:

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"

Я хотел бы построить трехмерное представление NIR в функции октана, мой график святого Грааля:

https://it.mathworks.com/help/stats/examples/partial-least-squares-regression-and-principal-components-regression.html

Но этот выходной график был создан в 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? Заранее спасибо!

1 Ответ

1 голос
/ 20 апреля 2019

Это дает что-то вроде графика 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])

screenshot

Есть несколько отличий:

  • Ручность системы координат.(Октан увеличивается к зрителю на графике rgl.) Вы можете изменить его в rgl, используя par3d("userMatrix" = par3d("userMatrix") %*% diag(c(-1, 1,1,1))), если вы действительно хотите стиль Matlab.
  • Я не рисовал метки осей.Значения по умолчанию в rgl довольно уродливы, и мне было лень использовать mtext3d для рисования более хороших.
  • Я не беспокоился о фоновых сетках.Они мне не нравятся, но если вы действительно хотите их, вы можете получить их с помощью grid3d.
  • Matlab не показывает перспективу.Если это то, что вы хотите, используйте par3d(FOV = 0).
  • Соотношение сторон отличается.Я думаю, что Matlab использует что-то вроде aspect3d(1, 1, 0.75).
  • цветов.rgl использует систему цветов R, поэтому, если вы можете найти более подходящую палитру, чем rainbow(1000), используйте ее.
  • Цена.
...