2016-06-23 18 views
0

Ich habe eine Änderung df und ich gruppiere verschiedene Werte c. Mit ggplot2 ich sie mit dem folgenden Code plotte eine scatterplott mit mehreren linearen Regressionsgeraden (geom_smooth) IErstellen Sie dynamische Etiketten für geom_smooth Linien

ggplot(aes(x = a, y = b, group = c)) + 
    geom_point(shape = 1, aes(color = c), alpha = alpha) + 
    geom_smooth(method = "lm", aes(group = c, color = c), se = F) 

nun auf jeder geom_smooth Linie in der Handlung ein label mit den value der group c angezeigt werden soll bekommen. Das muss dynamisch sein, weil ich keinen neuen Code schreiben kann, wenn sich mein df ändert.


Beispiel: mein df sieht aus wie diese

a  b  c 
---------------- 
1.6 24 100 
-1.4 43 50 
1  28 100 
4.3 11 50 
-3.45 5.2 50 

Also in diesem Fall würde ich 3 geom_smooth Linien in der Handlung mit verschiedenen Farben.

Jetzt will ich einfach ein Text-Label auf dem Grundstück mit "100" neben dem geom_smooth mit der Gruppe c = 100 und eine Textbeschriftung mit "50" an die Leitung für die Gruppe c = 50, und so weiter hinzuzufügen ... als neue Gruppen erhalten eingeführt in der df, neue geom_smooth Linien sind geplottet und müssen markiert werden.


der gesamte Code für die Handlung:

ggplot(aes(x = a, y = b, group = c), data = df, na.rm = TRUE) + 
    geom_point(aes(color = GG, size = factor(c)), alpha=0.3) + 
    scale_x_continuous(limits = c(-200,2300))+ 
    scale_y_continuous(limits = c(-1.8,1.5))+ 
    geom_hline(yintercept=0, size=0.4, color="black") + 
    scale_color_distiller(palette="YlGnBu", na.value="white") + 
    geom_smooth(method = "lm", aes(group = factor(GG), color = GG), se = F) + 
    geom_label_repel(data = labelInfo, aes(x= max, y = predAtMax, label = label, color = label)) 

Antwort

1

Sie wahrscheinlich es tun können, wenn Sie den Speicherort auswählen möchten, dass Sie die markierten Linien. Unten, habe ich sie am rechten Ende jeder Zeile zu markieren, und verwenden ggrepel überlappende Beschriftungen zu vermeiden:

library(ggplot2) 
library(ggrepel) 
library(dplyr) 

set.seed(12345) 

df <- 
    data.frame(
    a = rnorm(100,2,0.5) 
    , b = rnorm(100, 20, 5) 
    , c = factor(sample(c(50,100,150), 100, TRUE)) 
) 

labelInfo <- 
    split(df, df$c) %>% 
    lapply(function(x){ 
    data.frame(
     predAtMax = lm(b~a, data=x) %>% 
     predict(newdata = data.frame(a = max(x$a))) 
     , max = max(x$a) 
    )}) %>% 
    bind_rows 

labelInfo$label = levels(df$c) 

ggplot(
    df 
    , aes(x = a, y = b, color = c) 
) + 
    geom_point(shape = 1) + 
    geom_smooth(method = "lm", se = F) + 
    geom_label_repel(data = labelInfo 
        , aes(x= max 
         , y = predAtMax 
         , label = label 
         , color = label)) 
+0

Dank, clevere Lösung! Ich bin ziemlich neu, aber es funktioniert nicht mit meinem DF, weil ich einige 'NA' in' a', 'b' und' c' habe. Ich konnte nicht vor deinem Code filtern (! Is.na (a))%>% '? – Max

+0

Ich kann auch nicht 'level (df $ c)' - es gibt NULL zurück (sollte etwa 10 Werte sein) – Max

+0

'levels (df $ c)' funktioniert nur, wenn die Variable ein Faktor ist (ich setze meins als Faktor). –

Verwandte Themen