在同一图表上使用ggplot2将两个变量绘制为线条

时间:2010-09-23 09:53:40

标签: r ggplot2 graph time-series r-faq

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

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在x轴上使用var1在同一图表上绘制时间序列dateggplot2?如果您使var0var1颜色不同,并且可以包含图例,则可获得奖励积分!

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

6 个答案:

答案 0 :(得分:339)

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

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

答案 1 :(得分:331)

一般方法是将数据转换为长格式(使用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

答案 2 :(得分:29)

您需要将数据放入&#34; tall&#34;格式而不是&#34;宽&#34;对于ggplot2。 &#34;宽&#34;表示每行观察一次,每个变量作为不同的列(就像你现在一样)。您需要将其转换为&#34; tall&#34;格式,其中有一列告诉您变量的名称,另一列告诉您变量的值。从宽到高的过程通常被称为&#34;融化&#34;。您可以使用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 如下所示:

<table>
@foreach (var mylink in Model.links) 
{
   var faviconOfPage = //Get Url of favicon > example: favicon of subpage.mycompany.com
   <tr>
       <td><a href="@(mylink.url).ToString()">@mylink.name</a></td>
       <td><img src="@faviconOfPage"></td>
   </tr>
}
</table>

答案 3 :(得分: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非常简单,因为我们只需要进行一些操作,但reshape()以及reshapereshape2可能对您有用有一个更复杂的实际数据集来操纵。

一旦数据处于这种堆叠形式,它只需要一个简单的ggplot()调用即可生成所需的所有附加内容(更高级别绘图包如lattice和{}的一个原因{1}}非常有用):

ggplot2

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

HTH

答案 4 :(得分:4)

我对R还是陌生的,但是试图了解ggplot的工作原理,我想我有另一种方法。我只是分享可能不是一个完整的完美解决方案,而是要添加一些不同的观点。

我知道ggplot可以更好地与数据帧配合使用,但是有时知道不使用数据帧就可以直接绘制两个向量有时也很有用。

加载数据。原始日期向量的长度为100,而var0和var1的长度为50,因此我仅绘制可用数据(前50个日期)。

.pro

绘图

// views.py //

def refreshSession(request):
    sesAlarm = request.session['alarm']
    return JsonResponse({'alm': sesAlarm})

def index(request):
    request.session['alarm'] = 0

    t = Thread(target = threadFunction, args=(request,))
    t.daemon = True
    t.start()

    context={}
    return HttpResponse(template.render(context, request))

def threadFunction(request):
    while True:
        request.session['alarm'] += 1
        time.sleep(1)


// JS //

var idAlarm = setInterval(function(){
        $.ajax({
          type:"POST",
          url:"/app/update_session/",
          cache: 'false',
          success: function(data) {
            alert(data.alm);
          }
        });
      }, 5000);

enter image description here

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

答案 5 :(得分:-1)

@Papalagui,该颜色​​应为aes,以使其成为图例的一部分。像这样:

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