[英]Plot spectroscopic data (a matrix) with ggplot2 in R
我需要绘制一个光谱数据矩阵,其中的行按 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
每个级别都应绘制在单独的方面。我找到了一个例子,如何绘制光谱数据,但我很难理解和调整代码以适应我的情况。
在绘图之前,您的数据有两个主要问题。
首先,NIR 列是一些奇怪的矩阵,不能很好地与其他函数配合使用。 让我们解决这个问题:
DS <- cbind(DS, as.data.frame(unclass(DS$NIR)))
DS$NIR <- NULL
现在,数据很宽,而不是很长。 让我们用一些dplyr
和tidyr
解决这个tidyr
:
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~.)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.