我有一个频率表(频率,值),并希望将其绘制为ggplot2中的直方图。 具体来说,我有每个值1 ... 1e6的频率,并希望休息1,2 ... 10,20 ... 100,200 ... 1000 ...
该表是根据庞大的数据集计算出来的,这就是为什么在this one等答案中建议使用rep
不是一种选择。
这是一个最小的例子:
library(ggplot2)
data <- data.frame(count=(runif(1000) * 100), value=1:1000)
repdata <- data.frame(value=rep(data$value, data$count))
print(ggplot(repdata) + aes(x=value) + scale_x_log10() +
geom_histogram(binwidth=0.1))
如何在不使用repdata
行的情况下创建这样的图?
是否有一个聚合函数,它接受一个数据框和一个中断列表?
答案 0 :(得分:2)
啊,直到现在我才发现我不必使用休息列表;我可以简单地从值计算bin索引并使用现有的聚合:
binw <- 0.1
data$bin <- floor(log10(data$value) / binw)
hdata <- aggregate(count ~ bin, data, sum)
print(ggplot(hdata) +
aes(xmin=10^(bin * binw),
xmax=10^((bin + 1) * binw),
ymin=0,
ymax=count) +
scale_x_log10() +
geom_rect())