Построение двух переменных в виде строк с использованием 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 разные цвета и можете включать легенду!

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

Ответ 1

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

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

Ответ 2

Общий подход состоит в том, чтобы преобразовать данные в длинный формат (используя 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

Ответ 3

Вам нужно, чтобы данные были в "высоком" формате вместо "wide" для 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()

несколько серий 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

Ответ 4

Использование ваших данных:

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

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

НТН

Ответ 5

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

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

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

ggplot() + geom_line(aes(x=date,y=var0),color='red') + geom_line(aes(x=date,y=var1),color='blue') + ylab('Values')+xlab('date')

Длина вектора исходной даты равна 100, тогда как var0 и var1 имеют длину 50, поэтому я только отображаю доступные данные (первые 50 дат).

enter image description here

Однако я не смог добавить правильную легенду, используя этот формат. Кто-нибудь знает как?