Voici un code que j'ai écrit pour faire quelque chose de similaire. Je voulais mettre en évidence les régions contiguës au-dessus d'un seuil de 0.95 en dessinant une boîte autour d'eux, donc j'ai obtenu tous les carrés de la grille au-dessus de 0.95 et fait un clustering sur eux. Ensuite, faites un peu de jongler avec la sortie de clustering pour obtenir les coordonnées du rectangle des régions:
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)
}
Code d'essai:
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)
Cela devrait vous donner une matrice de coordonnées rectangle:
> 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
Maintenant, vous pouvez les dessiner sur l'image avec rect:
image(m1)
rect(hs[,1],hs[,3],hs[,2],hs[,4])
et de montrer qu'ils sont là où ils doivent être:
image(list(x=m1$x,y=m1$y,z=m1$z>0.95))
rect(hs[,1],hs[,3],hs[,2],hs[,4])
Vous pouvez Adapt Bien sûr, cela pour dessiner des cercles, mais des formes plus complexes serait difficile. Cela fonctionne mieux lorsque les régions d'intérêt sont relativement compactes.
Barry
Hmm vous êtes un peu vague - pourriez-vous quelque chose comme ce que dessiner vous voulez (parce que nous ne pouvons pas voir vos matrices m1 et m2) et l'afficher? – Spacedman
@Spacedman: Oui, désolé, c'est un peu difficile à expliquer ... Je veux tracer m1 et avoir une ligne (comme un contour contour) autour des régions où m1> m2 – nico