计算R中两个图之间的面积

时间:2017-03-07 04:59:55

标签: r plot ggplot2

我试图找到在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()

这是情节: to find: area between barplot and under the curve

查找:条形图和曲线下方的区域(请忽略红色圆圈)。 任何人都知道如何应对这一挑战。我在SO中发现了几个关于计算区域的问题,但大多数问题都是针对ROC或仅仅是为了遮蔽该区域。任何建议/想法将不胜感激。

1 个答案:

答案 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