我正在试图弄清楚如何使用ggplot2
和R
来做一些看起来应该真的简单的事情。这很简单......我不能为我的生活弄清楚如何去做。我肯定答案是在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会话因此测试数据而窒息的任何人致歉。我把它剪掉了。
答案 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()
参数。如果这没有回答你的问题,请告诉我。
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)
否则,变量可能看起来跨越不同的时间段。