Как расплавить и построить несколько наборов данных в разных диапазонах на одном наборе осей? - PullRequest
0 голосов
/ 15 июня 2019

Это моя первая публикация здесь, я надеюсь, что мой вопрос ясен и уместен.У меня есть набор данных, глава которого выглядит так:

   wl     ex421  wl     ex309  wl      ex284  wl      ex347
1 431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
2 432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
3 433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
4 434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
5 435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
6 436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977

и так далее.Столбцы 'wl' представляют длину волны, и существует четыре различных диапазона.Другие четыре столбца представляют измерения (нормализованные), выполненные в диапазонах «wl».Диапазоны тоже разной длины.Все они частично перекрываются где-то посередине набора данных.Чего мне нужно добиться, так это графика, показывающего все четыре набора данных «ex ###» на одном и том же наборе оси и нанесенных на график в соответствующих диапазонах.Ось X должна соответствовать всем четырем диапазонам 'wl'.Тем не менее, я пока не преуспел.

Когда в прошлом мне приходилось строить несколько наборов данных, подобных этой, я просто сливал данные, и это всегда работало.Примерно так:

df_melt <- melt(df, id.var = 'wl')

И тогда я бы нарисовал это так:

fluor_plt <- ggplot(fluor_ref2_melt, aes(x=wl,y=value,color=variable)) + 
geom_point(shape = 1, fill = NA) + geom_path(data = fluor_ref2_melt,size = 1) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
  scale_colour_manual(values = colvec)

Однако, потому что у меня есть несколько столбцов с именем 'wl', которые также имеют разныедиапазоны, то, что случается, - то, что R только берет первый столбец 'wl' и отбрасывает все другие.Затем он в основном сдвигает все значения 'ex ###' в этот диапазон, используя индекс строки ... так что я получаю график следующего кадра:

   wl     ex421    ex309    ex284      ex347
1 431 0.6168224 0.1267943 0.06392694 0.15220484
2 432 0.6687435 0.2416268 0.05631659 0.08961593
3 433 0.6583593 0.4665072 0.05327245 0.13134187
4 434 0.6832814 0.3576555 0.00000000 0.32432432
5 435 0.6427830 0.2194976 0.12328767 0.50308203
6 436 0.7393562 0.1866029 0.08675799 0.34660977

Излишне говорить, что это полностьюнеправильно ... Итак, один из способов обойти проблему - перейти в Excel и вручную переместить столбцы вверх и вниз, чтобы в кадре данных каждая строка соответствовала одному значению 'wl', независимо от того, есть ли связанные с ним измеренные значения илине.Это избавило от «сдвига» значений, но R по-прежнему отбрасывает столбцы «wl» после первого.Вместо того, чтобы получить совершенно неправильный сюжет, я получаю правильный раздел.Первый набор наблюдений (ex421) нанесен на весь его диапазон;части других видны там, где диапазоны перекрываются.Я смотрел на некоторые подобные случаи, о которых спрашивали здесь в прошлом, например: Измените кадр данных с широкого на длинный с повторяющимися именами столбцов в R .Но я новичок в R и не думаю, что смог бы полностью понять предложенные решения.Мне не удалось изменить мои данные так, как я хочу, чтобы они были изменены (сохраняя разные диапазоны 'wl' для разных наборов), и я понятия не имел, какие аргументы дать ggplot впоследствии.Я пытался использовать data.table, но тогда я не знаю, что дать его для value.name и variable.name.Повторюсь, что я хочу достичь, это то, что можно было бы получить, построив четыре набора данных в электронной таблице, создав один точечный график в Excel и добавив к нему четыре различных ряда.

Любая информация будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Я могу подумать об этом решении:

# data:
dt <- structure(list(wl = 431:436, 
     ex421 = c(0.6168224, 0.6687435, 0.6583593, 0.6832814, 0.642783, 0.7393562), 
     wl = 321:326, 
     ex309 = c(0.1267943, 0.2416268, 0.4665072, 0.3576555, 0.2194976, 0.1866029), 
     wl = 301:306, 
     ex284 = c(0.06392694, 0.05631659, 0.05327245, 0, 0.12328767, 0.08675799), 
     wl = 361:366, 
     ex347 = c(0.15220484, 0.08961593, 0.13134187, 0.32432432, 0.50308203, 0.34660977)), 
   row.names = c(NA,     -6L), 
   class = c("data.table", "data.frame"))

# get vectors with wl names
wls <- grep("wl", names(dt))

# get vectors with ex_numbers names
exs <- grep("ex", names(dt))

# reformat the data:
newDt <- cbind(stack(dt, select = wls), stack(dt, select = exs))

# Assign reasonable names:
names(newDt) <- c("wlNumber", "wlInd", "exValue", "exNumber")

Теперь данные готовы для построения любой командой:

ggplot(newDt, aes(x = wlNumber, y = exValue, color = exNumber))+geom_point()+geom_line()

Основным преимуществом этого подхода является то, что вы можетеразбить таблицу на множество столбцов.Это не имеет значения, пока их имя имеет"wl" на нем ("ex" для других переменных).

0 голосов
/ 15 июня 2019

Здесь я загружаю фрейм данных с вашими данными, следя за тем, чтобы разрешить повторные имена с check.names = F, в противном случае он будет переименовывать столбцы wl, чтобы они были различимыми:

df <- read.table(
  header = T, check.names = F,
  stringsAsFactors = F,
  text = "   wl     ex421  wl     ex309  wl      ex284  wl      ex347
 431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
 432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
 433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
 434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
 435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
 436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977")

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

library(tidyverse)
df2 <- bind_rows(
  df[1:2],
  df[3:4],
  df[5:6],
  df[7:8]
) %>%
  gather(variable, value, -wl) %>%
  drop_na()


ggplot(df2, aes(x=wl,y=value,color=variable)) + 
  geom_point(shape = 1, fill = NA) + 
  geom_path(size = 1) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...