根据数据向geom_freqpoly图添加垂直线

时间:2016-07-28 22:01:12

标签: r ggplot2

我想在geom_freqpoly添加垂直线,其中线的x轴位置将根据曲线的趋势确定。具体来说,我正在寻找曲线变平的x轴位置 - 最后一个拐点。

举例说明:

library(ggplot2)
ggplot(data=diamonds, aes(carat))+geom_freqpoly(binwidth = 0.1)

给出了这个情节: enter image description here

我想在x = ~2.5 enter image description here处添加一条垂直线来获取:

所以我的问题是如何找到确定x轴位置的最后一个拐点?

1 个答案:

答案 0 :(得分:1)

有趣的问题。如果我正确地考虑这个问题,那么你正在寻找具有一定容忍度的最后一点 - 比方说26。这可能有点像黑客攻击,但它会起作用,你可以根据你的数据进行修改。

ggplot setup

library(ggplot2)
b <- ggplot(data=diamonds, aes(carat)) + geom_freqpoly(binwidth = 0.1)

拐点功能

此功能的目的是返回&#34;拐点&#34;来自上面定义的ggplot模型,具有来自先前数据点的给定容差 - 例如&gt; = 26 - 以及来自拐点向量的所需最后数字。

get_infl <- function(ggplot_model, tolerance, last){
  bg <- ggplot_build(ggplot_model)
  dat <- bg$data[[1]]
  y <- dat$y
  x <- dat$x
  loc <- tail(which(diff(y)>=tolerance),10)+1L
  newloc <- loc[[length(loc) - last + 1]]
  return(x[[newloc]])
}

带有V-line的新ggplot :容差26和最后

ggplot(data=diamonds, aes(carat)) + 
  geom_freqpoly(binwidth = 0.1) + 
  geom_vline(xintercept = get_infl(b, 26, 1), color = "red")

enter image description here

带有V-line的新ggplot :公差26,距离最后一秒

ggplot(data=diamonds, aes(carat)) + 
  geom_freqpoly(binwidth = 0.1) + 
  geom_vline(xintercept = get_infl(b, 26, 2), color = "red")

enter image description here