Plotar duas variables ​​como linhas usando ggplot2 no mesmo gráfico

Uma pergunta muito nova, mas digamos que eu tenha dados como este:

test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) 

Como posso plotar as séries temporais var0 e var1 no mesmo gráfico, com a date no eixo x, usando ggplot2 ? Pontos de bônus se você fizer var0 e var1 colors diferentes, e pode include uma lenda!

Tenho certeza que isso é muito simples, mas não consigo encontrar nenhum exemplo por aí.

    Para um pequeno número de variables, você pode usar o gráfico manualmente:

     ggplot(test_data, aes(date)) + geom_line(aes(y = var0, colour = "var0")) + geom_line(aes(y = var1, colour = "var1")) 

    A abordagem geral é converter os dados em formato longo (usando melt() de package reshape2 ou reshape2 ) ou gather() do pacote tidyr :

     library("reshape2") library("ggplot2") test_data_long < - melt(test_data, id="date") # convert to long format ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) + geom_line() 

    saída ggplot2

    Você precisa que os dados estejam no formato “alto” em vez de “largos” para ggplot2. “wide” significa ter uma observação por linha com cada variável como uma coluna diferente (como você tem agora). Você precisa convertê-lo para um formato “alto”, onde você tem uma coluna que informa o nome da variável e outra coluna que informa o valor da variável. O processo de passar de largo a alto é geralmente chamado de “fusão”. Você pode usar o tidyr::gather para derreter seu quadro de dados:

     library(ggplot2) library(tidyr) test_data < - data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) test_data %>% gather(key,value, var0, var1) %>% ggplot(aes(x=date, y=value, colour=key)) + geom_line() 

    várias séries ggplot2

    Só para ficar claro, os data que o ggplot está consumindo depois de ggplot -lo via gather assim:

     date key value 2002-01-01 var0 100.00000 2002-02-01 var0 115.16388 ... 2007-11-01 var1 114.86302 2007-12-01 var1 119.30996 

    Usando seus dados:

     test_data < - data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100)) 

    Eu crio uma versão empilhada com a qual o ggplot() gostaria de trabalhar:

     stacked < - with(test_data, data.frame(value = c(var0, var1), variable = factor(rep(c("Var0","Var1"), each = NROW(test_data))), Dates = rep(Dates, 2))) 

    Neste caso, produzir stacked foi muito fácil, pois precisávamos fazer apenas algumas manipulações, mas reshape() e reshape2 e reshape2 poderiam ser úteis se você tivesse um dataset reais mais complexo para manipular.

    Uma vez que os dados estão nesta forma empilhada, requer apenas uma simples chamada ggplot() para produzir a plotagem desejada com todos os extras (uma razão pela qual os pacotes de plotagem de alto nível como lattice e ggplot2 são tão úteis):

     require(ggplot2) p < - ggplot(stacked, aes(Dates, value, colour = variable)) p + geom_line() 

    Deixo para você arrumar as etiquetas do eixo, título da legenda etc.

    HTH