Построение нескольких переменных с одинаковыми именами из разных фреймов данных во временных рядах; ggplot2 tidyr - PullRequest
0 голосов
/ 05 июля 2018

Я начинаю с использования R и ggplot для визуализации данных временных рядов переменных среды. До сих пор я люблю возможности ggplot2 для визуализации данных, легко выбирая разные периоды и переменные для построения и определения эстетики. Но теперь я столкнулся с первой проблемой, которую я не смог по-настоящему гуглить:

  • Моя цель - построить несколько переменных из разных информационных фреймов с индивидуальной эстетикой (фиксированный период, одна и та же ось Y, разные цвета и т. Д.) В одном графике

У меня есть 8 фреймов данных («TreeA» - «TreeH»), структурированных как показано ниже, где TreeA - Имя фрейма данных, «Время» - время измерения, отформатированное в POSIXct формат и Tleaf, Tair и Tdiff - три из 16 переменных:

 TreeA
                         Zeit  Tleaf     Tair  Tdiff ........
       1: 2018-05-18 00:00:00 12.997 13.20000 -0.203   
       2: 2018-05-18 00:10:00 13.082 13.20000 -0.119     
       3: 2018-05-18 00:20:00 11.909 12.06700 -0.158   
       4: 2018-05-18 00:30:00 11.315 11.53300 -0.219     
       5: 2018-05-18 00:40:00 11.251 11.46700 -0.216

Я melt перевел DF на длинный формат, получив

TreeA_long
                      Time variable        value
    1: 2018-05-18 00:00:00    Tleaf        12.997000000
    2: 2018-05-18 00:10:00    Tleaf        13.082000000
    3: 2018-05-18 00:20:00    Tair         11.909
    4: 2018-05-18 00:30:00    Tair         11.315
    5: 2018-05-18 00:40:00    Tdiff         1.251

Исходя из этого, я успешно строил графики с функциями ggplot:

ggplot(subset(TreeA_long, variable %in% c("Tleaf","Tair","Tdiff")),
       aes(x=Time,
           y=value, color=variable)) +
  geom_line() +
  scale_x_datetime(limits=start.endKW21, labels = date_format("%d") , breaks = date_breaks("24 hours")) +
  scale_y_continuous(limits = c(5,55),breaks = seq(10,55, by = 2)) +
  labs(title="Mai/Juni Cbet1", x="Day", y="Temperature") +
  theme(legend.position='right') +
  scale_color_manual(values = c("Tleaf" = "green", "Tair" = "blue", "Tdiff" = "yellow"))

Я попытался добавить второй geom_line(data=TreeB_long) для построения переменных из второго Dataframe на том же графике. Он работал для построения всех переменных из TreeB, но, конечно, мне нужно сравнить те же переменные, а также я хочу указать эстетику (цвет линий, штриховые линии и т. Д. Для каждой переменной.

Итак, мой вопрос:

  • Как я могу сравнить TreeA с TreeB на одном графике?
  • Также я бы открыта для объединения различных Dataframes, но это не работает подключаться в длинном формате с одинаковыми именами переменных

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

Спасибо и хорошего дня! Konrad

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Таким образом, согласно предложению Микко Мартиллы, я связал все (уже загруженные 8 DataFrames (treeA, ..., treeF)) с одним, используя tibble::lst и dplyr::bind_rows, в результате чего получился новый DF:

Liste <- lst (treeA,treeB,treeC,treeD,treeE,treeG,treeH)
new   <- bind_rows(Liste, .id="Test")

    >         Test                Time  Tleaf     Tair   ....
    >     1: treeA 2018-05-18 00:00:00 12.997 13.20000 
    >     2: treeA 2018-05-18 00:10:00 13.082 13.20000 
    >     3: treeA 2018-05-18 00:20:00 11.909 12.06700 
.....
    >   300: treeH 2018-05-18 00:30:00 11.315 11.53300 
    >   301: treeH 2018-05-18 00:40:00 11.251 11.46700 

После этого с помощью reshape2::melt с определением двух столбцов как id.Vars выдает длинный Dataframe с 4 столбцами

long <-melt(new, id.vars = c("Time", "Test"))

     long
                           Time  Test variable        value
         1: 2018-05-18 00:00:00 treeA    Tleaf 12.997000000
         2: 2018-05-18 00:10:00 treeA    Tleaf 13.082000000
         3: 2018-05-18 00:20:00 treeA    Tleaf 11.909000000
...
       300: 2018-05-18 00:30:00 treeH    Tleaf 11.315000000
       301: 2018-05-18 00:40:00 treeH    Tleaf 11.251000000

окончательное объединение столбцов Zeit и Test на tidyr::unite приводит к длинному формату данных, включая все мои данные из 8 входных кадров данных:

long2 <- unite(long, variable, c(Test, variable), remove=TRUE)

long2
                       Zeit       variable        value
     1: 2018-05-18 00:00:00    treeA_Tleaf 12.997000000
     2: 2018-05-18 00:10:00    treeA_Tleaf 13.082000000
     3: 2018-05-18 00:20:00    treeA_Tleaf 11.909000000
...
   300: 2018-05-18 00:30:00    treeH_Tleaf 11.315000000
   301: 2018-05-18 00:40:00    treeH_Tleaf 11.251000000

Это все, что мне нужно для работы с ggplot2, чтобы он мог идентифицировать и загружать значения для черчения из разных источников. Если есть более простые способы добиться этого, дайте мне знать в комментариях. также я думаю, что могут быть решения, использующие больше функций базового пакета. Но так как мне нужно, чтобы все было сделано, я не против загрузить много пакетов. Обратите внимание, что данные, вставленные здесь, предназначены для визуализации структуры.

0 голосов
/ 09 июля 2018

Я думаю, что вам, вероятно, следует добавить наборы данных treeA-treeH, включая переменную индикатора для имени данных (например, dplyr::bind_rows(tibble::lst(treeA, treeB, <...>, treeH), .id = "data")), затем melt() и использовать переменную индикатора набора данных для построения графика.

Вот упрощенный пример. Для начала давайте прочитаем данные, которые вы даете:

txt <- "Date Time  Tleaf     Tair  Tdiff
2018-05-18 00:00:00 12.997 13.20000 -0.203
2018-05-18 00:10:00 13.082 13.20000 -0.119
2018-05-18 00:20:00 11.909 12.06700 -0.158
2018-05-18 00:30:00 11.315 11.53300 -0.219
2018-05-18 00:40:00 11.251 11.46700 -0.216"

treeA <- read.table(text = txt, header = TRUE,
                    stringsAsFactors = FALSE)

Ради примера я также создаю treeB набор данных, просто добавив немного шума к treeA:

library(dplyr)
library(ggplot2)

set.seed(1)
n <- nrow(treeA)

treeB <- treeA %>%
  mutate_if(is.numeric, function(x) x + rnorm(n))

Теперь мы можем добавить два набора данных с помощью bind_rows() и добавьте переменную, чтобы показать исходный фрейм данных.

tree <- tibble::lst(treeA, treeB) %>%
  bind_rows(.id = "data") %>%
  mutate(dttm = as.POSIXct(paste(Date, Time)))

Перед построением графика полезно преобразовать данные в длинную форму, как вы делали раньше:

tree_long <- reshape2::melt(tree, measure = c("Tleaf", "Tair", "Tdiff"))

Теперь мы готовы к сюжету. Выбор макета, который вы хотите использовать, будет Конечно, зависит от того, какой аспект данных вы хотите подчеркнуть; например, Если представляет интерес сравнение между различными наборами данных tree, Рекомендуется использовать фасетку для сравнения tree в каждой переменной:

ggplot(tree_long, aes(dttm, value, color = data)) +
  facet_wrap(~ variable, scales = "free_y", ncol = 1) +
  geom_line()

Создано в 2018-07-09 пакетом Представ (v0.2.0.9000).

...