R直方图显示在每个箱中花费的时间

时间:2012-07-17 19:04:36

标签: r plot histogram

我正在尝试创建类似于the ones here的图:

Cadence distribution

基本上我想要一个直方图,其中每个箱子显示在该节奏范围内花费了多长时间(例如0-20rpm的1小时,21-40rpm的3小时等)

library("rjson") # 3rd party library, so: install.packages("rjson")

# Load data from Strava API.
# Ride used for example is http://app.strava.com/rides/13542320
url <- "http://app.strava.com/api/v1/streams/13542320?streams[]=cadence,time"
d <- fromJSON(paste(readLines(url)))

d$cadence(rpm)中的每个值都与d$time中的相同索引(从开始的秒数)配对。

值不一定一致(如果您将plot(x=d$time, y=d$cadence, type='l')plot(d$cadence, type='l')进行比较,可以看到)

如果我做最简单的事情:

hist(d$cadence)

..这会产生非常接近的东西,但Y值是“频率”而不是时间,并且忽略每个数据点之间的时间(因此0rpm段特别是代表不足)

1 个答案:

答案 0 :(得分:2)

您需要创建一个新列来说明样本之间的时间。

我更喜欢data.frames来列出这类东西,所以:

d <- as.data.frame(fromJSON(paste(readLines(url))))
d$sample.time <- 0
d$sample.time[2:nrow(d)] <- d$time[2:nrow(d)]-d$time[1:(nrow(d)-1)]

现在您已经有了采样时间,您可以简单地“重复”采样时间超过1的任何事物的节奏测量,并绘制直方图

hist(rep(x=d$cadence, times=d$sample.time),
     main="Histogram of Cadence", xlab="Cadence (RPM)",
     ylab="Time (presumably seconds)")

必然会有一个更优雅的解决方案,不会因非整数采样时间而分崩离析,但这适用于您的样本数据。

编辑:re:更优雅,通用的解决方案,你可以使用类似new.d <- aggregate(sample.time~cadence, data=d, FUN=sum)之类的东西来处理非整数采样时间,但是问题会变成直方图,看起来像频率表,但是具有非整数频率。经过一番探讨之后,我得出结论,你必须通过进一步将数据汇总到箱子中,然后用条形图显示它们来为这种情况滚动自己的直方图。