我试图找到在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或仅仅是为了遮蔽该区域。任何建议/想法将不胜感激。
答案 0 :(得分:2)
如果使用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