R ggplot2 Петля построения с неравными векторами длины - PullRequest
0 голосов
/ 25 октября 2018

У меня есть примерный фрейм данных с несколькими векторами неравной длины (то есть некоторые имеют длину 5 точек данных, некоторые имеют 3 и т. Д. У меня есть цикл, который генерирует ggplot для каждого столбца. Однако я не могу понять, как динамическисократить график при отсутствии данных.

Пример данных:

        date        X1        X2        X3
1 1997-01-31 0.6094410        NA 0.5728303
2 1997-03-03 0.7741195        NA 0.0582721
3 1997-03-31 0.7269925 0.5628813 0.8270764
4 1997-05-01 0.5471391 0.5381265 0.8678812
5 1997-05-31 0.8056487 0.4129166 0.6582061

Код до сих пор:

vars <- colnames(data[-1])
plots <- list()

for (x in 1:length(vars)) {
  plot[[x]] <- ggplot(data = data, aes_q(x = data[, 1], y = data[, x + 1])) + 
    geom_line()
}

Построение первого графика дает хороший результат:

График 1

Но, построение второго графика дает такую ​​короткую линию:

График 2

Как я могу изменить свой цикл так, чтобы второй график был таким:

Сюжет 3

Заранее спасибо! Любая помощь приветствуется

1 Ответ

0 голосов
/ 25 октября 2018

Прежде чем указать, какой столбец вы хотите использовать для оси Y, ggplot подготовится для сопоставления со всем фреймом данных.Поэтому, если вы просто введете ggplot(data, aes(x = date)), вы уже получите пустой график с этим диапазоном:

enter image description here

Так что если вы не хотите, чтобы некоторыеДля печати всего диапазона необходимо сначала отфильтровать набор данных по строкам, которые определены для столбца, который вы собираетесь использовать для значений y.Например, вы можете создать график X2, используя:

temp <- data[complete.cases(data[c(1,3)]), c(1,3)]
ggplot(temp, aes(x = date, X2)) + geom_line()

Мне нравится делать это, используя dplyr и tidyr:

library(dplyr); library(tidyr)
temp <- data %>% select(date, X2) %>% drop_na()
ggplot(temp, aes(x = date, X2)) + geom_line()

enter image description here

Чтобы сделать это для всех переменных, вот подход, использующий dplyr и tidyr с purrr:

library(purrr); library(dplyr); library(tidyr)
plots <- data %>% 
  # Convert to long form and remove NA rows
  gather(var, value, -date) %>%
  drop_na() %>%

  # For each variable, nest all the available data
  group_by(var) %>%
  nest() %>%

  # Make a plot based on each nested data, where we'll use the
  #   data as the first parameter (.x), and var as the second
  #   parameter (.y), feeding those into ggplot.
  mutate(plot = map2(data, var, 
                     ~ggplot(data = .x, aes(date, value)) +
                       geom_line() +
                       labs(title = .y, y = .y)))

# At this point we have a nested table, with data and plots for each variable:
plots
# A tibble: 3 x 3
  var   data             plot    
  <chr> <list>           <list>  
1 X1    <tibble [5 x 2]> <S3: gg>
2 X2    <tibble [3 x 2]> <S3: gg>
3 X3    <tibble [5 x 2]> <S3: gg>

# To make this like the OP, we can extract just the plots part, with
plots <- plots %>% pluck("plot")
plots

plots[[1]]
plots[[2]] # or use `plots %>% pluck(2)`
plots[[3]]

enter image description here enter image description here enter image description here

...