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 : 49
Enregistré le : 18 Juin 2018, 08:31

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

Messagepar Diane MANZON » 23 Oct 2018, 07:17

Bonjour à tous,

J'ai une matrice (Mat_D) avec 3 colonnes.
La colonne 1 (X1g) et la colonne 2 (X2g) ont été générées avec la fonction expand.grid [ces 2 premières colonnes correspondent aux coordonnées de X1 et de X2 dans un domaine donné] et la colonne 3 (Des) a été calculé.

Je voudrais utiliser la fonction image pour tracer sur un graphique:
- une zone grise (et pas des points...) si Des est différent de 0
- une zone blanche si Des est égal à 0

J'ai crée une nouvelle matrice (Mat_DD) dans laquelle la colonne 3 (Des) est différente de 0.
J'ai vu que la fonction image pouvait résoudre mon problème mais quand je fais le code suivant:

Code : Tout sélectionner

 plot(Mat_D[,1], Mat_D[,2], xlab="X1", ylab="X2", cex=0.5, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), type="n")
      image(Mat_D[,1], Mat_D[,2], Mat_D[,3], col="white", axes=FALSE, add=TRUE)


J'ai le message d'erreur suivant: error in image.default: les valeurs de "x" et de "y" doivent être croissantes.

Du coup, j'ai testé les fonctions order, sort, do.call mais je n'arrive pas à avoir le tri de mon X1g et de mon X2g avec les valeurs de Des correspondantes dans l'ordre croissant....

Quelqu'un aurait-il une idée ??

Merci beaucoup pour votre aide !!

François Bonnot
Messages : 481
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 » 23 Oct 2018, 12:27

Bonjour,
J'ai une matrice (Mat_D) avec 3 colonnes.

Le plus efficace est de donner un exemple.

Il faut bien lire le mode d'emploi de image() et regarder les exemples.
z doit être une matrice, pas un vecteur.
x et y sont les "locations of grid lines at which the values in z are measured", donc les marges de z.
Donc :

Code : Tout sélectionner

Mat_D <- expand.grid(X1g=1:10,Y1g=1:8)
Mat_D$Des <- as.numeric(runif(80)<0.3)
m <- matrix(nrow=10,ncol=8)
m[as.matrix(Mat_D[1:2])] <- Mat_D[,3]
image(x=unique(Mat_D[,1]),y=unique(Mat_D[,2]),z=m,col=c("white","gray")) ; box()
François

Diane MANZON
Messages : 49
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 » 23 Oct 2018, 15:18

François Bonnot a écrit :Bonjour,
J'ai une matrice (Mat_D) avec 3 colonnes.

Le plus efficace est de donner un exemple.

Il faut bien lire le mode d'emploi de image() et regarder les exemples.
z doit être une matrice, pas un vecteur.
x et y sont les "locations of grid lines at which the values in z are measured", donc les marges de z.
Donc :

Code : Tout sélectionner

Mat_D <- expand.grid(X1g=1:10,Y1g=1:8)
Mat_D$Des <- as.numeric(runif(80)<0.3)
m <- matrix(nrow=10,ncol=8)
m[as.matrix(Mat_D[1:2])] <- Mat_D[,3]
image(x=unique(Mat_D[,1]),y=unique(Mat_D[,2]),z=m,col=c("white","gray")) ; box()


Bonjour François,

Merci pour ta réponse, en effet avec ton code ça marche super!

Code : Tout sélectionner

# Génération de ma grille de points dans un domaine sphérique
r <- 1
Input$scale = 0.05
Xg <- expand.grid(X1g = seq(-r, r, Input$scale), X2g = seq(-r, r, Input$scale))
  Xg <- as.matrix(Xg)
  sphere <- sqrt(Xg[,1]^2 + Xg[,2]^2)
  Xg2 <- cbind(Xg, sphere)
  Xg3 <- Xg2[Xg2[,3]<r,]
  Spherical_Gridpoint <- Xg3[,-3]
  Spherical_Gridpoint <- round(Spherical_Gridpoint, 3)
  XX <- as.data.frame((Spherical_Gridpoint))
  Mat_D <- cbind(XX, Des) # le détail des calculs est trop long (c'est des valeurs entre 0 et 1)
  m <- as.matrix(Des)
m <- Mat_D[,3]
image(x=unique(Mat_D[,1]),y=unique(Mat_D[,2]),z=m,col=c("white","gray")) ; box()
 

Erreur : Error in image.default(x = unique(Mat_D[, 1]), y = unique(Mat_D[, 2]), :
les valeurs de 'x' et de 'y' doivent être croissantes

... :'-(
Je ne comprends pas pourquoi ça bloque...
Si tu as une idée, je suis preneuse !

Merci,

Diane

Logez Maxime
Messages : 2872
Enregistré le : 26 Sep 2006, 11:35

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

Messagepar Logez Maxime » 23 Oct 2018, 15:56

Bonjour,

parce que comme le dit le message d'erreur les données fournies en x et/ou en y ne sont pas croissantes.
Il te suffit de faire unique(XX[,1]) pour t'en apercevoir.

Cordialement,
Maxime

Diane MANZON
Messages : 49
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 » 24 Oct 2018, 07:40

Logez Maxime a écrit :Bonjour,

parce que comme le dit le message d'erreur les données fournies en x et/ou en y ne sont pas croissantes.
Il te suffit de faire unique(XX[,1]) pour t'en apercevoir.

Cordialement,
Maxime



Bonjour Maxime,

Oui j'ai bien compris que mes valeurs n'étaient pas croissantes... D'où le titre du sujet, comment je peux ordonner mes 2 premières colonnes (générées par un expand.grid) sachant qu'elles sont liées à la 3ème colonne (coordonnées X1 et X2 [colonnes 1 et 2] avec la valeur D correspondante [colonne 3]) ?

Merci,

Diane

François Bonnot
Messages : 481
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 » 24 Oct 2018, 07:49

Bonjour,
Ce ne sont pas les deux premières colonnes qu'il faut ordonner, mais les marges.
Il suffit de remplacer la dernière ligne de mon code par :

Code : Tout sélectionner

image(x=sort(unique(Mat_D[,1])),y=sort(unique(Mat_D[,2])),z=m,col=c("white","gray")) ; box()
François

Diane MANZON
Messages : 49
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 » 24 Oct 2018, 08:30

François Bonnot a écrit :Bonjour,
Ce ne sont pas les deux premières colonnes qu'il faut ordonner, mais les marges.
Il suffit de remplacer la dernière ligne de mon code par :

Code : Tout sélectionner

image(x=sort(unique(Mat_D[,1])),y=sort(unique(Mat_D[,2])),z=m,col=c("white","gray")) ; box()


Bonjour François,

Merci pour ton retour.
J'ai une nouvelle erreur:

Code : Tout sélectionner

 m <- as.matrix(Des) #les valeurs allant de 0 à 1
 m <- Mat[,3]
image(x=sort(unique(Mat_D[,1])), y=sort(unique(Mat_D[,1])), z=m, col=c("white", "gray")) ; box()

Erreur : "z" doit être une matrice

--'


Diane MANZON
Messages : 49
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 » 24 Oct 2018, 14:40

François Bonnot a écrit :Il faudrait un petit extrait de vos données et un code reproductible :
http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=3302
http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=7638


Re bonjour François,

Envoyer un extrait de mes données avec un code reproductible reviendrait à vous envoyer tout mon script puisque chaque ligne est en lien avec la précédente.

Je vais essayer d'être plus claire:
Je voudrais ordonner par ordre croissant mes coordonnées de points X1 et X2 (les 2 premières colonnes de ma matrice qui ont générées par expand.grid) qui sont liées à une valeur "D" comprise entre 0 et 1 (la 3ème colonne de la matrice qui a été calculé).
Sur un graphique, je voudrais 2 zones (blanche si D = 1 et grise si D = 0).
Jusqu'ici, j'ai 2 erreurs avec la fonction image (soit x et y ne sont pas croissants, soit z n'est pas une matrice...)

Je désespère! Dans votre exemple, ça avait l'air simple ...

Merci d'avance pour votre retour,

Diane

François Bonnot
Messages : 481
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 » 24 Oct 2018, 14:54

Je voudrais ordonner par ordre croissant mes coordonnées de points X1 et X2

Cela ne sert à rien.
Ainsi que je l'ai déjà écrit, il faut ordonner les marges et non la matrice de départ.
Dans la dernière ligne, les marges sont déjà ordonnées par la fonction sort().
L'erreur '"z doit être une matrice" n'a rien a voir avec l'ordre des données.
Je ne comprends pas à quoi sert la ligne m <- Mat[,3] qui fait que m est un vecteur et pas une matrice.
François

Diane MANZON
Messages : 49
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 » 24 Oct 2018, 16:49

François Bonnot a écrit :
Je voudrais ordonner par ordre croissant mes coordonnées de points X1 et X2

Cela ne sert à rien.
Ainsi que je l'ai déjà écrit, il faut ordonner les marges et non la matrice de départ.
Dans la dernière ligne, les marges sont déjà ordonnées par la fonction sort().
L'erreur '"z doit être une matrice" n'a rien a voir avec l'ordre des données.
Je ne comprends pas à quoi sert la ligne m <- Mat[,3] qui fait que m est un vecteur et pas une matrice.


D'accord.
Autant pour moi :

Code : Tout sélectionner

m <- as.matrix(Mat_D[,3])
image(x=sort(unique(Mat_D[,1])),y=sort(unique(Mat_D[,2])),z=m,col=c("white","gray")) ; box()


Erreur: 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)

J'ai vraiment du mal avec cette fonction image... :-(

François Bonnot
Messages : 481
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 » 25 Oct 2018, 06:54

Bonjour,
Je ne comprends pas pourquoi vous écrivez m <- as.matrix(Mat_D[,3]) au lieu de m[as.matrix(Mat_D[1:2])] <- Mat_D[,3] comme je l'avais écrit dans ma première réponse.
PS. Il va de soi qu'i faut remplacer 8 et 10 de mon exemple m <- matrix(nrow=10,ncol=8) par les bonnes dimensions de m.
François

Diane MANZON
Messages : 49
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 » 27 Oct 2018, 14:01

François Bonnot a écrit :Bonjour,
Je ne comprends pas pourquoi vous écrivez m <- as.matrix(Mat_D[,3]) au lieu de m[as.matrix(Mat_D[1:2])] <- Mat_D[,3] comme je l'avais écrit dans ma première réponse.
PS. Il va de soi qu'i faut remplacer 8 et 10 de mon exemple m <- matrix(nrow=10,ncol=8) par les bonnes dimensions de m.


Bonjour,

Exusez-moi pour ma réponse tardive. Ma 3ème colonne D a 1245 lignes, quand je fais:

Code : Tout sélectionner

m <- matrix(nrow=15,ncol=83)
m[as.matrix(Mat_D[1:2])] <- Mat_D[,3]


Il me revient l'erreur suivante: 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

Ma colonne D est calculé suivant les valeurs des colonnes 1 et 2. Si je crée une matrice avec les valeurs de D, qui aura certes la même longueur, les valeurs ne correspondront pas...


Merci d'avance pour votre retour,

Diane

François Bonnot
Messages : 481
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, 09:24

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.
François

Diane MANZON
Messages : 49
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:27

Bonjour à tous,

Je reformule mon problème avec un exemple:

Code : Tout sélectionner

## Génération de ma grille de points dans un domaine sphérique ##
r <- sqrt(2)
scale = 0.05
Xg <- expand.grid(X1g = seq(-r, r, scale), X2g = seq(-r, r, scale))
Xg <- as.matrix(Xg)
sphere <- sqrt(Xg[,1]^2 + Xg[,2]^2)
Xg2 <- cbind(Xg, sphere)
Xg3 <- Xg2[Xg2[,3]<r,]
Spherical_Gridpoint <- Xg3[,-3]
Spherical_Gridpoint <- round(Spherical_Gridpoint, 3)
XX <- as.data.frame((Spherical_Gridpoint)) #grille de points

## Ajout d'une colonne D fictive##

D <- as.matrix(D)
D <- runif(2508,0, 1) #normalement j'ai beaucoup de valeurs égales à 0, et un peu de valeurs qui sont différentes de 0
D <- as.matrix(D)

## matrice finale
Mat_D <- cbind(XX, D)


A partir de là, je voudrais réaliser un graphique (abscisse:X1g [1ère colonne de Mat_D] ; ordonnée:X2g [2ème colonne de Mat_D]) pour ploter les valeurs de D :
si = à 0 : zone de couleur grise
si = à 1 : zone de couleur blanche
Je ne souhaite pas avoir des points mais vraiment une zone de couleur remplie.


J'espère être plus claire..

Merci d'avance pour vos retours!
Diane


Retourner vers « Questions en cours »

Qui est en ligne

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