IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Couleurs inversées sur Heatmap


Sujet :

R

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut Couleurs inversées sur Heatmap
    Bonjour à toutes et à tous.

    Je voudrais, à partir d'un fichier .cvs, générer une heapmap.
    Actuellement, j'ai réalisé toutes mes heatmaps sans problème en niveau de gris.
    Hors, lorsque j'essaye de les réaliser en couleur via la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heatM <- heatmap(mat, Rowv=NA, Colv=NA, scale="none", margins=c(5,10))
    Je m'aperçois que les couleurs sont "inversées".

    Pour mieux vous représenter ce que je veux dire, je vous joins une de mes heatmaps.

    En fait, ce que je voudrais avoir est, pour le bas de la heatmap, une première colonne "foncée" (-> rouge), la deuxième claire (-> jaune), la troisième foncée (-> rouge), etc.
    Naturellement quand je parle de "rouge" et "jaune" je veux dire "avec toutes les nuances de couleurs entres les deux (jaune pâle, jaune, jaune-orangé, etc.). Je voudrais faire cela car sinon, ma heatmap ne me donne pas un résultat concordant avec mes données.

    En niveau de gris, j'ai effectivement "noir, "blanc "noir", etc. et pour le coup, c'est cohérent avec mes données.

    Pourquoi n'ai-je pas le même rendu en couleur ?

    Merci d'avance pour vos conseils/réponses !

    Nath
    Images attachées Images attachées  

  2. #2
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Bonjour Nathalie,

    Si tu passes par un paramètre comme par exemple dans ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heatM <- heatmap(mat, Rowv=NA, Colv=NA, scale="none", col = 15:1, margins=c(5,10))
    Cela ne peut-il pas t'aider ?

    Pour le choix des couleurs, si tu veux un dégradé, tu as la fonction rainbow. Cela sera plus joli que le code que je viens de te donner.

    Cordialement.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Merci beaucoup pour ta réponse.

    Sans utiliser rainbow mais en utilisant seulement le bout de code que tu m'as donné j'ai effectivement une bande foncée, puis une claire, etc. donc c'est super.
    Mais j'ai plein de couleurs autre que le jaune et rouge, comme du mauve, du noir, etc. et ce n'est pas très joli.

    Comment puis-je utiliser "rainbow" pour n'avoir que des nuances de couleurs variant entre jaune et rouge ?

    Nath

  4. #4
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rc <- rainbow(nrow(x), start=1, end=.3, alpha = 0.5)
    heatM <- heatmap(mat, Rowv=NA, Colv=NA, scale="none", col = rc, margins=c(5,10))
    Après tu peux regarder l'aide:


  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Merci encore.

    Malheureusement, l'utilisation de cette fonction me renvoie au même problème, à savoir que ma 1ère bande est claire, tandis que la seconde est foncée, alors que c'est le contraire que je souhaiterais...

  6. #6
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par nathalie02 Voir le message
    Merci encore.

    Malheureusement, l'utilisation de cette fonction me renvoie au même problème, à savoir que ma 1ère bande est claire, tandis que la seconde est foncée, alors que c'est le contraire que je souhaiterais...
    Bonjour,
    j'ai du mal à reproduire votre problème: pourriez-vous nous donner un extrait de votre jeu de données pour que nous puissions reproduire les codes ?

    Sinon, à partir de l'aide, j'entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rc <- rainbow(32, s = 1, v = 1, start = 0, end = 1/6,gamma = 1, alpha = 1)
    hv <- heatmap(x, col = rc, scale="column",
                   RowSideColors = rc, ColSideColors = cc, margins=c(5,10),
                   xlab = "specification variables", ylab= "Car Models",
                   main = "heatmap(<Mtcars data>, ..., scale = \"column\")")
    et tout a l'air ok ...

    Sinon, à tout hasard, je suppose que vous avez manipulé les paramètres de scale ?

    Bon courage

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    En fait, ça me donne les bonnes couleurs, mais comme je l'ai dit dans mon premier post, j'aimerais qu'elles soient "inversées". En niveau de gris j'ai la première bande qui est foncée, la deuxième, claire, la 3è foncée, la 4e claire, la 5e foncée, et la 6e claire, ce qui est correcte au vu de mes données et de ce qu'elles représentent.

    Or, lorsque je passe en couleurs j'obtiens "jaune - rouge - jaune - rouge - jaune - rouge".

    Je voudrais juste l'inverse...

    Je vous joints un échantillon de mes données.

    Merci encore !
    Fichiers attachés Fichiers attachés

  8. #8
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Si tu veux inverser les couleurs par exemple tu peux écrire dans tes paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col = c("red", "yellow")
    ou dans l'autre sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col = c( "yellow", "red")
    ce qui va inverser les couleurs.

    Si tu veux un gamme de couleurs plus variée parce que ce n'est pas assez nuancé, tu utilises la fonction rainbow et la fonction sort pour trier dans un sens ou dans l'autre. C'est vrai que cela n'est pas évident de choisir sa gamme de couleurs mais je pense que les idées sont là.

    Par exemple, tu prends le code de l'exemple de rainbow

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    demo.pal <-
      function(n, border = if (n<32) "light gray" else NA,
               main = paste("color palettes;  n=",n),
               ch.col = c("rainbow(n, start=.7, end=.1)", "heat.colors(n)",
                          "terrain.colors(n)", "topo.colors(n)",
                          "cm.colors(n)"))
    {
        nt <- length(ch.col)
        i <- 1:n; j <- n / nt; d <- j/6; dy <- 2*d
        plot(i,i+d, type="n", yaxt="n", ylab="", main=main)
        for (k in 1:nt) {
            rect(i-.5, (k-1)*j+ dy, i+.4, k*j,
                 col = eval(parse(text=ch.col[k])), border = border)
            text(2*j,  k * j +dy/4, ch.col[k])
        }
    }
    n <- if(.Device == "postscript") 64 else 16
         # Since for screen, larger n may give color allocation problem
    demo.pal(n)
    Tu prends ton code avec l'option col

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    heatM <- heatmap(x, Rowv=NA, Colv=NA, scale="none", margins=c(5,10), col = sort(heat.colors(n)[1:12], decreasing = TRUE) )
    Je prends juste les 12 premières couleurs et tu obtiens, je crois quelque chose qui s'approche de ce que tu cherches.

    Cdt

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Merci beaucoup pour ton intervention.

    Voila, la fonction que tu m'as donnée avec rainbow me donne les bonnes couleurs, mais toujours pas dans le même ordre (avec n = 16). J'ai toujours d'abord une bande jaune puis une bande rouge, etc. Alors que c'est le contraire que je voudrais.

    Par contre, lorsque je spécifie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col = c("yellow", "red")
    Les couleurs de ma heatmap dont dans le "bon ordre", c'est à dire une bande rouge, puis une jaune, puis une rouge, etc.
    Le problème est que qu'il n'y a pas assez de nuances et ce n'est pas joli. C'est soit tout jaune, soit tout rouge...

    Une solution ?

    Merci beaucoup !

  10. #10
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Je me suis peu être mal exprimé mais tout est là.

    Si tu veux changer le sens des couleurs, tu effectues un tri sur tes données couleurs (le résultat de ta fonction rainbow) avec la fonction sort et l'option decreasing = FALSE ou TRUE

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    > sort(c("red", "yellow") ,decreasing = TRUE)
    [1] "yellow" "red"
     
    sort(sort(c("red", "yellow") ,decreasing = TRUE), decreasing = FALSE)
    [1] "red"    "yellow"
    ou avec la fonction rainbow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > sort(heat.colors(n)[1:12], decreasing = TRUE)
     [1] "#FFFF00FF" "#FFE800FF" "#FFD100FF" "#FFB900FF" "#FFA200FF" "#FF8B00FF"
     [7] "#FF7400FF" "#FF5D00FF" "#FF4600FF" "#FF2E00FF" "#FF1700FF" "#FF0000FF"
    > heat.colors(n)[1:12]
     [1] "#FF0000FF" "#FF1700FF" "#FF2E00FF" "#FF4600FF" "#FF5D00FF" "#FF7400FF"
     [7] "#FF8B00FF" "#FFA200FF" "#FFB900FF" "#FFD100FF" "#FFE800FF" "#FFFF00FF"
    Je tape [1:12] pour prendre uniquement les couleurs rouge et jaunes sinon tu auras du blanc.

    Les couleurs sont codées en Red Green Blue
    #FF0000FF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > heat.colors(n)[1:16]
     [1] "#FF0000FF" "#FF1700FF" "#FF2E00FF" "#FF4600FF" "#FF5D00FF" "#FF7400FF"
     [7] "#FF8B00FF" "#FFA200FF" "#FFB900FF" "#FFD100FF" "#FFE800FF" "#FFFF00FF"
    [13] "#FFFF20FF" "#FFFF60FF" "#FFFF9FFF" "#FFFFDFFF"

    "#FFFF60FF" "#FFFF9FFF" "#FFFFDFFF" tend vers le blanc, il faut donc les éliminer si tu veux du jaune, d'où la partie du code [1:12]

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Ohlala, j'avais mal placé une parenthèse.

    C'est merveilleux, ça fonctionne maintenant.

    Un très très grand merci pour votre aide et vos explications !!

    Nath

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couleur texte sur SELECT en disable
    Par richard038 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/08/2006, 12h22
  2. Couleur transparente sur une texture TGA
    Par alex6891 dans le forum OpenGL
    Réponses: 13
    Dernier message: 29/07/2006, 21h16
  3. Ligne dans une BufferedImage avec couleur inverse
    Par bourbon dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/05/2006, 01h31
  4. Impression couleur alternée sur entête de groupe
    Par mariol dans le forum Access
    Réponses: 4
    Dernier message: 08/03/2006, 22h20
  5. Couleurs fantaisistes sur un graphe
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 14/10/2005, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo