Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在一个图中绘制光谱数据_R_Plot_Spectral - Fatal编程技术网

R 在一个图中绘制光谱数据

R 在一个图中绘制光谱数据,r,plot,spectral,R,Plot,Spectral,我有多个数据帧,其中第一列(最后用NA填充)是波数,其他列是我的多个观测的特定波数变量 是否有可能以这样的方式绘制列:我的第一列保存x轴的变量,而另一列使用各自的y值绘制成一个大图 我已经尝试过“matplot”(结果是“数字”而不是点) 不同的“xyplot”集合(不可能给出多个y值),但似乎都不起作用(就我对R的知识水平而言) 最终结果应该是这样的 谢谢你的帮助 你可以自己做这个;当没有任何东西真正适合我的需要时,我会定期执行这些功能。 我很快就完成了,但你可以根据自己的需要调整 # gen

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

是否有可能以这样的方式绘制列:我的第一列保存x轴的变量,而另一列使用各自的y值绘制成一个大图

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

不同的“xyplot”集合(不可能给出多个y值),但似乎都不起作用(就我对R的知识水平而言)

最终结果应该是这样的


谢谢你的帮助

你可以自己做这个;当没有任何东西真正适合我的需要时,我会定期执行这些功能。 我很快就完成了,但你可以根据自己的需要调整

# 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")
#生成数据
种子(6)
n您可以使用R软件包,该软件包用于处理光谱数据(完全公开,我是维护人员之一):

库(pavo)

df您可以尝试将数据重塑为所述的长格式,然后使用ggplot2软件包。要获得更多详细的帮助,请发布一些示例数据。在控制台中键入
dput(df)
;这将输出的数据作为文本,你可以张贴在这里。谢谢,这正是我所需要的!请接受我的投票,先生!简短的附加问题:如何更改各个轴的值,以便“缩放”到绘图中的特定间隔?我该如何改变你的功能呢?再次非常感谢!没问题,您可以根据要打印的部分选择数据帧的行。例如,如果要绘制从索引(而不是波长)100到200的值,可以为函数指定
光谱[100:200,]
,它将正常工作。我会让你知道如何得到对应于波长范围的指数。我得到的是x轴的指数,但我的意思也是y轴的指数,就像在你编辑的图中:我如何将y轴设置固定在,比如说,“3-5吸光度”,即使数据超过“400-600波长”中的“5吸光度”?我希望我能解释我的意思;)啊,我更新了我的答案,使函数以xlim和ylim作为参数。您可以通过这些来指定所需的范围(作为值,而不是这次的索引)。为您的示例设置
ylim=c(3,5),xlim=c(400600)
。效果非常好!再次感谢!
# 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'")