2016-07-28 99 views
1

我想添加一條垂直線到geom_freqpoly,其中線的x軸位置將根據曲線的趨勢確定。具體來說,我正在尋找曲線變平的x軸位置 - 最後一個拐點。根據數據將一條垂直線添加到geom_freqpoly圖

舉例說明:

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

給出了這樣的情節: enter image description here

我想在添加垂直直線x =〜2.5 enter image description here獲得:

所以我的問題是怎麼做的我找到了這個最後的拐點,它決定了X軸的位置?

+0

拐點是不是2?你的解釋也可能認爲4也是一個拐點,因爲它是最後一個數字。 – Vedda

回答

1

有趣的問題。如果我正確地思考這個問題,那麼您正在尋找具有一定寬容度的最後一點 - 例如26。這可能有點破解,但它會起作用,並且您可以對其進行修改以適合您的數據。

ggplot設置

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

拐點功能

此功能的點是從上述定義的ggplot模型,返回「拐點」與來自先前給定容限數據點 - 例如> = 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系列新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系列新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