R和ggplot2:随时间建立三个分类变量的总和的线图

时间:2013-03-04 20:45:47

标签: r ggplot2

我正在试图弄清楚如何使用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以便按时聚合它。然而,我完全 flummoxed。 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()

...至少打印一个图,其中一行对应于每个因子的值......按秒。我无法将bin sum(value)操作,例如,一小时,一天或一周,而没有做大量工作来预先汇总数据。

帮助?

编辑:向R会话因此测试数据而窒息的任何人致歉。我把它剪掉了。

1 个答案:

答案 0 :(得分: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,因此您可以更改垃圾箱。默认情况下,它会获得计数,但如果您想要总和,则可以在weight中添加aes()参数。如果这没有回答你的问题,请告诉我。

BTW,通过设置这些特定数据的方式,使用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)

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