Построение спектральных данных на одном участке - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть несколько фреймов данных, где первый столбец (в конце заполненный NA) - это волновое число, а другие столбцы - мои переменные определенного волнового числа для нескольких наблюдений.

Есть ли возможность построить столбцы таким образом, чтобы в моем первом столбце содержались переменные для оси x, а другие - в один большой график с соответствующими значениями y?

Я уже пробовал "matplot" (в результате вместо цифр "числа"),

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

различные наборы "xyplot" (нет возможности дать более одного значения y), но ни один из них не работает (на моем уровне знаний по R).

Окончательный результат должен выглядеть так: this .

Спасибо за любую помощь!

1 Ответ

1 голос
/ 11 апреля 2019

Вы всегда можете сделать свою собственную функцию, чтобы делать это, я делаю такие функции на регулярной основе, когда ничто действительно не соответствует моим потребностям. Я собрал это довольно быстро, но вы можете адаптировать его к вашим потребностям.

# 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")

Результат:

A plot

EDIT

Я на самом деле нашел ваш набор данных в сети случайно, поэтому я также расскажу, как построить его, используя мой код выше.

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'")


Another plot

...