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

graph à trois variables

Messagepar Guillaume Dramais » 29 Oct 2018, 23:37

Bonjour,
Je voudrais faire un graphique type contour. Avec des coordonnées spaciales en x,y et un niveau en échelle de couleur comme troisième variable.

J'ai un dataframe avec des coordonnées spaciales x,y (en m) et une troisième colonne avec une valeur numérique pour chaque couple x,y. Je peux utiliser ce dataframe tel quel (3 colonnes), je l'ai aussi transformé en matrice avec la fonction cast pour essayer de grapher directement la matrice.

J'ai parcouru les questions et exemples sur ggplot2, ploty et autres et mais je n'arrive pas a faire un graph simple et propre.

Pourriez vous svp m'envoyer un exemple, ou des pistes pour me guider? Est ce plus simple de partir de la matrice ou du dataframe de 3 colonnes?
Merci d'avance

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

Re: graph à trois variables

Messagepar Serge Rapenne » 30 Oct 2018, 08:26

Bonjour,

Qu'appelles tu "un graph simple et propre" ?
pour des graphiques x,y,z j'utilise la fonction image mais surtout le package raster et la fonction plot.raster.

Code : Tout sélectionner

?image
#et
library(raster)
?plot.raster

pour les détails et surtout les exemples.

Serge

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

Re: graph à trois variables

Messagepar Guillaume Dramais » 30 Oct 2018, 16:45

Bonjour,
Merci de ta réponse

Par simple, je veux dire faisable sans y passer une semaine (je suis débutant en R, je dois construire un code pour traiter mes données et depuis que j'ai démarré (en septembre) j'ai l'impression de perdre beaucoup de temps à chercher, tester, retester, bidouiller... mais il faut sans doute passer par là)
Par propre, je veux dire plus lisible que ce que j'ai pu faire jusqu'à maintenant, j'ai eu pour l'instant des résultats artistiques mais absolument pas représentatifs de mes données ou de ce que je veux montrer.

Effectivement grace à l'exemple volcano dans https://www.rdocumentation.org/packages/graphics/versions/3.5.1/topics/image j'arrive à adapter le code et à grapher ma matrice de données, par contre les unités sont en nb de valeurs de lignes et de colonnes, peut on revenir à une échelle dimensionnelle?

Mon indice de ligne ou ce qui apparait en gras quand j'affiche la matrice est une distance en m, et ma première colonne une profondeur en m, j'aimerais utiliser ces valeurs comme axes réels du graph, y a t il un truc pour faire ça?
Je n'ai pas réussi à ajouter une légende avec le code couleur et valeur, mais je m'y prend mal je pense?
Et enfin peut on affecter une couleur au non-valeurs NaN?

Code : Tout sélectionner

# Grapher la matrice mat6 de concentrations
x <- (1:nrow(mat6))
y <- (1:ncol(mat6))
image(x, y, mat6, col = terrain.colors(15, alpha=1), axes = TRUE, xlim= rev(range(seq(x))), ylim= rev(range(seq(y))+5),
      xlab="Distance (m)",ylab="Depth (m)",)
#box()
legend(50,40, z, legend, fill = NULL, col = par("col"),
       border = "black")
title(main = "Sub-sections", font.main = 3)


merci d'avance
Guillaume

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

Re: graph à trois variables

Messagepar Logez Maxime » 31 Oct 2018, 08:49

Bonjour,

j'avais trouvé cette fonction sur le net pour représenter les données d'une matrice :

Code : Tout sélectionner

# fonction en provenance de :
# http://www.phaget4.org/R/image_matrix.html

# ----- Define a function for plotting a matrix ----- #
myImagePlot <- function(x, axes = TRUE, col = NULL, ...){
  min <- min(x, na.rm = TRUE)
  max <- max(x, na.rm = TRUE)
  yLabels <- rownames(x)
  xLabels <- colnames(x)
  title <-c()
  # check for additional function arguments
  if( length(list(...)) ){
    Lst <- list(...)
    if( !is.null(Lst$zlim) ){
      min <- Lst$zlim[1]
      max <- Lst$zlim[2]
    }
    if( !is.null(Lst$yLabels) ){
      yLabels <- c(Lst$yLabels)
    }
    if( !is.null(Lst$xLabels) ){
      xLabels <- c(Lst$xLabels)
    }
    if( !is.null(Lst$title) ){
      title <- Lst$title
    }
  }
  # check for null values
  if( is.null(xLabels) ){
    xLabels <- c(1:ncol(x))
  }
  if( is.null(yLabels) ){
    yLabels <- c(1:nrow(x))
  }
 
  layout(matrix(data=c(1,2), nrow=1, ncol=2), widths=c(4,1), heights=c(1,1))
 
  # Red and green range from 0 to 1 while Blue ranges from 1 to 0
  if (is.null(col)){
    ColorRamp <- rgb( seq(0,1,length=256),  # Red
                      seq(0,1,length=256),  # Green
                      seq(1,0,length=256))  # Blue
    ColorLevels <- seq(min, max, length=length(ColorRamp))
  }
  else
    ColorLeves <- col
 
  # Reverse Y axis
  reverse <- nrow(x) : 1
  yLabels <- yLabels[reverse]
  x <- x[reverse,]
 
  # Data Map
  par(mar = c(3,5,2.5,2))
  image(1:length(xLabels), 1:length(yLabels), t(x), col=ColorRamp, xlab="",
        ylab="", axes=FALSE, zlim=c(min,max))
  if( !is.null(title) ){
    title(main=title)
  }
  if (axes){
    axis(BELOW<-1, at=1:length(xLabels), labels=xLabels, cex.axis=0.7)
    axis(LEFT <-2, at=1:length(yLabels), labels=yLabels, las= HORIZONTAL<-1,
         cex.axis=0.7)
  }
  # Color Scale
  par(mar = c(3,2.5,2.5,2))
  image(1, ColorLevels,
        matrix(data=ColorLevels, ncol=length(ColorLevels),nrow=1),
        col=ColorRamp,
        xlab="",ylab="",
        xaxt="n")
 
  layout(1)
}
# ----- END plot function ----- #

mat <- matrix(1:20, 4)
myImagePlot(mat)
Cordialement,
Maxime

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

Re: graph à trois variables

Messagepar Guillaume Dramais » 31 Oct 2018, 16:51

Maxime,
Merci de ta réponse, il faut que j'arrive à comprendre le code, mais ça marche très bien avec mes données. ça répond aux deux questions sur la dimension des axes et la légende. J'arrive à régler pas mal de paramètres, mais je n'arrive pas à jouer sur la densité des étiquettes des axes. Comment peut on faire ça?

Merci
Cordialement
Guillaume


Retourner vers « Questions en cours »

Qui est en ligne

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