2017-05-29 7 views
2

anpassen Wie kann ich das method Argument von geom_smooth() von ggplot seine dynamischen zu gestalten und in einer Gruppe auf die Anzahl der Datenpunkte anpassen?Make geom_smooth() von ggplot2 Anzahl der Beobachtungen

Zum Beispiel, ich habe Daten in folgendem Format:

1. DATE PRODUCT SIZE 
2. 3/1/2017 A 10 
3. 3/2/2017 B 14 
4. 3/3/2017 C 25 
5. 3/4/2017 A 16 
6. etc. 

Diese Chart völlig in Ordnung und füge eine Löss fit zu jeder Gruppe (PRODUCT) mit dem folgenden Code (jede PRODUCT Gruppe hat etwa 20 Einträge) :

DT<-read.csv("TEST_DATA.csv") 

DT$DATE<-as.Date(DT$DATE, "%m/%d/%Y") 

myPlot<-ggplot(DT, aes(DATE, SIZE, color = PRODUCT)) 

myPlot + geom_point() + geom_smooth(method = "loess", se = FALSE) 

Doch lassen Sie uns sagen, dass ich in nur zwei Datenpunkte für eine vierte Produkt „D“ hinzufügen. Ich bekomme dann die folgenden Warnmeldungen und keine Loess-Fit-Linien werden zum Plot für jede Gruppe hinzugefügt.

Warning messages: 
1: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric, ... : span too small. fewer data values than degrees of freedom. 

Ich glaube, diese Warnung auf die Tatsache zurückzuführen ist, dass die Anzahl der Beobachtungen für das Produkt D weniger ist, dass die Freiheitsgrade für die Löss fit.

Einstellung method = "auto", wählt "loess" sowieso, so dass es nicht hilft und die Methode auf "lm" ist nicht was ich will.

Ich möchte das Folgende tun, kann es aber nicht ganz zum Laufen bringen und frage mich, ob jemand helfen kann?

myPlot + geom_point() + geom_smooth(data = DT, method = if(length(DT$PRODUCT)<5) {"lm"} else {"loess"}, se = F) 

Wie Sie sehen können, ich versuche geom_smooth() Verwendung method = "lm" wenn irgendwelche Gruppen weniger als 5 Beobachtungen haben zu müssen, da sonst die "loess" Methode verwenden. Aber ich kann nicht wirklich herausfinden, wie man auf die Anzahl der Beobachtungen jeder Gruppe innerhalb der geom_smooth() Funktion zugreifen kann.

Antwort

0

Es gibt ein n Argument (Anzahl der Punkte, an denen glatter bewertet werden soll), die Sie verwenden können. Details finden Sie unter stat_smooth.

EDIT: Sie den Plot dynamisch aufbauen kann:

sProduct <- unique(DT$PRODUCT) 
myPlot <- ggplot(DT, aes(DATE, SIZE, color = PRODUCT)) + geom_point() 

for (i in sProduct){ 

    sMethod <- ifelse(sum(DT$PRODUCT == i) <= 5, "lm", "loess") 
    myPlot <- myPlot + geom_smooth(data = subset(DT, PRODUCT == i), method = sMethod, se = FALSE) 
} 

myPlot 
+0

Hallo Constantinos, danke für Sie antworten - es scheint, dass die Option n nur darüber entscheidet, wie viele Auflösungspunkte verwendet werden, um den Löss fit zu zeichnen, aber dies bezieht sich nicht auf die Anzahl von zugrunde liegenden Beobachtungen. Ich würde gerne eine "lm" -Anpassung verwenden, wenn ich 5 Beobachtungen oder weniger habe, ansonsten verwende "Löss". – dme

+0

Hallo Constantinos, das macht genau das, was ich brauche. Vielen Dank! – dme

1

Sie könnten eine Funktion schreiben, die das Glättungsverfahren bedingt wählt, basierend auf minimale Gruppenlänge. Zum Beispiel:

library(tidyverse) 
theme_set(theme_classic()) 

conditional_smooth = function(data, xvar, yvar, group) { 

    p = ggplot(data, aes_string(xvar, yvar, colour=group)) + 
    geom_point() 

    min_group_length = split(data, data[, group]) %>% map_dbl(nrow) %>% min 

    # Choose smoothing method based on minimum group length 
    if(min_group_length >= 5) { 
    p + geom_smooth(method=loess) 
    } 
    else { 
    p + geom_smooth(method=lm) 
    } 

} 

Lassen Sie uns die Funktion ausführen. Für den iris Datenrahmen hat die kleinste Gruppe Länge 50.

conditional_smooth(iris, "Petal.Length", "Sepal.Length", "Species") 

enter image description here

Nun wollen wir eine Gruppe auf vier Werte verkürzen:

conditional_smooth(iris[c(1:50,97:150), ], "Petal.Length", "Sepal.Length", "Species") 

enter image description here

+0

Hallo eipi10, ähnlich Constantinos antworte deine Antwort auch genau das, was ich brauche. Danke für Ihre hilfreiche und klar porträtierte Lösung! – dme

Verwandte Themen