2011-09-05 12 views
14

Questo è correlato a un'altra domanda: Plot weighted frequency matrix.Grafico heatmap di probabilità/hexbin con contenitori di dimensioni diverse

ho questa grafica (prodotta dal codice di seguito in R): multisample

#Set the number of bets and number of trials and % lines 
numbet <- 36 
numtri <- 1000 
#Fill a matrix where the rows are the cumulative bets and the columns are the trials 
xcum <- matrix(NA, nrow=numbet, ncol=numtri) 
for (i in 1:numtri) { 
x <- sample(c(0,1), numbet, prob=c(5/6,1/6), replace = TRUE) 
xcum[,i] <- cumsum(x)/(1:numbet) 
} 
#Plot the trials as transparent lines so you can see the build up 
matplot(xcum, type="l", xlab="Number of Trials", ylab="Relative Frequency", main="", col=rgb(0.01, 0.01, 0.01, 0.02), las=1) 

Mi molto simile al modo in cui questa trama è costruito e mostra i percorsi più frequenti come più scuro percorsi rare (ma non è abbastanza chiaro per una presentazione di stampa). Quello che mi piacerebbe fare è produrre una sorta di hexbin o heatmap per i numeri. Su pensarci, sembra che la trama dovrà integrare diversi bidoni di dimensioni (vedere la schiena del disegno busta):

binsketch

La mia domanda allora: Se io simulare un milione viene eseguito utilizzando il codice sopra, come posso presentarlo come heatmap o hexbin, con i raccoglitori di dimensioni diverse come mostrato nello schizzo?

Per chiarire: non voglio fare affidamento sulla trasparenza per mostrare la rarità di un processo che passa attraverso una parte della trama. Invece vorrei denotare rarità con il calore e mostrare un percorso comune come caldo (rosso) e un percorso raro come freddo (blu). Inoltre, non credo che i contenitori debbano essere della stessa dimensione perché il primo processo ha solo due posti in cui il percorso può essere, ma l'ultimo ne ha molti altri. Da qui il fatto che ho scelto una scala bin cambiante, basata su questo fatto. In sostanza sto contando il numero di volte in cui un percorso passa attraverso la cella (2 in col 1, 3 in col 2 ecc.) E quindi coloriamo la cella in base a quante volte è stata passata.

AGGIORNAMENTO: Ho già avuto una trama simile a @Andrie, ma non sono sicuro che sia molto più chiara della trama principale. È la natura discontinua di questo grafico, che non mi piace (e perché voglio una specie di mappa termica). Penso che poiché la prima colonna ha solo due valori possibili, che non ci dovrebbe essere un enorme divario visivo tra di loro ecc. Ecc. Quindi perché ho immaginato i contenitori di dimensioni diverse. Sento ancora che la versione binning mostrerebbe meglio un gran numero di campioni.

plot2

Aggiornamento: Questa website delinea una procedura per tracciare una mappa termica:

per creare una versione densità (heatmap) trama di questo dobbiamo elencare in modo efficace il verificarsi di questi punti in ogni posizione discreta nell'immagine. Ciò avviene impostando una griglia e contando il numero di volte in cui una coordinata di punti "cade" in ciascuno dei "bin" di pixel individuali in ogni posizione in quella griglia.

Forse alcune delle informazioni su tale sito Web possono essere combinate con ciò che abbiamo già?

Aggiornamento: Ho preso un po 'di quello che Andrie scritto con alcune di queste question, per arrivare a questo, che è abbastanza vicino a quello che concepivo: heatmap

numbet <- 20 
numtri <- 100 
prob=1/6 
#Fill a matrix 
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1) 
for (i in 1:numtri) { 
    x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE) 
    xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet)) 
} 
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep="")) 

mxcum <- reshape(data.frame(xcum), varying=1+1:numbet, 
    idvar="trial", v.names="outcome", direction="long", timevar="bet") 

#from the other question 
require(MASS) 
dens <- kde2d(mxcum$bet, mxcum$outcome) 
filled.contour(dens) 

io non capisco che cosa è andando avanti, ma questo sembra essere più simile a quello che volevo produrre (ovviamente senza i bidoni di dimensioni diverse).

Aggiornamento: questo è simile agli altri grafici qui.E non è giusto:

hexbin

plot(hexbin(x=mxcum$bet, y=mxcum$outcome)) 

ultimo tentativo. Come sopra: enter image description here

image(mxcum$bet, mxcum$outcome) 

Questo è abbastanza buono. Vorrei solo che assomigliasse al mio schizzo disegnato a mano.

+0

Così, nel disegno, sarebbe in alto a destra essere tutto blu dissolvenza in rosso in basso verso a sinistra e in basso a destra? –

+0

@Brandon Essenzialmente sì. Ho appena provato un modello, ma non sono un artista (né un matematico). Proverò a mostrare ciò che vorrei. –

+0

la tua domanda sembra carina :) – polerto

risposta

11

Modifica

Penso che la seguente soluzione fa quello che chiedi.

(Si noti che questo è lento, in particolare il passo reshape)

numbet <- 32 
numtri <- 1e5 
prob=5/6 
#Fill a matrix 
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1) 
for (i in 1:numtri) { 
    x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE) 
    xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet)) 
} 
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep="")) 

mxcum <- reshape(data.frame(xcum), varying=1+1:numbet, 
    idvar="trial", v.names="outcome", direction="long", timevar="bet") 


library(plyr) 
mxcum2 <- ddply(mxcum, .(bet, outcome), nrow) 
mxcum3 <- ddply(mxcum2, .(bet), summarize, 
       ymin=c(0, head(seq_along(V1)/length(V1), -1)), 
       ymax=seq_along(V1)/length(V1), 
       fill=(V1/sum(V1))) 
head(mxcum3) 

library(ggplot2) 

p <- ggplot(mxcum3, aes(xmin=bet-0.5, xmax=bet+0.5, ymin=ymin, ymax=ymax)) + 
    geom_rect(aes(fill=fill), colour="grey80") + 
    scale_fill_gradient("Outcome", formatter="percent", low="red", high="blue") + 
    scale_y_continuous(formatter="percent") + 
    xlab("Bet") 

print(p) 

enter image description here

+0

Sto ancora cercando di capire che cosa sta mostrando il tuo grafico. È molto interessante, ma non sono d'accordo. Non penso che stia mostrando ciò che ho chiesto, ma come dico, è interessante. Grazie per lo sforzo, ancora una volta. –

+0

In questo caso devi descrivere cosa è diverso. Hai chiesto di ridimensionare le barre per mostrare la dimensione, vero? – Andrie

+0

Ultimo tentativo: Prendi il primo grafico nella mia domanda e sovrapponi la griglia che ho abbozzato. Contare il numero di volte in cui un percorso passa attraverso quel particolare quadrato sulla griglia. Colori percorsi frequenti come caldi. Penso che il tuo grafico mostri che in 10000 prove, per la prova 1, la maggior parte delle persone segna 0, rispetto alla proporzione che segna 1, (1/6). Il grafico che sto cercando ha il layout del mio schizzo disegnato a mano, ma i dati del primo grafico ... Perché ci sono solo due possibili categorie per la prova 1 (hit miss) ci dovrebbero essere due contenitori uguali. grazie per l'aiuto btw. –

3

FYI: Questo è più un commento esteso che una risposta.

Per me, questo nuovo grafico si presenta come una barra in pila in cui l'altezza di ogni barra è uguale ai punti di intersezione della linea superiore e inferiore al successivo tentativo.

enter image description here

Il modo in cui avrei avvicinarsi a questo è per il trattamento di "prove" come variabile categorica. Quindi possiamo cercare ogni riga di xcum per elementi uguali. Se lo sono, possiamo considerare questo come un punto di intersezione i cui minimi rappresentano anche i multipli che definiscono l'altezza delle nostre barre.

x <- t(xcum) 
x <- x[duplicated(x),] 
x[x==0] <- NA 

Ora abbiamo i multipli dei punti effettivi, abbiamo bisogno di capire come portarla al passo successivo e trovare un modo di binning delle informazioni. Ciò significa che dobbiamo prendere una decisione su quanti punti rappresenteranno ciascun raggruppamento. Scriviamo alcuni punti per i posteri.

Trial 1 (2) = 1, 0.5 # multiple = 0.5 
Trial 2 (3) = 1, 0.66, 0.33 # multiple = 0.33 
Trial 3 (4) = 1, 0.75, 0.5, 0.25 # multiple = 0.25 
Trial 4 (5) = 1, 0.8, 0.6, 0.4, 0.2 # multiple = 0.2 
Trial 5 (6) = 1, 0.8333335, 0.6666668, 0.5000001, 0.3333334, 0.1666667 
... 
Trial 36 (35) = 1, 0.9722223, ..., 0.02777778 # mutiple = 0.05555556/2 

In altre parole, per ogni prova ci sono n-1 punti per tracciare. Nel tuo disegno hai 7 contenitori. Quindi abbiamo bisogno di capire i multipli per ogni bin.

Diamo barare e dividono le ultime due colonne a due, lo sappiamo da un esame visivo che i minimi è inferiore a 0,05

x[,35:36] <- x[,35:36]/2

poi trovare il minimo di ogni colonna:

x <- apply(x, 2, function(x) min(x, na.rm=T))[-1] # Drop the 1 
x <- x[c(1,2,3,4,8,17,35)] # I'm just guessing here by the "look" of your drawing. 

Il modo più semplice per farlo è quello di creare ogni cestino separatamente. Ovviamente, questo potrebbe essere fatto automaticamente in seguito. Ricordando che ogni punto è

bin1 <- data.frame(bin = rep("bin1",2), Frequency = rep(x[1],2)) 
bin2 <- data.frame(bin = rep("bin2",3), Frequency = rep(x[2],3)) 
bin3 <- data.frame(bin = rep("bin3",4), Frequency = rep(x[3],4)) 
bin4 <- data.frame(bin = rep("bin4",5), Frequency = rep(x[4],5)) 
bin5 <- data.frame(bin = rep("bin5",9), Frequency = rep(x[5],9)) 
bin6 <- data.frame(bin = rep("bin6",18), Frequency = rep(x[6],18)) 
bin7 <- data.frame(bin = rep("bin7",36), Frequency = rep(x[7],36)) 

df <- rbind(bin1,bin2,bin3,bin4,bin5,bin6,bin7) 
ggplot(df, aes(bin, Frequency, color=Frequency)) + geom_bar(stat="identity", position="stack") 
+0

Dovrò dare una risposta alla tua risposta.Ho chiarito cosa voglio dalla trama, se questo aiuta le persone a capire perché non sono abbastanza soddisfatto di quello che ho già. Grazie. –

Problemi correlati