Domanda

Questo è legato ad un'altra domanda:. trama calibrato matrice frequenza

Ho questo grafico (prodotto dal codice qui sotto in R): multicampione

#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 piace molto il modo in cui questa trama è costruito e mostra i percorsi più frequenti come scuro rispetto dei percorsi più rare (ma non è abbastanza chiaro per una presentazione di stampa). Quello che vorrei fare è quello di 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 di cui sopra, come posso presentarlo come un heatmap o hexbin, con i diversi bidoni di dimensioni come indicato nel disegno

Per chiarire: io non voglio fare affidamento sulla trasparenza per mostrare la rarità di un processo che passa attraverso una parte della trama. Invece vorrei denotano rarità con il calore e mostrare un percorso comune come caldo (rosso) e un percorso raro come fredda (blu). Inoltre, non credo che i cassonetti dovrebbero essere della stessa misura, perché la prima prova ha solo due posti in cui il percorso può essere, ma l'ultimo ha molti di più. Qui il fatto ho scelto una scala cambio contenitore, sulla base di questo fatto. Essenzialmente io conto del numero di volte che un percorso passa attraverso la cella (2 Col 1, 3 in colonna 2, ecc) e poi colorare la cella in base a quante volte è stato attraversato.

UPDATE: ho già avuto una trama simile a @Andrie, ma non sono sicuro che è molto più chiaro di quanto la trama superiore. E 'la natura discontinua di questo grafico, che non mi piace (e perché voglio un qualche tipo di heatmap). Credo che, poiché la prima colonna ha solo due valori possibili, che non dovrebbe essere un enorme divario visivo tra loro ecc ecc Quindi perché ho immaginato i contenitori diversi dimensioni. Mi sento ancora che la versione binning avrebbe mostrato gran numero di campioni di meglio.

Plot2

Aggiornamento: Questa sito delinea una procedura per plot una mappa termica:

Per creare una versione densità (heatmap) trama di questo dobbiamo elencare in modo efficace il verificarsi di questi punti in ogni sede discreta nell'immagine. Questo viene fatto impostando un una griglia e contando il numero di volte che una coordinata del punto "cade" in ciascuno dei singoli pixel "bidoni" in ogni posizione in quella griglia.

Forse alcune delle informazioni su quel sito può essere combinato con quello che abbiamo già?

Aggiornamento: Ho preso un po 'di quello che ha scritto Andrie con un po' di questo domanda , per arrivare a questo, che è abbastanza vicino a quello che concepivo: mappa termica

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 riesco a capire cosa sta succedendo, ma questo sembra essere più simile a quello che volevo per la produzione (ovviamente senza i diversi bidoni di dimensioni).

Aggiornamento: Questo è simile alle altre trame qui. E non è giusto:

hexbin

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

ultimo tentativo. Come sopra: entrare descrizione dell'immagine qui

image(mxcum$bet, mxcum$outcome)

Questo è abbastanza buono. Vorrei solo farlo sembrare come il mio schizzo a mano.

È stato utile?

Soluzione

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)

entrare descrizione dell'immagine qui

Altri suggerimenti

FYI: Questo è più di un commento estesa di una risposta.

Per me, questo nuovo look di scena come un bar in pila in cui l'altezza di ogni barra è uguale ai punti di intersezione della linea superiore e inferiore alla prova successiva.

entrare descrizione dell'immagine qui

Il modo in cui avrei avvicinarsi a questo è per il trattamento di "prove" come variabile categorica. Quindi possiamo verificare ogni fila di xcum per gli elementi che sono uguali. Se lo sono, allora possiamo che questo sia un punto di intersezione cui minimi rappresenta anche il multiplo che definisce l'altezza dei nostri bar.

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 abbiamo bisogno di prendere una decisione su quanti punti rappresenteranno ciascuna classe. 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 a trama. Nel disegno si hanno 7 bidoni. Quindi abbiamo bisogno di capire i multipli per ogni bin.

imbroglio e Let 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ù chiaro per farlo è quello di creare ogni bin 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")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top