Вероятность графика тепловая карта/шестнадцатеричный

StackOverflow https://stackoverflow.com/questions/7305803

  •  25-10-2019
  •  | 
  •  

Вопрос

Это связано с другим вопросом: Взвешенная частотная матрица графика.

У меня есть этот график (создается кодом ниже в 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)

Мне очень нравится то, как этот сюжет создан, и показывает более частые пути как более темные, чем более редкие пути (но он не достаточно ясен для печатной презентации). Что я хотел бы сделать, так это создать какую -то шестигранную или тепловую карту для чисел. Подумав об этом, кажется, что сюжет должен будет включать ячейки различного размера (см. Моя спина эскиза конверта):

binsketch

Тогда мой вопрос: Если я моделирую миллион прогонов, используя приведенный выше код, как я могу представить его в виде тепловой карты или шестнадцатеричного, с мусорными банками различного размера, как показано на эскизе?

Чтобы уточнить: я не хочу полагаться на прозрачность, чтобы показать редкость испытания, проходящего через часть сюжета. Вместо этого я хотел бы обозначить редкость с теплом и показать общий путь как горячий (красный) и редкий путь как холодный (синий). Кроме того, я не думаю, что ячейки должны быть одинакового размера, потому что в первом испытании есть только два места, где может быть путь, но последнее имеет гораздо больше. Следовательно, тот факт, что я выбрал изменяющуюся шкалу корзины, основанный на этом факте. По сути, я считаю количество раз, когда путь проходит через клетку (2 в COL 1, 3 в COL 2 и т. Д.), А затем раскрашивать клетку в зависимости от того, сколько раз она проходила.

Обновление: у меня уже был сюжет, похожий на @Andrie, но я не уверен, что он намного яснее, чем лучший сюжет. Это прерывистый характер этого графика, который мне не нравится (и почему я хочу какую -то тепловую карту). Я думаю, что, поскольку у первого столбца есть только два возможных значения, между ними не должно быть огромного визуального разрыва и т. Д. Следовательно, почему я предусматривал мусорные баки разных размеров. Я до сих пор чувствую, что версия Binning будет показывать большое количество образцов лучше.

plot2

Обновление: это Веб-сайт Ориентирует процедуру построения тепловой карты:

Чтобы создать версию графика плотности (Heatmap), мы должны эффективно перечислять возникновение этих точек в каждом отдельном месте на изображении. Это делается путем настройки сетки и подсчета количества раз, когда координата точек «падает» в каждый из отдельных пиксельных "мусорных ведомств" в каждом месте в этой сетке.

Возможно, некоторая информация на этом веб -сайте может быть объединена с тем, что у нас уже есть?

Обновление: я взял кое -что из того, что написал Андри с некоторыми из этого вопрос, чтобы прийти к этому, что довольно близко к тому, что я задумал: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)

Я не совсем понимаю, что происходит, но, похоже, это больше похоже на то, что я хотел произвести (очевидно, без мусорных ведомств разных размеров).

Обновление: это похоже на другие сюжеты здесь. Это не совсем правильно:

hexbin

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

Последняя попытка. Как указано выше:enter image description here

image(mxcum$bet, mxcum$outcome)

Это довольно хорошо. Я просто хотел бы, чтобы это выглядело как мой нарисованный эскиз.

Это было полезно?

Решение

Редактировать

Я думаю, что следующее решение делает то, о чем вы просите.

(Обратите внимание, что это медленно, особенно 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

Другие советы

К вашему сведению: это скорее расширенный комментарий, чем ответ.

Для меня этот новый сюжет похож на сложенную полосу, где высота каждого стержня равна точкам пересечения верхней и нижней линии на следующем испытании.

enter image description here

То, как я бы приблизился к этому, - это рассматривать «испытания» как категориальную переменную. Затем мы можем искать каждую строку Xcum для равных элементов. Если они есть, то мы можем считать это точкой пересечения, минимумы которых также представляют множественные определения высоты наших стержней.

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

Теперь у нас есть несколько фактических точек, нам нужно выяснить, как сделать его на следующий шаг и найти способ сочетания информации. Это означает, что нам нужно принять решение о том, сколько очков будет представлять каждую группировку. Давайте напишем некоторые указы на потомство.

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

Другими словами, для каждого испытания есть N-1 точки для участка. На вашем рисунке у вас есть 7 корзин. Поэтому нам нужно выяснить множество для каждой бина.

Давайте обманем и разделим последние два столбца на два, мы знаем из визуального осмотра, что минимумы ниже 0,05

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

Затем найдите минимум каждого столбца:

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. 

Самый четкий способ сделать это - создать каждую бин отдельно. Очевидно, это может быть сделано автоматически позже. Помнит, что каждая точка

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")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top