2017-08-07 3 views
1

Ich versuche, die Beschriftungen mit den Werten einer glatten Linie auszurichten. Während andere Antworten, die ich gesehen habe, vorschlagen, eine Datenspalte vorhergesagter Werte zu erstellen, suche ich nach einer saubereren Alternative, die die Daten verwendet, die bereits für den ggplot produziert werden.ggplot: etikettierung von geom_smooth/stat_smooth-Werten bei korrektem Wert

Siehe Beispiel unten für das Problem:

require(tidyverse) 
require(ggrepel) 

set.seed(1) 
df <- data.frame(x = rep(1:100, 5), y = c(sample(1:20, 100, T), sample(21:40, 100, T), sample(41:60, 100, T), sample(61:80, 100, T), sample(81:100, 100, T)), group = rep(letters[1:5], each = 100)) 
df <- tbl_df(df) 

df %>% 
    ggplot(aes(x = x, y = y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text_repel(data = . %>% filter(x == max(x)), aes(x = x, y = y, label = group), nudge_x = 50) 

Misaligned labels

Gibt es irgendeine Art und Weise den glatten Linienwert bei max zu erhalten (x) ohne ggplot_build() oder einen anderen externen, mehrstufiges Ansatz?

Antwort

3

Ich bin nicht sicher, ob das wirklich eleganter ist, aber es ist alles in einer Leitung. Ich hatte die "repel" -Version nicht zur Hand, aber die Idee ist dieselbe.

library(broom) 

df %>% 
    {ggplot(., aes(x, y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text(data = group_by(., group) %>% 
        do(augment(loess(y~x, .))) %>% 
        filter(x == max(x)), 
      aes(x, .fitted), nudge_x = 5)} 

enter image description here

Sie müssen die Vorhersage des Löss glattere bei diesem letzten x-Wert zu erhalten, so dass Sie nur zweimal passen müssen. Wenn die Modellanpassung langsam ist, können Sie dies einmal, höher in der dplyr-Kette, tun und nur die Ausgabe für den Rest der Figur verwenden.

df %>% 
    group_by(group) %>% 
    do(augment(loess(y~x, .))) %>% 
    {ggplot(., aes(x, y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text(data = filter(., x == max(x)), 
      aes(x, .fitted), nudge_x = 5)} 
Verwandte Themen