339

一个非常新的问题,但是说我有这样的数据:

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

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

我敢肯定这很简单,但我找不到任何例子。

4

5 回答 5

412

对于少量变量,您可以自己手动构建绘图:

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))
于 2010-09-23T16:12:22.233 回答
395

一般的方法是将数据转换为长格式(使用melt()from packagereshapereshape2)或gather()/ pivot_longer()from tidyrpackage:

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 输出

另请参阅有关将数据从宽变长的问题。

于 2010-09-23T10:55:20.143 回答
38

对于 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

只是要清楚的dataggplot,通过管道传输后消耗的内容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
于 2016-09-20T09:21:47.797 回答
12

使用您的数据:

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非常容易,因为我们只需要进行几次操作,但是如果您有更复杂的真实数据集要操作,and 可能会很有reshape()reshapereshape2

一旦数据采用这种堆叠形式,它只需要一个简单的ggplot()调用即可生成您想要的带有所有附加功能的绘图(高级绘图包喜欢lattice并且ggplot2非常有用的一个原因):

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

我会留给你整理轴标签、图例标题等。

高温高压

于 2010-09-23T10:53:24.767 回答
9

我也是 R 新手,但试图了解 ggplot 是如何工作的,我想我有另一种方法来做到这一点。我只是分享可能不是一个完整的完美解决方案,而是添加一些不同的观点。

我知道 ggplot 可以更好地使用数据框,但有时知道您可以在不使用数据框的情况下直接绘制两个向量可能也很有用。

加载数据中。原始日期向量长度为​​ 100,而 var0 和 var1 的长度为 50,所以我只绘制可用数据(前 50 个日期)。

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

在此处输入图像描述

但是我无法使用这种格式添加正确的图例。有谁知道怎么做?

于 2019-01-23T11:16:02.233 回答