一个非常新的问题,但是我说有这样的数据:
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
在同一图表上绘制时间序列date
和ggplot2
?如果您使var0
和var1
颜色不同,并且可以包含图例,则可获得奖励积分!
我确信这很简单,但我找不到任何例子。
答案 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()
答案 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()
要明确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()
以及reshape
和reshape2
可能对您有用有一个更复杂的实际数据集来操纵。
一旦数据处于这种堆叠形式,它只需要一个简单的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);
但是,我无法使用这种格式添加正确的图例。有人知道吗?
答案 5 :(得分:-1)
@Papalagui,该颜色应为aes,以使其成为图例的一部分。像这样:
geom_line(aes(x=date,y=var0,color='red'))