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

очень новый вопрос, но, скажем, у меня есть такие данные:

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)
  )

как я могу построить графики временных рядов var0 и var1 на том же графике, с date по оси X, используя ggplot2? Бонусные очки, если вы делаете var0 и var1 различные цвета, и могут включать в себя легенду!

Я уверен, что это очень просто, но я не могу найти никаких примеров.

4 ответов


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

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

общий подход заключается в преобразовании данных в длинном формате (используя melt() пакета reshape или reshape2) или gather() С 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()

ggplot2 output


вам нужно, чтобы данные были в формате" высокий "вместо" широкий " для ggplot2. "широкий" означает наличие наблюдения в строке с каждой переменной в качестве другого столбца (как у вас сейчас). Вам нужно преобразовать его в" высокий " формат, где у вас есть столбец, который сообщает вам имя переменной и другой столбец, который сообщает вам значение переменной. Процесс перехода от широкого к высокому обычно называют "плавлением". Вы можете использовать tidyr::gather расплавить ваши данные кадр:

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()

multiple series ggplot2

просто чтобы очистить data это ggplot потребляет после трубопровода его через gather выглядит так:

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

используя ваши данные:

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))

создать сжатую версию что ggplot() хотел бы работать с:

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

в этом случае производить stacked было довольно легко, так как нам нужно было сделать всего пару манипуляций, но reshape() и reshape и reshape2 может быть полезно, если у вас есть более сложный реальный набор данных для манипулирования.

как только данные находятся в этой сложенной форме, требуется только простой ggplot() вызов для создания сюжета вы требуется со всеми дополнительными функциями (одна из причин, почему пакеты более высокого уровня, такие как lattice и ggplot2 очень полезно):

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

Я оставлю это вам, чтобы привести в порядок метки оси, название Легенды и т. д.

HTH