2016-07-28 6 views
1

Ich möchte eine vertikale zu einem geom_freqpoly hinzufügen, wo die x-Achsen-Position der Linie nach dem Trend der Kurve bestimmt werden soll. Insbesondere suche ich nach der Stelle der X-Achse, an der die Kurve abflacht - der letzte Wendepunkt.Hinzufügen einer vertikalen Linie zu einem geom_freqpoly-Plot nach den Daten

Zur Veranschaulichung:

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

gibt dieses Grundstück: enter image description here

Ich will x eine vertikale Linie hinzufügen at = ~ 2,5 enter image description here zu bekommen:

Also meine Frage ist, wie zu tun Ich finde diesen letzten Wendepunkt, der den Standort der x-Achse bestimmt?

+0

Wäre der Wendepunkt nicht bei 2? Ihre Interpretation könnte auch argumentieren, dass 4 auch ein Wendepunkt ist, da es die letzte höchste Zahl ist. – Vedda

Antwort

1

Interessante Frage. Wenn ich richtig darüber nachdenke, suchen Sie den letzten Punkt mit einer gewissen Toleranz - sagen Sie 26. Das könnte ein bisschen ein Hack sein, aber es wird funktionieren und Sie können es für Ihre Daten ändern.

ggplot Setup

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

Flexion Punktfunktion

Der Sinn dieser Funktion ist der „Wendepunkt“ aus dem ggplot Modell oben definiert zurückzukehren, mit einer gegebenen Toleranz vom vorherigen Datenpunkt - sagen wir> = 26 - und gewünschte letzte Nummer vom Wendepunktvektor.

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]]) 
} 

New ggplot mit V-line: Toleranz 26 und letzten

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

enter image description here

New ggplot mit V-line: 26 Toleranz und zweiter von den letzten

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

enter image description here

Verwandte Themen