我试图找到在 R 中的条形图和曲线/正态图之间形成的区域。我将 ggplot2 包用于所有绘图目的,并使用 gglocator 来识别坐标。但是我无法弄清楚如何计算曲线之间的面积。条形图将保持不变,但曲线会改变(因为它是 df 的每一行)。
这是类似于我的问题的可重现代码:
require(ggplot2)
require(ggmap)
x1 <- seq(1, 1000, 25)
x2 <- rnorm(40, mean = 1, sd = 0.25)
df <- data.frame(x1, x2)
bardf <- data.frame(x = c(150,500,750),
height = c(1.4, 1.4, 1.2),
width = c(50,70,90))
p <- ggplot() +
geom_bar(data = bardf, aes(x,height, width = width), fill = "white", stat = "identity") +
geom_line(data = df, aes(x1,x2))
print(p)
gglocator()
查找:条形图和曲线下方之间的区域(请忽略红色圆圈)。任何人都知道如何应对这一挑战。我在 SO 中发现了几个关于计算面积的问题,但其中大部分是针对 ROC 的,或者只是关于对区域进行着色。任何建议/想法将不胜感激。
如果您用于approxfun
构建将插值点的函数,则可以用于integrate
计算面积。如果条形可以低于线,则pmin
可以返回较低的高度:
library(ggplot2)
set.seed(1) # returns a line partially higher than a bar
df <- data.frame(x1 = seq(1, 1000, 25),
x2 = rnorm(40, mean = 1, sd = 0.25))
bardf <- data.frame(x = c(150,500,750),
height = c(1.4, 1.4,1.2),
width = c(50,70,90))
ggplot() +
geom_col(data = bardf, aes(x, height, width = width), fill = "white") +
geom_line(data = df, aes(x1, x2))
# iterate in parallel over bardf to calculate all areas at once
mapply(function(x, h, w){
integrate(function(v){pmin(approxfun(df$x1, df$x2)(v), h)},
lower = x - .5 * w,
upper = x + .5 * w
)$value},
bardf$x, bardf$height, bardf$width)
#> [1] 52.40707 83.28773 98.38771
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句