Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 29 Oct 2018, 09:43

François Bonnot a écrit :Bonjour,
Il n'y a aucune raison pour que ça ne fonctionne pas :

Code : Tout sélectionner

Mat_D <- expand.grid(x=1:15,y=1:83)
Mat_D$z <- as.numeric(runif(15*83)<0.3)
m <- matrix(nrow=15,ncol=83)
m[as.matrix(Mat_D[1:2])] <- Mat_D[,3]
image(x=sort(unique(Mat_D[,1])),y=sort(unique(Mat_D[,2])),z=m,col=c("white","gray")) ; box()

Comparez les structures des matrices Mat_D et m ci-dessus avec les vôtres et vous verrez certainement qu'elles ne sont pas les mêmes.


Bonjour François,

Je teste votre méthode sur l'exemple que je viens de donner:

Code : Tout sélectionner

m <- matrix(nrow=38,ncol=66) # pour avoir 2508 valeurs
m[as.matrix(Mat_D[1:2])] <- Mat_D[,3]
[b]Warning message:
In m[as.matrix(Mat_D[1:2])] <- Mat_D[, 3] :
  number of items to replace is not a multiple of replacement length
[/b]  #### mais la matrice a l'air quand même d'être remplie donc j'ai poursuivi le code
  image(x=sort(unique(Mat_D[,1])),y=sort(unique(Mat_D[,2])),z=m,col=c("white","gray")) ; box()
[b]Error in image.default(x = sort(unique(Mat_D[, 1])), y = sort(unique(Mat_D[,  :
  les dimensions de z ne sont pas length(x)(-1) multiplié par length(y)(-1)
[/b] 
 


Je suis complètement perdue et je n'avance absolument pas…

Merci pour votre aide,

Diane

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 29 Oct 2018, 12:37

Ah mais c'est beaucoup plus clair !
Sans information sur les valeurs générées par expand.grid, j'avais donné des exemples basés sur des nombres entiers positifs.
Une suggestion :

Code : Tout sélectionner

r <- sqrt(2)
scale = 0.05
x <- seq(-r, r, scale)
nrow.m <- ncol.m <- length(x)
Xg <- expand.grid(X1 = 1:nrow.m, X2=1:ncol.m)
Xg$X1g <- (Xg$X1-1)*scale-r
Xg$X2g <- (Xg$X2-1)*scale-r
Xg$sphere <- sqrt(Xg[,3]^2 + Xg[,4]^2)
Xg <- Xg[Xg$sphere<r,]
Xg$D <- as.numeric(runif(nrow(Xg))<0.1)
head(Xg)
m <- matrix(nrow=nrow.m,ncol=ncol.m)
m[as.matrix(Xg[1:2])] <- Xg$D
image(x,x,m,asp=1,col=c("gray","white"))
François

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 29 Oct 2018, 13:00

... mais le plus simple est d'utiliser la fonction levelplot() du package lattice :

Code : Tout sélectionner

library(lattice)
r <- sqrt(2)
scale = 0.05
Xg <- expand.grid(X1g = seq(-r, r, scale), X2g = seq(-r, r, scale))
Xg <- Xg[sqrt(Xg[,1]^2 + Xg[,2]^2)<r,]
Xg$D <- as.numeric(runif(nrow(Xg))<0.1)
levelplot(D~X1g*X2g,data=Xg,asp=1,col.regions=c(gray(0.5),"white"),colorkey=FALSE)
François

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 29 Oct 2018, 13:05

François Bonnot a écrit :Ah mais c'est beaucoup plus clair !


François,

Un énorme merci pour votre aide, en effet ça marche !!! J'ai exactement les zone que je voulais en mettant mes vraies valeurs de D !!!
J'aurais une dernière question :
j'ai bien la zone grise (qui correspond aux valeurs de D = à 0) dans un cercle de rayon r=sqrt(2). Quand je trace mon cercle, les zones grises dépassent un peu. Savez-vous comment je peux lisser cette zone grise pour que ça ne dépasse pas du cercle ?

Encore une fois, je vous remercie beaucoup !!

Bonne journée

Diane

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 29 Oct 2018, 13:26

il faudrait un exemple reproductible (cercle tracé sur l'exemple que j'ai donné).
François

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 29 Oct 2018, 13:33

François Bonnot a écrit :il faudrait un exemple reproductible (cercle tracé sur l'exemple que j'ai donné).


Bien sûr !
Le voila:

Code : Tout sélectionner

r <- sqrt(2)
scale = 0.05
x <- seq(-r, r, scale)
nrow.m <- ncol.m <- length(x)
Xg <- expand.grid(X1 = 1:nrow.m, X2=1:ncol.m)
Xg$X1g <- (Xg$X1-1)*scale-r
Xg$X2g <- (Xg$X2-1)*scale-r
Xg$sphere <- sqrt(Xg[,3]^2 + Xg[,4]^2)
Xg <- Xg[Xg$sphere<r,]
Xg$D <- as.numeric(runif(nrow(Xg))<0.1)
head(Xg)
m <- matrix(nrow=nrow.m,ncol=ncol.m)
m[as.matrix(Xg[1:2])] <- Xg$D
image(x,x,m,asp=1,col=c("gray","white"))
tt <- seq(0,2*pi, length.out = 200)
Dom <- data.frame(x = r*cos(tt), y = r*sin(tt))
lines(Dom, lwd = 2, col = "green")


Je préfère utiliser la fonction image que levelplot (j'obtiens le bon graphique avec image, alors qu'avec levelplot j'ai des zones grises dans la zone blanche…)

Merci,

Diane

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 29 Oct 2018, 14:59

Il ne suffit pas d'agrandir un peu le cercle ?

Code : Tout sélectionner

lim <- 1.55 ; ratio <- 1.02
image(x,x,m,asp=1,col=c("gray","white"),xlim=c(-lim,lim),ylim=c(-lim,lim))
tt <- seq(0,2*pi, length.out = 200)
Dom <- data.frame(x = r*cos(tt)*ratio, y = r*sin(tt)*ratio)
lines(Dom, lwd = 2, col = "green")
François

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 29 Oct 2018, 15:20

François Bonnot a écrit :Il ne suffit pas d'agrandir un peu le cercle ?


En effet, les zones grises sont dans le cercle, mais j'aimerais ne pas avoir la zone grise "en forme d'escalier" dans le cercle mais bien collée au trait vert…

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 29 Oct 2018, 16:10

Quelque chose comme ça ?

Code : Tout sélectionner

lim <- 1.55 ; ratio <- 1.02
plot(0,0,xlim=c(-lim,lim),ylim=c(-lim,lim),asp=1)
symbols(0,0,circles=r*ratio,add=TRUE,inches=FALSE,bg="gray")
image(x,x,m,col=c("gray","white"),add=TRUE)
François

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 29 Oct 2018, 17:07

François Bonnot a écrit :Quelque chose comme ça ?


On voit toujours cet effet "escalier", mais disons que ça ira !
Merci beaucoup !!!

pouvez-vous m'expliquer comment vous définissez col dans cette fonction (pour que quand m=0, col soit gris et quand m!=0, col soit en blanc?)

Code : Tout sélectionner

image(x,x,m,col=c("gray","white"),add=TRUE)


Mes vraies valeurs de D ne sont pas des entiers...

Je pensais faire une boucle pour lui spécifier quand colorer en blanc et quand colorer en gris mais je ne sais pas si c'est nécessaire, quelque chose comme ça dans notre exemple:

Code : Tout sélectionner

r <- sqrt(2)
scale = 0.05
x <- seq(-r, r, scale)
nrow.m <- ncol.m <- length(x)
Xg <- expand.grid(X1 = 1:nrow.m, X2=1:ncol.m)
Xg$X1g <- (Xg$X1-1)*scale-r
Xg$X2g <- (Xg$X2-1)*scale-r
Xg$sphere <- sqrt(Xg[,3]^2 + Xg[,4]^2)
Xg <- Xg[Xg$sphere<r,]
Xg$D <- as.numeric(runif(nrow(Xg))<0.1)
m <- matrix(nrow=nrow.m,ncol=ncol.m)
m[as.matrix(Xg[1:2])] <- Xg$D

couleur= NULL

  for(i in 1:length(m)){
    if(m[i]==0){ couleur="white"
    }  else{
      couleur="gray"
    }
  }
## Error in if (m[i] == 0) { : missing value where TRUE/FALSE needed ##
lim <- 1.55 ; ratio <- 1.02
plot(0,0,xlim=c(-lim,lim),ylim=c(-lim,lim),asp=1)
symbols(0,0,circles=r*ratio,add=TRUE,inches=FALSE,bg="gray", fg="green", lwd=3)
image(x,x,m,col=c("gray", "white"),add=TRUE)


Malgré l'erreur, le code fonctionne.

Merci pour votre retour,

Diane

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar François Bonnot » 30 Oct 2018, 07:45

On voit toujours cet effet "escalier"

Bonjour,
Vous voulez inclure des rectangles dans un cercle et qu'ils soient tangents au cercle par leurs côtés? Mais c'est géométriquement impossible!
pouvez-vous m'expliquer comment vous définissez col dans cette fonction (pour que quand m=0, col soit gris et quand m!=0, col soit en blanc?)

Je vous suggère de lire attentivement l'aide de la fonction image() et d'analyser les exemples de l'aide qui vous donneront toutes les réponses à cette question (inutile d'utiliser une boucle).
François

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 30 Oct 2018, 12:31

François Bonnot a écrit :Bonjour,
Vous voulez inclure des rectangles dans un cercle et qu'ils soient tangents au cercle par leurs côtés? Mais c'est géométriquement impossible!
Je vous suggère de lire attentivement l'aide de la fonction image() et d'analyser les exemples de l'aide qui vous donneront toutes les réponses à cette question (inutile d'utiliser une boucle).


Bonjour François,

J'ai réussi à obtenir une zone grise "plus lisse" en augmentant le scale à 0.01 au lieu de 0.05 !

Merci beaucoup pour votre aide!

Bonne journée,

Diane

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ordonner une matrice générée par un expand.grid pour utiliser la fonction image

Messagepar Diane MANZON » 02 Nov 2018, 09:20

Bonjour François,

J'ai de nouveau un problème. Je n'ai pas une colonne D mais 2 colonnes cette fois (alpha et beta):
Dans notre exemple:

Code : Tout sélectionner

r <- sqrt(2)
scale = 0.05
x <- seq(-r, r, scale)
nrow.w <- ncol.w <- length(x)
Xg <- expand.grid(X1 = 1:nrow.m, X2=1:ncol.m)
Xg$X1g <- (Xg$X1-1)*scale-r
Xg$X2g <- (Xg$X2-1)*scale-r
Xg$sphere <- sqrt(Xg[,3]^2 + Xg[,4]^2)
Xg <- Xg[Xg$sphere<r,]
alpha <- round(runif(2508, min=60, max=90))
beta <- round(runif(2508, min=0, max=4))
Xg <- cbind(Xg, alpha)
Xg <- cbind(Xg, beta)

Xg <- Xg[Xg$alpha>80 & Xg$beta<2,]
#mes conditions sont que alpha doit être supérieur à 80 et beta < à 2, j'ai donc Xg avec les points que je veux et là je suis perdue pour créer ma matrice w … J'en ai crée 2 pour superposer les 2 zones mais je ne voudrais garder que la zone où les 2 conditions sont respectées...

w <- matrix(nrow=nrow.w,ncol=ncol.w)
w[as.matrix(Xg[1:2])] <- Xg[,6]
w[w<80] <- NA

w2 <- matrix(nrow=nrow.w,ncol=ncol.w)
w2[as.matrix(Xg[1:2])] <- Xg[,7]
w2[w2>2] <- NA

lim <- 1.55
image(x,x,w, xlim=c(-lim,lim),ylim=c(-lim,lim),asp=1, col="gray")
image(x,x,w2, col="blue", axes=FALSE, add=TRUE)


Avez-vous une idée ?
Je vous remercie par avance,
Diane


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité