2012-10-27 23 views
5

Dire che ho questa cornice esempio datiCreazione di un grafico passo cumulativo in R

set.seed(12345) 
n1 <- 3 
n2 <- 10 
n3 <- 60 

times <- seq(0, 100, 0.5) 

individual <- c(rep(1, n1), 
       rep(2, n2), 
       rep(3, n3)) 

events <- c(sort(sample(times, n1)), 
      sort(sample(times, n2)), 
      sort(sample(times, n3))) 

df <- data.frame(individual = individual, events = events) 

che dà

> head(df, 10) 
    individual events 
1   1 72.0 
2   1 75.5 
3   1 87.5 
4   2 3.0 
5   2 14.5 
6   2 16.5 
7   2 32.0 
8   2 45.5 
9   2 50.0 
10   2 70.5 

Vorrei tracciare un grafico passo cumulativo degli eventi in modo che ricevo uno linea per individuo che sale di 1 ogni volta che un evento viene "incontrato".

Quindi, ad esempio, l'individuo 1 sarà da 0 a 72,0, quindi salirà a 1, fino a 75,5 quando diventa 2 e fino a 3 a 87,5 alla fine del grafico.

Quale sarebbe il modo più semplice per farlo?

+0

Vuol 'df $ contatore <- Ave (df $ individuale, df $ individuale, FUN = seq_along)' aiuto? Non sei sicuro di come vuoi che sia il tuo grafico ma questo dovrebbe darti il ​​"conteggio degli eventi" – vaettchen

+0

@vaettchen: sì, lo fa! – nico

risposta

4
df$step <- 1 

library(plyr) 
df <- ddply(df,.(individual),transform,step=cumsum(step)) 

plot(step~events,data=df[df$individual==1,],type="s",xlim=c(0,max(df$events)),ylim=c(0,max(df$step)),xlab="time",ylab="step") 
lines(step~events,data=df[df$individual==2,],type="s",col=2) 
lines(step~events,data=df[df$individual==3,],type="s",col=3) 

step plot

+0

Ottimo! Adoro le risposte della grafica di base :) Sarebbe perfetto se ci fosse un modo per avviare i grafici da 0 (credo che potrei semplicemente aggiungere uno 0 all'inizio). Suppongo che userò 'apply' su' unique (df $ Individual) 'per fare la trama in una chiamata di funzione. – nico

4

Uso ggplot2:

library(ggplot2) 

# Add step height information with sequence and rle 
df$step <- sequence(rle(df$individual)$lengths) 

# plot 
df$individual <- factor(df$individual) 
ggplot(df, aes(x=events, group=individual, colour=individual, y=step)) + 
    geom_step() 

enter image description here

+0

Questo è esattamente quello che stavo cercando. Aspetterò un paio di giorni prima di accettare questo per vedere se ci sono altre risposte (mi piacerebbe vedere una risposta usando la grafica di base). – nico

4

C'è anche la funzione stepfun nel pacchetto statistiche. Usando questo, si potrebbe utilizzare il metodo plot per quella classe di oggetti:

sdf <- split(df, individual) 

plot(1, 1, type = "n", xlim = c(0, max(events)), ylim = c(0, max(table(individual))), 
    ylab = "step", xlab = "time") 

sfun <- lapply(sdf, function(x){ 
    sf <- stepfun(sort(x$events), seq_len(nrow(x) + 1) - 1) 
    plot(sf, add = TRUE, col = unique(x$individual), do.points = FALSE) 
}) 

enter image description here