在同一个图上使用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)
  )

如何使用ggplot2在同一图表上绘制时间序列var0var1 ,并在x轴上绘制date ? 如果您制作var0var1不同的颜色,并且可以包含图例,则var0奖励积分!

我确信这很简单,但我找不到任何例子。


对于少数变量,您可以使用自己手动构建图表:

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

的一般方法是将数据(利用转换为长格式melt()从包reshapereshape2 )或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输出


您需要将数据设置为“高”格式,而不是“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

只需要清楚ggplot在通过gather管道后消耗的data如下所示:

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
链接地址: http://www.djcxy.com/p/25023.html

上一篇: Plotting two variables as lines using ggplot2 on the same graph

下一篇: Not able to install xkcd fonts