2010-09-22 7 views
2

У меня есть две матрицы (приблизительно 300 x 100), и я хотел бы построить график, чтобы увидеть части первого, которые выше, чем у второго.График сравнения двух матриц в R

я могу сделать, например:

# Calculate the matrices and put them into m1 and m2 
# Note that the values are between -1 and 1 
par(mfrow=c(1,3)) 
image(m1, zlim=c(-1,1)) 
image(m2, zlim=c(-1,1)) 
image(m1-m2, zlim=c(0,1)) 

Это будет строить только нужные участки в 3-м участке, но я хотел бы сделать что-то немного по-другому, как положить линию вокруг этих областей над первой чтобы выделить их прямо там.

Любая идея, как я могу это сделать?

Спасибо Nico

+0

Хм, вы немного расплывчатым - могли бы вы сделать что-то вроде того, что вы хотите (потому что мы не можем видеть ваш m1 и m2 матрицы) и разместить его? – Spacedman

+0

@Spacedman: Да, извините, это немного сложно объяснить ... Я хочу построить m1 и иметь линию (например, контурный график) вокруг областей, где m1> m2 – nico

ответ

2

Как насчет:

par(mfrow = c(1, 3)) 
image(m1, zlim = c(-1, 1)) 
contour(m1 - m2, add = TRUE) 
image(m2, zlim = c(-1, 1)) 
contour(m1 - m2, add = TRUE) 
image(m1 - m2, zlim = c(0, 1)) 
contour(m1 - m2, add = TRUE) 

Это добавляет контурную карту вокруг регионов. Сорт помещает кольца вокруг областей 3-го участка (возможно, захочется поиграть с (n) уровнями контуров, чтобы получить меньше «кругов»).

+0

фактически, используя параметр 'levels', установленный для 0, кажется, дает хорошие результаты – nico

1

Другой способ сделать ваше третье изображение может быть:

image(m1>m2) 

это производит матрицу true/false значений, которые получает изображаемых как 0/1, так что у вас есть двухцветное изображение. До сих пор не уверен, что ваш «положить линию вокруг» вещь, хотя ...

1

Вот код, который я написал, чтобы сделать что-то подобное. Я хотел выделить смежные области выше порога 0.95, нарисовав вокруг них прямоугольник, поэтому я получил квадраты сетки выше 0,95 и сделал кластеризацию на них. Затем сделайте немного возился с выходом кластеризация, чтобы получить координаты прямоугольника регионов:

computeHotspots = function(xyz, thresh, minsize=1, margin=1){ 
### given a list(x,y,z), return a data frame where each row 
### is a (xmin,xmax,ymin,ymax) of bounding box of a contiguous area 
### over the given threshhold. 
### or approximately. lets use the clustering tools in R... 

    overs <- which(xyz$z>thresh,arr.ind=T) 

    if(length(overs)==0){ 
    ## found no hotspots 
    return(NULL) 
    } 

    if(length(overs)==2){ 
    ## found one hotspot 
    xRange <- cbind(xyz$x[overs[,1]],xyz$x[overs[,1]]) 
    yRange <- cbind(xyz$y[overs[,2]],xyz$y[overs[,2]]) 
    }else{ 

    oTree <- hclust(dist(overs),method="single") 
    oCut <- cutree(oTree,h=10) 

    oXYc <- data.frame(x=xyz$x[overs[,1]],y=xyz$y[overs[,2]],oCut) 

    xRange <- do.call("rbind",tapply(oXYc[,1],oCut,range)) 
    yRange <- do.call("rbind",tapply(oXYc[,2],oCut,range)) 

    } 

### add user-margins 
xRange[,1] <- xRange[,1]-margin 
xRange[,2] <- xRange[,2]+margin 
yRange[,1] <- yRange[,1]-margin 
yRange[,2] <- yRange[,2]+margin 

## put it all together 
xr <- apply(xRange,1,diff) 
xm <- apply(xRange,1,mean) 
xRange[xr<minsize,1] <- xm[xr<minsize]-(minsize/2) 
xRange[xr<minsize,2] <- xm[xr<minsize]+(minsize/2) 

yr <- apply(yRange,1,diff) 
ym <- apply(yRange,1,mean) 
yRange[yr<minsize,1] <- ym[yr<minsize]-(minsize/2) 
yRange[yr<minsize,2] <- ym[yr<minsize]+(minsize/2) 

    cbind(xRange,yRange) 

} 

Тестовый код:

x=1:23 
y=7:34 
m1=list(x=x,y=y,z=outer(x,y,function(x,y){sin(x/3)*cos(y/3)})) 
image(m1) 
hs = computeHotspots(m1,0.95) 

Это должно дать вам матрицу прямоугольника координаты:

> hs 
    [,1] [,2] [,3] [,4] 
1 13 15 8 11 
2 3 6 17 20 
3 22 24 18 20 
4 13 16 27 30 

Теперь вы можете нарисовать их по изображению с помощью прямоугольника:

image(m1) 
rect(hs[,1],hs[,3],hs[,2],hs[,4]) 

и показать, что они находятся там, где они должны быть:

image(list(x=m1$x,y=m1$y,z=m1$z>0.95)) 
rect(hs[,1],hs[,3],hs[,2],hs[,4]) 

Вы могли бы, конечно, приспособить это рисовать круги, но более сложные формы будет сложно. Он лучше всего работает, когда интересующие регионы довольно компактны.

Barry

+0

В вашем примере попробуйте: image (m1); контур (m1, add = TRUE, levels = 0.8) – eyjo

+0

Кажется классным! Моя единственная проблема заключается в том, что порог - это сама матрица, но я думаю, что могу получить некоторые полезные идеи из вашего кода. Спасибо! – nico

Смежные вопросы