3

我试图弄清楚如何做某事,ggplot2R似乎应该简单。这太简单了……我一生都无法弄清楚如何去做。我确定答案在 ggplot 文档中正盯着我看,但我无法……找到它。所以。我在这。

我经常有很多这样的数据集:

tdf <- data.frame('datetime' = seq(from=as.POSIXct('2012-01-01 00:00:00'), 
             to=as.POSIXct('2012-01-31 23:59:59'), by=1))
tdf$variable <- rep(c('a','b','c'), length.out=length(tdf$datetime))
tdf$value <- sample(1:10, length(tdf$datetime), replace=T)
> head(tdf)
             datetime variable value
1 2012-01-01 00:00:00        a     7
2 2012-01-01 00:00:01        b     3
3 2012-01-01 00:00:02        c     7
4 2012-01-01 00:00:03        a     8
5 2012-01-01 00:00:04        b     2
6 2012-01-01 00:00:05        c     3

也就是说:我有一个分类变量(一个因子)、一个该变量的值以及记录所述观察的时间戳。我想为给定时间“桶”绘制每个分类变量的值的总和 - 最好使用ggplot2. 我想这样做,而不必在可视化之前预先聚合它——也就是说,我真的想要保持数据集不变并传递参数以ggplot2按时聚合它的灵活性。然而,我完全糊涂了。上的文档geom_line说用来stat='identity'获取价值的总和,但是一旦我这样做了,我就不能再定义任何类型的 bin。如果我使用stat_summary,我经常根本不会得到情节。我得到的最接近的是:

tdf$variable <- factor(tdf$variable)

vis <- ggplot(tdf, aes(x=datetime, y=value, color=variable))
vis <- vis + geom_line(stat='identity')
vis <- vis + scale_x_datetime()

...至少打印一个图,其中一行对应于每个因子的值...按秒。如果不做大量工作来预先聚合数据,我就无法binsum(value)一个小时、一天或一周内将其用于操作。

帮助?

编辑:向任何 R 会话因该测试数据而窒息的人表示歉意。我已经把它剪回来了。

4

1 回答 1

4

好吧,我想这就是你想要的。我已经大大减少了您的数据集,发布的数据集对于测试这些东西来说太大了。

tdf <- data.frame('datetime' = seq(from=as.POSIXct('2012-01-01 00:00:00'), to=as.POSIXct('2012-01-01 00:10:59'), by=1))
tdf$variable <- rep(c('a','b','c'), length.out=length(tdf$datetime))
tdf$value <- sample(1:10, length(tdf$datetime), replace=T)
tdf$variable <- factor(tdf$variable)

vis2 <- ggplot(tdf, aes(datetime, color=variable)) + 
geom_bar(binwidth=5,aes(weight=value),position="dodge") + 
scale_x_datetime(limits=c(min(tdf$datetime), max(tdf$datetime)))

geom_bar使用stat_bin,因此您可以更改您的垃圾箱。默认情况下,它会获取计数,但如果你想要总和,你可以weightaes(). 让我知道这是否没有回答您的问题。

顺便说一句,通过设置这个特定数据的方式,使用类似的东西来分离你的变量可能是有意义的facet,即:

vis2 <- ggplot(tdf, aes(datetime, fill=variable)) + 
geom_bar(binwidth=100,aes(weight=value),position="dodge") + 
scale_x_datetime(limits=c(min(tdf$datetime), max(tdf$datetime))) + 
facet_wrap(~variable)

否则,看起来变量可能跨越不同的时间段。

于 2013-03-04T22:16:46.067 回答