2012-03-08 11 views
16

Próbuję ustalić, czy możliwe jest połączenie między brakującymi wartościami za pomocą geom_line. Na przykład w poniższym linku brakuje wartości w czasie 3 w elemencie F. Chciałbym, aby w tym przypadku łączono czas 2 i 4. Czy istnieje sposób, aby to osiągnąć?Łączenie się z brakującymi wartościami za pomocą geom_line

https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg

Mam ramki danych wartości skumulowanych tak:

head(cumulative) 

    individual series Time  Value 
1   A  x 1 -1.008821 
2   A  x 2 -2.273712 
3   A  x 3 -3.430610 
4   A  x 4 -4.618860 
5   A  x 5 -4.893075 
6   A  x 6 -5.836532 

którego jestem kreślenia z:

ggplot(cumulative, aes(x=Time,y=Value, shape=series)) + 
    geom_point() + 
    geom_line(aes(linetype=series)) + 
    facet_wrap(~ individual, ncol=3) 
+0

Poprosiłem kolejne pytanie: http://stackoverflow.com/questions/27676179/connect-points-across-selected-nas-with-geom-line – PatrickT

Odpowiedz

33

odpowiedź Richie jest bardzo dokładny, ale chciałem pokazać coś prostszego. Ponieważ linie nie są rysowane do NA punktów, innym podejściem jest upuszczanie tych punktów podczas rysowania linii. To pośrednio powoduje liniową interpolację między punktami (jak robią to proste linie).

Korzystanie dfr z odpowiedzią Richiego, bez konieczności obliczania z kroku:

ggplot(dfr, aes(x,y)) + 
    geom_point() + 
    geom_line(data=dfr[!is.na(dfr$y),]) 

Zresztą w tym przypadku podzbiorów można zrobić dla całej sprawy.

ggplot(dfr[!is.na(dfr$y),], aes(x,y)) + 
    geom_point() + 
    geom_line() 
+0

Tak!To jest właśnie rozwiązanie, którego szukałem. Teraz moje polecenie wydruku jest: 'ggplot (skumulowany, aes (czas, wartość, kształt = seria)) + geom_point() + geom_line (dane = łączna [! Is.na (skumulowana wartość $),], aes (rodzaj linii = series)) + facet_wrap (~ individual, ncol = 3) ' I mój wykres wychodzi wygląda jak: http://farm8.staticflickr.com/7064/6969423337_125cee3cdd_b.jpg – patabongo

+0

Co zrobić, jeśli masz więcej niż jeden zestaw z 'y'? na przykład y1 = ruj (10), y2 = ruj (10), y3 = ruj (10) ... a wszystkie y mają NA w różnych miejscach. Czy to nadal będzie działać? –

+1

@BenS. Następnie musisz użyć pierwszej wersji, z osobnym wywoływaniem 'geom_line' dla każdej linii, a każda z nich zawierała argument' data', który usunął wpisy 'NA'. Zazwyczaj tego rodzaju wykresy są lepiej obsługiwane przez 'ggplot' z danymi stopionymi (długa forma), ale to zupełnie inna dyskusja. –

11

Linie nie są rysowane, jeśli wartość to NA. Trzeba je zastąpić, interpolując między brakującymi punktami. Istnieje wiele różnych algorytmów interpolacji, musisz poeksperymentować z kilkoma i zobaczyć, który najlepiej pasuje do twoich danych. W tym przykładzie zastosowano interpolację liniową przez interp1 w pakiecie pracma.

dane próbki:

dfr <- data.frame(
    x = 1:10, 
    y = runif(10) 
) 
dfr[c(3, 6, 7), "y"] <- NA 

krok interpolacji:

dfr$z <- with(dfr, interp1(x, y, x, "linear")) 

Porównaj działki:

ggplot(dfr, aes(x, y)) + geom_line() 
ggplot(dfr, aes(x, z)) + geom_line() 

Jeśli pokazując ten wykres dla innych osób, upewnij się, że wyraźnie zaznaczyć miejsca, w których zsyntetyzowałeś dane przez interpolację (może za pomocą kropkowanych linii).


Aktualizacja oparta na komentarz:
Można określić różne estetyki dla różnych geoms.

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = z)) 

Aby uwzględnić różne typy linii dla zaginionych/non-missing y, można zrobić coś takiego

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = y)) + 
    geom_line(aes(y = z), linetype = "dotted") 
+0

dzięki. W tym przypadku spiskuję punkty za pomocą geom_point, a następnie łączę je z geom_line. Wygląda na to, że będę musiał użyć oryginalnej ramki danych, aby narysować punkty, a następnie ramkę danych z interpolowanymi wartościami, aby narysować linie. – patabongo

Powiązane problemy