2015-09-17 98 views
-2

我需要繪製一個光譜數據矩陣,使用R中的ggplot2(或lattice)軟件包對兩行進行2個因子變量分組,因爲它具有分面功能。在R中繪製帶ggplot2的光譜數據(矩陣)

考慮從pls包具有光譜數據的數據幀DS(矩陣)DS$NIR

library(pls) 
data(gasoline) 
DS <-gasoline 

讓我們添加一些分組變量:

set.seed(0) 
DS$Type <- as.factor(sample(c("Training set","Validation set","Others"), 
          nrow(DS), 
          replace = TRUE)) 

DS$Group <- cut(DS$octane, 
        breaks = c(80,86,88,90), 
        labels = c("Low","Medium","High")) 

,看看數據:

str(DS) 

'data.frame': 60 obs. of 4 variables: 
$ octane: num 85.3 85.2 88.5 83.4 87.9 ... 
$ NIR : AsIs [1:60, 1:401] -0.050193 -0.044227 -0.046867 -0.046705 -0.050859 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr "1" "2" "3" "4" ... 
    .. ..$ : chr "900 nm" "902 nm" "904 nm" "906 nm" ... 
$ Type : Factor w/ 3 levels "Others","Training set",..: 1 2 3 3 1 2 1 1 3 3 ... 
$ Group : Factor w/ 3 levels "Low","Medium",..: 1 1 3 1 2 1 3 3 3 3 ... 

我需要繪製每一條路作爲單獨的行DS$NIR。 X軸值可以通過提取:

x <- as.numeric(gsub(" nm", "", dimnames(DS$NIR)[[2]])) 
  1. 的線的顏色應取決於因子Group的水平。
  2. 這些線條應該是半透明的。
  3. 每個顏色組(即因子Group的每個級別)都應該有一個不透明的實線,表示該組的平均值(或中值)。
  4. 因子Type的每個級別應繪製在一個單獨的方面。

我發現了一個example,光譜數據是如何繪製的,但對我來說理解和修改代碼非常困難。

+1

看看在hyperSpec包,它有許多的插圖詳細的例子 – baptiste

回答

1

在繪圖之前,您的數據有兩個主要問題。

首先,NIR列是一些奇怪的矩陣,不能很好地與其他函數一起玩。我們來修復:

DS <- cbind(DS, as.data.frame(unclass(DS$NIR))) 
DS$NIR <- NULL 

現在,數據很寬,而不是很長。讓我們添加一些dplyrtidyr

library(dplyr) 
library(tidyr)  
graphdat <- DS %>% mutate(row = row_number()) %>% 
        gather(nm, value, -octane, -Type, -Group, -row) %>% 
        mutate(nm = extract_numeric(nm)) 

現在很容易積:

library(ggplot2) 
ggplot(graphdat, aes(x = nm, y = value, group = row, color = Group)) + 
    geom_line() + 
    facet_grid(Type~.) 

enter image description here