首页 文章

用R中的ggplot2绘制光谱数据(矩阵)

提问于
浏览
-2

我需要绘制一个光谱数据矩阵,这些行由2个因子变量分组,使用R中的 ggplot2 (或 lattice )包,因为它具有分面功能 .

考虑从 pls 包中获得带有光谱数据(矩阵) DS$NIR 的数据框 DS

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]]))
  • 线颜色应取决于因子 Group 的等级 .

  • 线条应该是半透明的 .

  • 每个颜色组(即每个级别的因子 Group )都应该有一条实心的不透明线,表示该组的平均值(或中值) .

  • 应将每个级别的因子 Type 绘制在单独的方面中 .

我发现了一个example,如何绘制光谱数据,但是我很难理解并使代码适应我的情况 .

1 回答

  • 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

相关问题