代码之家  ›  专栏  ›  技术社区  ›  fmark

在同一图形上使用ggplot2绘制两个变量作为直线

  •  264
  • fmark  · 技术社区  · 14 年前

    一个很新的问题,但假设我有这样的数据:

    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 不同的颜色,可以包括一个传说!

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

    6 回复  |  直到 6 年前
        1
  •  332
  •   Nakx hadley    6 年前

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

    ggplot(test_data, aes(date)) + 
      geom_line(aes(y = var0, colour = "var0")) + 
      geom_line(aes(y = var1, colour = "var1"))
    
        2
  •  328
  •   rcs    8 年前

    一般的方法是将数据转换为长格式(使用 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
  •  29
  •   RubenLaguna    8 年前

    对于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
    
        4
  •  12
  •   Gavin Simpson    14 年前

    使用您的数据:

    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
  •  3
  •   susopeiz    6 年前

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

    enter image description here

    但是,我无法使用此格式添加正确的图例。有人知道怎么做吗?

        6
  •  -1
  •   user2922935    6 年前

    @Papalagui的颜色应该是AES的,因为它是传说的一部分。这样地:

    geom_line(aes(x=date,y=var0,color='red'))