【问题标题】:R and ggplot2: Make line graph of sum of value for three categorical variables over timeR和ggplot2:随着时间的推移制作三个分类变量的值总和的折线图
【发布时间】:2013-03-04 20:45:47
【问题描述】:

我正试图弄清楚如何用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()

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

帮助?

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

【问题讨论】:

  • 你考虑过使用stat_function吗?它会平滑数据而不是分箱,但这实际上可能更适合您的目的(分箱之间没有急剧过渡)
  • (-1) 你真的应该考虑提供“更小”的数据进行测试。你杀死了我的 R 会话。
  • @DavidRobinson -- 没看过那个 -- 我会试一试。谢谢!
  • @Arun -- 抱歉。我已经收紧了。
  • @DavidRobinson 好吧,我对 stat_function 感到很困惑;我开始认为我只是不明白ggplot2 文档是如何编写的。有没有机会举个例子?

标签: r ggplot2


【解决方案1】:

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

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

顺便说一句,通过设置此特定数据的方式,使用 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)

否则它可能看起来像变量跨越不同的时间箱。

【讨论】:

  • 一个问题:binwidth 在这种情况下是什么意思?秒?分钟?有没有办法为binwidth 分配一个特定的时间值?关于刻面的好点——这绝对是我一直在考虑做的事情。
  • 在这个例子中是秒,因为在这个例子中你的数据是这样分解的。如果你每分钟都有一次观察,那就是几分钟。
  • 好的。接下来的问题是,binwidth=5 是指“5 秒的宽度”还是“5 次观察的宽度”?有没有办法按设定的时间分箱?
  • binwidth=5 表示宽度为 5 秒。您可以通过binwidth=60 进行检查,您会发现它每分钟都在损坏。
  • 是的,这很好用。非常感谢!我确实希望有一种方法可以使用折线图来做到这一点,但这...比我以前的要好得多。
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 2019-02-12
  • 1970-01-01
  • 2021-10-27
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多