2015-07-24 11 views
8

sto inizialmente avendo il set di dati come illustrato di seguito:estrazione di un punto da ggplot e tracciarla

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... 

ho cercato di rendere il ggplot del set di dati sopra per A e B.

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

Problema:

  1. Come faccio ad aggiungere una variabile sottoinsiemi che guarda le prime 24 ore dopo ogni punto "F".

  2. Per ora ho pubblicato un set di dati continui [rispetto al tempo] ma il mio set di dati originale non è continuo. Come posso rendere il mio set di dati continuo in un intervallo di 10 minuti? Ho usato interpolazione funzione xspline() su A e B, ma non so come fare il mio set di dati in continuo rispetto al tempo,

La parte evidenziata mostrato di seguito è quello che sto cercando, ho voler estrarre questo set di dati e quindi tracciare un nuovo ggplot:

da trame MarkusN questo è quello che sto cercando:

Prendendo abete st punto come punto di 'F' e 24 ore di viaggio da quel punto (poiché non v'è impostato disponibili dati hrs 24 qui quindi dovrebbe produrre in questo modo):

Image

+0

si desidera tracciare A vs B o vuoi tracciare A e B in funzione del tempo? – Sarina

+0

@SarinaJ. sì. Voglio aggiungere il fattore tempo nel mio ggplot. Anche io voglio fare il suddetto problema. (Prendendo 'F' come punto di partenza e disegnare un altro ggplot per le prossime 24 ore.) –

+1

Ancora in ritardo per capire l'output desiderato. Vuoi solo un sottoinsieme del tuo set di dati come risultato o vuoi aggiungere un livello in cima a quello che hai già. Possiamo avere qualche indicazione sul risultato desiderato? –

risposta

1

Prima ho creato i dati di esempio. Spero che è simile al vostro problema:

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) 

tua prima domanda è quello di tracciare i dati, mettendo in evidenza le prime 24 ore dopo un F-point. Ho usato dplyr e ggplot per questo compito.

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 Il problema qui è, che il colore cambia solo in alcuni punti. Una cosa di cui non sono contento è l'uso di colori di linea diversi per le sezioni di percorso. Se first24h è una variabile discreta, geom_path disegna due percorsi separati. Ecco perché ho definito la variabile come numerica. Forse qualcuno può migliorare questo?

La tua seconda domanda su un interpolazione può essere facilmente risolto con il pacchetto zoo:

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)) 

Con questi due dataframes combinati, si ottiene la soluzione. Ogni sezione F-F viene disegnata in un grafico separato e solo i punti non più lunghi di 24 ore dopo la visualizzazione del punto F.

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 grazie per la risposta. Tuttavia, con il set di dati, ci sono 4 punti "F", il che significa che dovrebbero esserci 4 ggplot, ogni ggplot inizia dal punto "F" alle 24 ore successive. Comunque in questo caso hai rintracciato F-F. Ho aggiunto una trama nella mia domanda (dalla tua risposta) per una migliore comprensione. Puoi aiutarmi in questo? –

2

ho provato quanto segue, forse puoi farti un'idea da qui. Ti consiglio di avere prima una variabile con il tempo ordinato (in minuti o ore, in questo esempio ho usato ore). Vediamo se è utile

#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

non ha funzionato per me .. –

+0

Cosa non ha funzionato per te? L'esempio che ho dato con dati simulati? O l'esempio con i tuoi dati? Hai trasformato correttamente la tua variabile temporale? – marc1s

+0

Non lo so. Non ho avuto il funzionamento di prob ... !! È risolto? –