Столбцы графического цикла ggplot с совпадающим префиксом, но с другим суффиксом - PullRequest
0 голосов
/ 17 марта 2019

У меня есть большой фрейм данных, который содержит High, Low и High-Low для каждого столбца.У меня также есть столбец Base.Я хочу создать график для каждого набора префиксов, чтобы линейный график имел A_H, A_L, A_HL и Base, а затем то же самое для всех других соответствующих префиксов.

date     A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18    6   4   6   4   2   3   5   8   9    2    3    5    3
2/2/18    2   4   7   6   5   8   3   9   11   12   5    9    5
2/3/18    8   6   8   9   6   9   7   9   13   13   6    7    5

Я перепробовал несколько подходов без их работы.

GraphList <- c("A", "B", "C", "D")
for (i in seq_along(GraphList)){
    plot <- ggplot(df, aes(date)) +
        geom_line(aes(y=Base, colour='Base')) +
        geom_line(aes(y=paste0(i,"High"), colour='High')) +
        geom_line(aes(y=paste0(i,"Low"), colour='Low')) +
        geom_line(aes(y=paste0(i,"LS"), colour='LS')) 
    print(plot)

Но когда я делаю вышеизложенное, графики не вставляют префиксы имен из списка, он просто выплевывает 1Hи 1L, 2H и 2L и т. д. в виде плоских линий на соответствующих графиках.

Я также пытался

plot <- ggplot(df, aes(date)) +
        geom_line(aes(y=Base, colour='Base')) +
        geom_line(aes(y=df[, grepl("_H", colnames(df))], colour='High')) +
        geom_line(aes(y=df[, grepl("_L", colnames(df))], colour='Low')) +
        geom_line(aes(y=df[, grepl("_LS", colnames(df))], colour='LS')) 
    print(plot)

Используя этот метод, я получил ошибку

Don't know how to automatically pick the scale for object of type tbl_df/tbl/data.frame. Defaulting to continuous

Error: aesthetics must be either length 1 or the same as the data (63): y, colour, x

СпасибоВы заранее.

1 Ответ

1 голос
/ 17 марта 2019

Во-первых, мы можем ggplot сделать большую работу за нас, если данные преобразуются в «длинный» формат:

df <- read.table(text = 'date     A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18    6   4   6   4   2   3   5   8   9    2    3    5    3
                 2/2/18    2   4   7   6   5   8   3   9   11   12   5    9    5
                 2/3/18    8   6   8   9   6   9   7   9   13   13   6    7    5', header = T, stringsAsFactors = F)

library(tidyverse)
library(lubridate)

df.long <- df %>% 
  tidyr::gather(variable, value, -date, -Base) %>% 
  separate(variable, into = c('variable', 'measure'), sep = '_') %>% 
  mutate(date = mdy(date))

         date Base variable measure value
1  2018-02-01    3        A       H     6
2  2018-02-02    5        A       H     2
3  2018-02-03    5        A       H     8
4  2018-02-01    3        B       H     4
5  2018-02-02    5        B       H     4
6  2018-02-03    5        B       H     6
7  2018-02-01    3        C       H     6
8  2018-02-02    5        C       H     7
9  2018-02-03    5        C       H     8
10 2018-02-01    3        D       H     4

df.long перемещает «Base»в свой собственный столбец, значения которого повторяются для каждого уровня «переменная» (A, B, C, D) и «мера» (H, L, HL).Я также преобразовал столбец "date" в правильные данные Date, что снова позволит ggplot сделать больше за нас.

Для начала мы могли бы иметь все это на одном граненом графике:

g <- ggplot(data = df.long, aes(x = date, y = value, color = measure)) +
  geom_line() +
  geom_line(aes(y = Base), color = 'black') +
  facet_grid(facets = ~variable)
print(g)

enter image description here

Или мы могли бы использоватьцикл для создания нескольких отдельных объектов графика:

plots <- list()
for (i in unique(df.long$variable)) {
  plots[[i]] <- ggplot(data = filter(df.long, variable == i), aes(x = date, y = value, color = measure)) +
    geom_line() +
    geom_line(aes(y = Base), color = 'black')
}

plots[[1]]

enter image description here

...