2012-11-20 13 views
5

Sto spostando i miei grafici in ggplot. Ci siamo quasi, tranne per questo uno (codice ottenuto da questa previous question):Linee di riferimento paraboliche su ggplot

ggplot plot should look like this

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    lines(stax:endx, qnorm(1-perlin)*sqrt((stax:endx)-stax)) 
    lines(stax:endx, qnorm(perlin)*sqrt((stax:endx)-stax)) 
} 

#Build the plot area and draw the vertical dashed lines 
plot(betseq, rep(0, length(betseq)), type="l", ylim=c(-50, 50), main="", xlab="Trial Number", ylab="Cumulative Hits") 
abline(h=0) 
abline(v=35, lty="dashed") #Seg 1 
abline(v=185, lty="dashed") #Seg 2 
abline(v=385, lty="dashed") #Seg 3 
abline(v=485, lty="dashed") #Seg 4 
abline(v=585, lty="dashed") #Seg 5 

#Draw the % limit lines that correspond to the vertical dashed lines by calling the 
#new function dralim. 
dralim(0, 35, perlin) #Seg 1 
dralim(36, 185, perlin) #Seg 2 
dralim(186, 385, perlin) #Seg 3 
dralim(386, 485, perlin) #Seg 4 
dralim(486, 585, perlin) #Seg 5 
dralim(586, 701, perlin) #Seg 6 

posso mostrare quanto ho (non lontano):

ggplot(a, aes(x=num,y=s, colour=ss)) +geom_line() +stat_smooth(method="lm", formula="y~poly(x,2)") 

my attempt

Per essere chiari. Sto tracciando i miei dati sulle linee di riferimento (immagine in alto). L'immagine in basso mostra i miei dati e il mio scarso tentativo di ottenere le linee di riferimento (che ovviamente non ha funzionato).

risposta

3

Quello che stavi facendo è stato il montaggio di una parabola sui tuoi dati, non disegnando una parabola definita in precedenza. Non è troppo difficile adattare quello che dovevi a ggplot.

Stesso inizio come hai avuto (anche se betseq non viene effettivamente utilizzato ovunque)

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

non invece di una funzione che disegna linee, fanno una funzione che restituisce geom_line s (in una lista) che sei quello che volere. Esiste un aes(x=x, y=y) implicito che verrà fornito successivamente nella dichiarazione ggplot, ma questo definisce i punti dati che compongono le parabole.

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    c(geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(1-perlin)*sqrt((stax:endx)-stax))), 
    geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(perlin)*sqrt((stax:endx)-stax)))) 
} 

Per salvare ripetizione, definiscono la posizione delle linee verticali (edges), che può anche essere utilizzato per definire gli endpoint sinistro e destro delle parabole (ranges).

edges <- data.frame(x=c(0, 35, 185, 285, 485, 585, 700)) 
ranges <- data.frame(left = edges$x[-nrow(edges)], 
        right = edges$x[-1] + 1) 

Ora creare il ggplot. C'è un singolo geom_vline per disegnare tutte le linee verticali (dal momento che abbiamo definito le posizioni in un singolo set di dati). Il passo insolito è il looping sulla riga (indici) di ranges e chiamando dralim con i corrispondenti valori di sinistra e destra (e perlin). Ciò restituisce un elenco di elenchi di geom_lines, ma può essere semplicemente aggiunto a un grafico nel modo normale e tutte le righe vengono aggiunte. Le ultime due chiamate di scala servono solo per impostare le etichette e, nel caso dell'asse y, l'intervallo.

ggplot(mapping=aes(x=x, y=y)) + 
    geom_vline(data=edges, aes(xintercept = x), linetype="dashed") + 
    lapply(seq_len(nrow(ranges)), 
     function(r) {dralim(ranges$left[r], ranges$right[r], perlin)}) + 
    scale_y_continuous("Cumulative Hits", lim=c(-50,50)) + 
    scale_x_continuous("Trial Number") 

enter image description here

+0

ho capito il mio modo di fare era sbagliato. Dovevo iniziare da qualche parte. Il tuo aspetto è piuttosto buono. Grazie. Ci proveremo! –

+0

Ok, sembra fantastico. Ma come faccio a tracciare i miei dati in cima? –

+0

Non conosco il formato dei dati, ma indovinando da ciò che hai mostrato, aggiungi 'geom_line (data = a, aes (x = num, y = s, color = ss))'. –

Problemi correlati