2015-06-04 3 views
0

У меня есть матрица, значения которой я хочу построить. Используя функцию image, она выглядит так.R plot heatmap матрицы с наложенной строкой

m

Как я могу построить линию над изображением? (В моем случае, хочет построить линию по максимальным значениям вдоль осей x)

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

Изображения и линии Я хочу, чтобы построить над являются выходом из Bayesian Online Changepoint detection. Поскольку он довольно короткий, я буду делиться всем кодом. Черчения часть находится в конце:

# Bayesian Online Changepoint Detection 
# Adams, MacKay 2007 
# http://hips.seas.harvard.edu/content/bayesian-online-changepoint-detection 
####################################### 

# Other python and matlab implementations 
# https://github.com/JackKelly/bayesianchangepoint 
# http://hips.seas.harvard.edu/content/bayesian-online-changepoint-detection 
# http://www.inference.phy.cam.ac.uk/rpa23/cp/gaussdemo.m 
# http://www.inference.phy.cam.ac.uk/rpa23/cp/studentpdf.m 
# http://www.inference.phy.cam.ac.uk/rpa23/cp/constant_hazard.m 

# Even more commented, but different paper: 
# https://github.com/davyfeng/ipdata/blob/master/csv/bocpd/core/bocpd.m 

# Generate data 
x1 <- rnorm(100, 10.5, 0.1) 
x2 <- rnorm(100, 1, 0.1) 
x3 <- rnorm(100, -10, 0.1) 
x4 <- rnorm(100, -1, 0.1) 
x5 <- rnorm(100, 5, 0.1) 
x6 <- rnorm(30, 1, 0.1) 
x7 <- rnorm(100, 8, 0.1) 

x <- c(x1,x2,x3,x4,x5, x6,x7) 

############## 
# Algorithm 
############## 

# Prepare the scaled and shifted student-t 
dt.scaled.shifted <- function(x, m, s, df) stats::dt((x-m)/s, df)/s 

# Prepare the Hazard function 
hazard <-function(x, lambda=200){rep(1/lambda, length(x))} 

L <- length(x) 
R <- matrix(rep(0,(L+1)*(L+1)), L+1, L+1) 
R[1,1] <- 1 # for t=1 where are sure that p(r=1)=1 
mu0 <- 0; kappa0 <- 1; alpha0 <-1; beta0 <- 1; 
muT <- mu0 
kappaT <- kappa0 
alphaT <- alpha0 
betaT <- beta0 

maxes <- rep(0, L) 

# Process data as they come in 
for(t in 1:L){ 
    # Evaluate predictive probability 
    predprobs <- dt.scaled.shifted(x[t], muT, betaT*(kappaT+1)/(alphaT*-kappaT), 2*alphaT) 

    H <- hazard(x[1:t]) 

    # Calculate growth probabilities 
    R[2:(t+1), t+1] <- R[1:t,t]*predprobs*(1-H) 

    # Calculate changepoint (reset) probabilities 
    R[1,t+1] <- sum(R[1:t,t]*predprobs*H) 

    # Renormalize 
    R[,t+1] <- R[,t+1]/sum(R[,t+1]) 

    # Update parameters for each possible run length 
    # keep the past ones since they will be used iteratively 
    muT0 <- c(mu0, (kappaT*muT + x[t])/(kappaT+1)) 
    kappaT0 <- c(kappa0,kappaT+1) 
    alphaT0 <- c(alpha0, alphaT + 0.5) 
    betaT0 <- c(beta0, kappaT + (kappaT * (x[t]-muT)^2)/(2*(kappaT+1))) 
    muT <- muT0 
    kappaT <- kappaT0 
    alphaT <- alphaT0 
    betaT <- betaT0 

    # Store the maximum, to plot later 
    maxes[t] <- which.max(R[,t]) 
} 

# Plot results 
par(mfrow=c(2,1)) 
plot(x, type='l') 
image((-t(log(R))), col = grey(seq(0,1,length=256)), axes=T) 
par(new=T) 
plot(1:(dim(R)[1]-1), maxes,type='l', col="red") 

enter image description here

На вершине есть исходные данные. В нижней части вероятность того, что текущий пробег будет иметь длину y. Красная линия на дне должна соответствовать темным оттенкам.

+0

Для 'lines()' вам нужны значения 'x' и' y'. Каково ваше намерение просто передать один вектор? Вы имели в виду 'lines (seq (0,1, length = 50), seq (0,1, length = 50), col =" red ", lwd = 5)'? – MrFlick

+0

У меня есть ранее вычисленный вектор 'maxes' со значением для каждого' x'. 'maxes [i] <- which.max (m [, i])' – alberto

+0

@MrFlick мой ответ действительно не работает для моей реальной проблемы, я удалю его. Я отредактировал вопрос, чтобы воспроизвести данные. – alberto

ответ

0

(... Для удаления Это не работает Я оставляю это temporaly сохранить комментарии)

Я получил его, я думал, что я уже пытался par(new=T), но очевидно, что я не имел:

m <- matrix(rnorm(100,1,1),50,50) 
image(m, col = grey(seq(0,1,length=256))) 
par(new=T) 
plot(seq(0,1, length=50), type='l', col="red", lwd=5) 

Быстрый пример моделирования весь процесс:

data <- vector() 
for(i in 1:50){ 
    data <- rbind(data, dpois(1:50, i^1.2)) 
} 
maxes <- apply(data, 1, which.max) 
image(-data, col = grey(seq(0,1,length=256))) 
par(new=T) 
plot(1:dim(data)[1], c(maxes),type='l') 

enter image description here

+0

Обратите внимание, что это полностью изменяет ваш 'x'scale. Вероятно, это не то решение, которое вам действительно нужно, если вы хотите совместить значения 'x' и' y' с исходным сюжетом. – MrFlick

+0

Да! Я только что видел это и думал, что у меня проблемы с моими данными. Все ваши тогда :) – alberto

+0

Изображение перевешивает все до 0-1. Я все еще не уверен, почему вы не передаете значения 'x' и' y' в 'lines()'. Если вы просто передаете один вектор, он предполагает, что эти значения 'y' используют 1,2,3 и т. Д. Для значений' x'. В этом случае эти значения 'x' находятся за пределами диапазона 0-1, поэтому ничего не отображается. – MrFlick