2015-07-24 6 views
8

I zunächst den Datensatz habe wie unten gezeigt:Extrahierung einen Punkt aus ggplot plotten und es

ID A B Type Time Date 
1 12 13 R 23:20 1-1-01 
1 13 12 F 23:40 1-1-01 
1 13 11 F 00:00 2-1-01 
1 15 10 R 00:20 2-1-01 
1 12 06 W 00:40 2-1-01 
1 11 09 F 01:00 2-1-01 
1 12 10 R 01:20 2-1-01 
so on... 

ich versuchte, die ggplot des obigen Datensatz für A und B.

ggplot(data=dataframe, aes(x=A, y=B, colour = Type)) +geom_point()+geom_path() 

zu machen Problem:

  1. Wie füge ich eine subsetting Variable, die an schaut die ersten 24 Stunden nach jedem "F" -Punkt.

  2. Zur Zeit habe ich einen kontinuierlichen Datensatz [in Bezug auf die Zeit] geschrieben, aber mein ursprünglicher Datensatz ist nicht kontinuierlich. Wie kann ich meinen Datensatz in einem Intervall von 10 Minuten kontinuierlich machen? Ich habe Interpolation xspline() Funktion auf A und B verwendet, aber ich weiß nicht, wie meine Daten bezüglich der Zeit kontinuierlich eingestellt zu machen,

der markierten Teil unten ist das, was ich suche, ich diesen Datensatz extrahiert werden soll und dann eine neue ggplot Grundstück:

Von MarkusN Plots das ist, was ich suche:

Unter Tanne st Punkt als ‚F‘ Punkt und fahren 24 Stunden von diesem Punkt (da es keine 24 Stunden Daten hier so eingestellt, dass es so produzieren sollte):

Image

+0

wollen Sie A plotten vs B oder tun Sie A und B gegen die Zeit darstellen möchten? – Sarina

+0

@SarinaJ. Ja. Ich möchte den Zeitfaktor in meinem ggplot hinzufügen. Auch ich möchte das besagte Problem machen. (Nehmen Sie "F" als Ausgangspunkt und zeichnen Sie einen anderen ggplot für die nächsten 24 Stunden.) –

+1

Immer noch verstreut, um die gewünschte Ausgabe zu verstehen. Möchten Sie nur eine Teilmenge Ihres Datensatzes als Ergebnis haben oder möchten Sie eine Ebene über Ihre bereits vorhandenen hinzufügen? Können wir einen Hinweis auf das gewünschte Ergebnis erhalten? –

Antwort

1

Zuerst erstellte ich Beispieldaten. Hoffe, es ist ähnlich wie Ihr Problem:

df = data.frame(id=rep(1:9), A=c(12,13,13,14,12,11,12,11,10), 
    B=c(13,12,10,12,6,9,10,11,12), 
    Type=c("F","R","F","R","W","F","R","F","R"), 
    datetime=as.POSIXct(c("2015-01-01 01:00:00","2015-01-01 22:50:00", 
          "2015-01-02 08:30:00","2015-01-02 23:00:00", 
          "2015-01-03 14:10:00","2015-01-05 16:30:00", 
          "2015-01-05 23:00:00","2015-01-06 17:00:00", 
          "2015-01-07 23:00:00")), 
    stringsAsFactors = F) 

Ihre erste Frage ist, die Daten plotten, die ersten 24 Stunden nach einem F-Punkt hervorheben. Ich habe dplyr und ggplot für diese Aufgabe verwendet.

library(dplyr) 
library(ggplot) 

df %>% 
    mutate(nf = cumsum(Type=="F")) %>% # build F-to-F groups 
    group_by(nf) %>% 
    mutate(first24h = as.numeric((datetime-min(datetime)) < (24*3600))) %>% # find the first 24h of each F-group 
    mutate(lbl=paste0(row_number(),"-",Type)) %>% 
    ggplot(aes(x=A, y=B, label=lbl)) + 
     geom_path(aes(colour=first24h)) + scale_size(range = c(1, 2)) + 
     geom_text() 

enter image description here Das Problem hierbei ist, dass die Farbe ändert sich nur an einigen Stellen. Eine Sache, mit der ich nicht zufrieden bin, ist die Verwendung von verschiedenen Linienfarben für Pfadabschnitte. Wenn first24h eine diskrete Variable ist, zeichnet geom_path zwei getrennte Pfade. Deshalb habe ich die Variable als numerisch definiert. Vielleicht kann jemand das verbessern?

library(zoo) 

full.time = seq(df$datetime[1], tail(df$datetime, 1), by=600) # new timeline with point at every 10 min 
d.zoo = zoo(df[,2:3], df$datetime)  # convert to zoo object 
d.full = as.data.frame(na.approx(d.zoo, xout=full.time)) # interpolate; result is also a zoo object 
d.full$datetime = as.POSIXct(rownames(d.full)) 

Mit diesen beiden Datenrahmen kombiniert, können Sie die Lösung bekommen:

Ihre zweite Frage zu einer Interpolation kann leicht mit dem Zoo-Paket gelöst werden. Jede F-F-Sektion wird in einem separaten Diagramm gezeichnet und nur die Punkte, die nicht länger als 24 Stunden nach dem F-Punkt sind, werden angezeigt.

df %>% 
    select(Type, datetime) %>% 
    right_join(d.full, by="datetime") %>% 
    mutate(Type = ifelse(is.na(Type),"",Type)) %>% 
    mutate(nf = cumsum(Type=="F")) %>% 
    group_by(nf) %>% 
    mutate(first24h = (datetime-min(datetime)) < (24*3600)) %>% 
    filter(first24h == TRUE) %>% 
    mutate(lbl=paste0(row_number(),"-",Type)) %>% 
    filter(first24h == 1) %>% 
    ggplot(aes(x=A, y=B, label=Type)) + 
     geom_path() + geom_text() + facet_wrap(~ nf) 

enter image description here

+0

Markus danke für deine Antwort. Allerdings gibt es in Ihrem Datensatz 4 'F' Punkte, was bedeutet, dass es 4 ggplots geben sollte, jeder ggplot beginnt mit dem 'F' Punkt bis zu den nächsten 24 Stunden. In diesem Fall haben Sie jedoch F-F verfolgt. Ich habe eine Grafik in meiner Frage (aus Ihrer Antwort) zum besseren Verständnis hinzugefügt. Kannst du mir dabei helfen? –

2

Ich habe versucht, die folgende, vielleicht Sie können eine Idee von hier bekommen. Ich empfehle Ihnen, zuerst eine Variable mit der bestellten Zeit zu haben (entweder in Minuten oder Stunden, in diesem Beispiel habe ich Stunden benutzt). Mal sehen, ob es hilft

#a data set is built as an example 
N = 100 
set.seed(1) 
dataframe = data.frame(A = cumsum(rnorm(N)), 
         B = cumsum(rnorm(N)), 
         Type = sample(c('R','F','W'), size = N, 
            prob = c(5/7,1/7,1/7), replace=T), 
         time.h = seq(0,240,length.out = N)) 
# here, a list with dataframes is built with the sequences 
l_dfs = lapply(which(dataframe$Type == 'F'), function(i, .data){ 
    transform(subset(.data[i:nrow(.data),], (time.h - time.h[1]) <= 24), 
      t0 = sprintf('t0=%4.2f', time.h[1])) 
}, dataframe) 

ggplot(data=do.call('rbind', l_dfs), aes(x=A, y=B, colour=Type)) + 
    geom_point() + geom_path(colour='black') + facet_wrap(~t0) 
+0

es hat nicht für mich funktioniert .. –

+0

Was hat nicht für Sie funktioniert? Das Beispiel, das ich mit simulierten Daten gegeben habe? Oder das Beispiel mit Ihren Daten? Haben Sie Ihre Zeitvariable korrekt umgewandelt? – marc1s

+0

Ich weiß es nicht. Ich habe das Funktionieren von Prob nicht bekommen ... !! Es ist repariert? –

Verwandte Themen