2010-09-22 10 views
2

J'ai deux matrices (d'environ 300 x 100) et je voudrais tracer un graphe pour voir les parties du premier qui sont plus hautes que celles du second.Graphique pour comparer deux matrices dans R

que je peux faire, par exemple:

# 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)) 

Ce tracera seulement les régions souhaitées dans la 3ème parcelle, mais je voudrais faire quelque chose d'un peu différent, comme mettre une ligne autour de ces zones au cours du premier comploter afin de les mettre en évidence directement là.

Une idée de comment je peux faire ça?

Merci nico

+0

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

+0

@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

Répondre

2

Que diriez-vous:

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) 

Cela ajoute une carte de contour autour des régions. Le tri met des anneaux autour des zones de la 3ème parcelle (peut-être vouloir jouer avec les niveaux (n) des contours pour obtenir moins de 'cercles').

+0

réellement, en utilisant le paramètre 'levels' réglé à 0 semble donner de bons résultats – nico

1

Une autre façon de faire votre troisième image pourrait être:

image(m1>m2) 

ce produit une matrice de valeurs TRUE/FALSE qui obtient imagés comme 0/1, vous avez image en deux couleurs. Toujours pas sûr de votre « mettre une ligne autour de » chose si ...

1

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

+0

Dans votre exemple, essayez: image (m1); contour (m1, ajouter = VRAI, niveaux = 0.8) – eyjo

+0

Semble cool! Mon seul problème est que le seuil est lui-même une matrice, mais je suppose que je peux obtenir quelques bonnes idées de votre code. Je vous remercie! – nico