ggplot2 : graph à trois variables

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

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

ggplot2 : graph à trois variables

Messagepar Guillaume Dramais » 18 Avr 2019, 23:11

Bonjour,

J'ai un dataframe à trois variables, les deux premières sont des positions x, y en mètres la troisième est une concentration. Je peux en faire un dataframe à trois colonnes ou je peux le transformer en matrice avec la fonction cast.
Je veux représenter les concentrations dans l'espace métrique en échelle de couleur.
J’ai testé deux méthodes :

ggplot2 et les geom_contour et geom_raster avec mon dataframe :

Code : Tout sélectionner

> toto<-ggplot(data_gui, aes(x = x, y = y, z = z))+
+geom_raster(aes(fill = z)
> print(toto)


Me trace effectivement quelque chose, un histogramme…j’ai essayé d’ajouter des arguments mais je n’arrive pas à représenter ce jeu de donnée.

Avec la fonction geom_contour

Code : Tout sélectionner

> toto<-ggplot(data_gui, aes(x = x, y = y, z = z))+
+geom_contour(aes(z=z))
> print(toto)


J’obtiens cette erreur, qui suggère que j’ai des doublons mais ce n’st pas le cas

Warning message:
Computation failed in `stat_contour()`:
Contour requires single `z` at each combination of `x` and `y`.


J'ai fait des essais avec la fonction image suggéré dans ce précédent message
viewtopic.php?f=3&t=9403

Si je transforme le dataframe en matrice, la fonction image me donne des résultats intéressants mais avec comme abscisses et ordonnées un nombre de valeurs donc pas dans le repère métrique, les étiquettes des colonnes et lignes sont en mètre mais je n'arrive pas les utiliser comme repère (cela me permettrait aussi de rajouter d’autres éléments dans mon graphe avec des coordonnées métriques). J’ai également besoin d’inverser mon axe y mais je n’y arrive pas.

Code : Tout sélectionner

x <- (0.1:nrow(matdata_gui)) 
y <- (0.1:ncol(matdata_gui))
image(x, y, matdata_gui, col = terrain.colors(100),xlab="Distance(m)",ylab="Depth(m)")
contour(x, y, matdata_gui, levels = seq(0, 0.5, by = 0.01), add = TRUE, col = "peru")
box()


Si vous avez des suggestions ou des exemples de ce type avec ggplot2 ou image ou d'autres qui puissent m'aider sur cette représentation.
Merci d'avance
Cordialement

Guillaume

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: ggplot2 : graph à trois variables

Messagepar Serge Rapenne » 19 Avr 2019, 08:59

Bonjour,

je ne suis pas un pro de ggplot mais ne serait ce pas plutot :

Code : Tout sélectionner

ggplot() +  geom_raster(data =data_gui , aes(x = x, y = y, fill = z))


Serg

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: ggplot2 : graph à trois variables

Messagepar Mickael Canouil » 19 Avr 2019, 10:41

Bonjour,

En l'état, il est impossible de vous aider, pas de données, pas d'image de ce que vous obtenez.
Pour l'erreur de stat_contour, l'erreur me semble assez explicite (contrairement à d'autres packages.)

Code : Tout sélectionner

> toto<-ggplot(data_gui, aes(x = x, y = y, z = z))+
+geom_contour(aes(z=z))
> print(toto)

Pourquoi définissez-vous z deux fois, une fois de façon globale (dans ggplot) et une fois localement (dans geom_contour) ?

Et comme j'aime beaucoup deux messages très pratiques de ce forum, je me permet de les remettre ici:
Qu'est-ce qu'un code reproductible ?
Comment insérer des données dans un message ?

Code : Tout sélectionner

library(tidyverse)

.data <- expand.grid(x = 0:5, y = 0:5)
.data$z <- runif(nrow(.data))

ggplot(data = .data, mapping = aes(x = x, y = y, z = z)) +
  geom_raster(mapping = aes(fill = z))

Image

EDIT:

Code : Tout sélectionner

ggplot(.data, aes(x = x, y = y, z = z)) +
  geom_contour()

Image

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

Re: ggplot2 : graph à trois variables

Messagepar Guillaume Dramais » 19 Avr 2019, 17:13

Merci de vos réponses

Voilà un code reproductible qui ressemble à mes données, à quelques milliers de données près, il m'a effectivement permis de mieux comprendre mon problème.

Code : Tout sélectionner

library(reshape2)
library(ggplot2)

test<-rbind(c(0.1,0.3,0.8,0.7,0.5,0.3,0.2),
            c(NaN,0.2,NaN,0.6,0.7,0.4,0.1),
            c(NaN,NaN,0.5,0.3,NaN,0.9,NaN),
            c(NaN,NaN,NaN,NaN,NaN,NaN,NaN))
rownames(test)<- c(0.9,1.4,1.9,2.4)
distance<-c(0.7,2.4,5.1,6.7,7.2,7.9,8.4)
colnames(test)<- c(distance)

test<-setNames(melt(test),c('x','y','z')) #cree un df

#graph

test<-ggplot(test, mapping=aes(x = x, y = y, z = z)) + 
  geom_raster(mapping = aes(fill = z))
print(test)


Avec geom_raster j'obtiens un résultat dans le bon repère. Ce qui est bien, mais par contre je voudrais un graph qui interpole et affiche les valeurs dans toute la grille.
C'est pour cela que j'obtenais un résultat plus proche de ce que je veux avec la fonction image qui prend le nombre de valeur en abscisse et ordonnées. Mais je ne sais pas s'il est possible de faire quelques chose comme ça avec ggplot? Ou de jouer avec le repère dans "image"?

Voilà le code et l'image que j'obiens avec le même jeu de données et la fonction image, ce qui se rapproche de ce que je voudrais obtenir graphiquement, sauf pour les dimensions des axes et l'orientation.

Code : Tout sélectionner


test<-rbind(c(0.1,0.3,0.8,0.7,0.5,0.3,0.2),
            c(NaN,0.2,NaN,0.6,0.7,0.4,0.1),
            c(NaN,NaN,0.5,0.3,NaN,0.9,NaN),
            c(NaN,NaN,NaN,NaN,NaN,NaN,NaN))
rownames(test)<- c(0.9,1.4,1.9,2.4)
distance<-c(0.7,2.4,5.1,6.7,7.2,7.9,8.4)
colnames(test)<- c(distance)

image(test, col = terrain.colors(100))
contour(test, add = TRUE, col = "peru")



merci d'avance
Guillaume

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: ggplot2 : graph à trois variables

Messagepar Mickael Canouil » 23 Avr 2019, 08:01

Hum...
geom_contour donne le même résultat qu'image.

La transformation de l'échelle des axes est liées à la structure des objets utilisés.

Code : Tout sélectionner

library(reshape2)
library(ggplot2)

test <- rbind(
  c(0.1, 0.3, 0.8, 0.7, 0.5, 0.3, 0.2),
  c(NaN, 0.2, NaN, 0.6, 0.7, 0.4, 0.1),
  c(NaN, NaN, 0.5, 0.3, NaN, 0.9, NaN),
  c(NaN, NaN, NaN, NaN, NaN, NaN, NaN)
)
rownames(test) <- c(0.9, 1.4, 1.9, 2.4)
distance <- c(0.7, 2.4, 5.1, 6.7, 7.2, 7.9, 8.4)
colnames(test) <- c(distance)

# graph
data_gg <- setNames(melt(test), c("x", "y", "z"))
ggplot(data_gg, mapping = aes(x = x, y = y, z = z)) +
  # geom_raster(mapping = aes(fill = z)) +
  geom_contour()
#> Warning: Removed 13 rows containing non-finite values (stat_contour).

Image

Pour le warning que vous aviez, c'est tout à fait normal:

Code : Tout sélectionner

sum(is.na(data_gg[["z"]]))
#> [1] 13


Code : Tout sélectionner

image(test, col = "white")
contour(test, add = TRUE, col = "peru")

Image
Mickaël
mickael.canouil.fr | rlille.fr

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

[Résolu] Re: ggplot2 : graph à trois variables

Messagepar Guillaume Dramais » 25 Avr 2019, 15:12

Merci
Avec mon jeu de donnée réel, j'ai trouvé une solution avec ggplot en ajoutant l'option stat_summary_2d(), ça se rapproche de ce que je voulais faire.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité