【问题标题】:Plotting spectral data in one plot using R使用 R 在一张图中绘制光谱数据
【发布时间】:2019-08-31 19:11:32
【问题描述】:

我有多个数据框,其中第一列(最后用 NA 填充)是波数,其他列是我的多个观察的特定波数的变量。

是否有可能以我的第一列包含 x 轴变量而另一列与它们各自的 y 值绘制成一个大图的方式绘制列?

我已经尝试过“matplot”(结果是“数字”而不是点),

matplot(df[,1],df[,3:5],xlab = "Wavelength [nm]", ylab = "Absorbance")

不同的“xyplot”集(不可能给出一个以上的 y 值),但似乎都不起作用(根据我对 R 的知识水平)。

最终的结果应该是这样的:

感谢您的帮助!

【问题讨论】:

  • 您可以尝试按照here 的描述将数据重塑为长格式,然后使用 ggplot2-package。要获得更详细的帮助,请发布一些示例数据。在控制台中输入dput(df);这会将数据输出为您可以在此处发布的文本。

标签: r plot spectral


【解决方案1】:

您可以使用pavo R 包,该包用于处理光谱数据(完全公开,我是维护者之一):

library(pavo)

df <- t(read.csv("http://openmv.net/file/tablet-spectra.csv", header = FALSE))
df <- df[-1, ]
df <- apply(df, 2, as.numeric)
df <- cbind(wl = seq_len(nrow(df)),
            df)

df <- as.rspec(df)
#> wavelengths found in column 1

plot(df, ylab = "Absorbance", col = rainbow(3))

reprex package (v0.3.0) 于 2019 年 7 月 26 日创建

【讨论】:

    【解决方案2】:

    您总是可以创建自己的函数来执行此操作;当没有什么真正适合我的需要时,我会定期创建此类函数。 我很快就把它放在一起,但你可以根据自己的需要进行调整。

    # generate data
    set.seed(6)
    n <- 50
    dat <- data.frame(x1=seq(1,100, length.out = n), 
                      x2=seq(1,20, length.out = n)+rnorm(n),
                      x3=seq(1,20, length.out = n)+rnorm(n, mean = 3),
                      x4=seq(1,20, length.out = n)+rnorm(n, mean = 5))
    # make some NAs at the end
    dat[45:n,2] <- NA
    dat[30:n,3] <- NA
    
    
    
    
    plot_multi <- function(df, x=1, y=2, cols=y,
                           xlim=range(df[,x], na.rm = T),
                           ylim=range(df[,y], na.rm = T),
                           main="", xlab="", ylab="", ...){
      # setup plot frame
      plot(NULL, 
           xlim=xlim, 
           ylim=ylim,
           main=main, xlab=xlab, ylab=ylab)
    
      # plot all your y's against your x
      pb <- sapply(seq_along(y), function(i){
        points(df[,c(x, y[i])], col=cols[i], ...)
      })
    }
    
    plot_multi(dat, y=2:4, type='l', lwd=3, main = ":)",
               xlab = "Wavelength", ylab = "Absorbance")
    

    结果:

    编辑

    我实际上是偶然在网上找到了您的数据集,所以我将介绍如何使用上面的代码绘制它。

    file <- 'http://openmv.net/file/tablet-spectra.csv'
    spectra <- read.csv(file, header = FALSE)
    
    # remove box label
    spectra <- spectra[,-1] 
    
    # add the 'wavelength' and rotate the df
    # (i didn't find the actual wavelength values, but hey).
    spectra <- cbind(1:ncol(spectra), t(spectra)) 
    
    plot_multi(spectra, y=2:ncol(spectra), cols = rainbow(ncol(spectra)),
               type='l', main=":))", ylab="Absorbance", xlab = "'Wavelength'")
    
    
    

    【讨论】:

    • 谢谢,这正是我所需要的!接受我的投票,先生!简短的附加问题:如何更改单个轴的值,以便我可以“放大”到图中的特定间隔?我如何为此更改您的功能?再次非常感谢您!
    • 没问题,您可以根据要绘制的部分对数据框的行进行子选择。例如,如果您想绘制从 indices(不是波长)100 到 200 的值,您可以将 spectra[100:200, ] 提供给该函数,它会正常工作。我会让你弄清楚如何获得与波长跨度相对应的指数。
    • 我把它用于 x 轴,但我也用于 y 轴,就像在您编辑的绘图中一样:我如何将 y 轴设置固定为,比如说,“3- 5吸光度”,即使数据在“400-600波长”超过“5吸光度”?我希望我能解释我的意思;)
    • 啊,我更新了我的答案,以便该函数将 xlim 和 ylim 作为参数。您可以通过这些指定您想要的范围(作为值,这次不是索引)。为您的示例设置ylim=c(3,5), xlim=c(400,600)
    • 完美运行!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多