web-dev-qa-db-fra.com

Comment changer la gamme de couleurs heatmap.2 dans R?

J'utilise gplot pour produire une carte thermique montrant les changements de log2 fois d'un groupe de traitement par rapport à des contrôles appariés. Avec le code suivant:

 heatmap.2(as.matrix(SeqCountTable), col=redgreen(75), 
           density.info="none", trace="none", dendrogram=c("row"), 
            symm=F,symkey=T,symbreaks=T, scale="none") 

Je produis une carte de chaleur avec de vraies valeurs de changement de pli (c'est-à-dire un score non Row-Z) qui est ce que je recherche, dans le jeu de couleurs Rouge-Noir-Vert qui est le favori de tous les biologistes!

http://i.stack.imgur.com/uhFbP.jpg

La plage réelle du changement de log2 est de -3/+ 7, avec de nombreuses valeurs dans la plage -2/-1 et + 1/+ 2, qui apparaissent respectivement en rouge/vert foncé. Cela rend l'ensemble de la carte thermique assez sombre et si difficile à interpréter.

  • Existe-t-il un moyen de biaiser le dégradé de couleurs pour le rendre moins linéaire? Autrement dit, de sorte que le gradient du noir au très brillant se produit sur une plage plus petite?
  • Et/ou changer la gamme de couleurs pour qu'elle soit asymétrique, c'est-à-dire pour aller de -3/+ 7, comme le font les données, plutôt que de -7/+ 7 comme l'échelle le fait actuellement, avec le noir toujours centré sur zéro?
14
Lippy

J'ai obtenu que la gamme de couleurs soit asymétrique simplement en changeant l'argument symkey en FALSE

symm=F,symkey=F,symbreaks=T, scale="none"

Résolution du problème de couleur avec colorRampPalette avec l'argument breaks pour spécifier la plage de chaque couleur, par exemple.

colors = c(seq(-3,-2,length=100),seq(-2,0.5,length=100),seq(0.5,6,length=100))

my_palette <- colorRampPalette(c("red", "black", "green"))(n = 299)

Tout à fait

heatmap.2(as.matrix(SeqCountTable), col=my_palette, 
    breaks=colors, density.info="none", trace="none", 
        dendrogram=c("row"), symm=F,symkey=F,symbreaks=T, scale="none")
14
Lippy

Vous pouvez essayer de créer votre propre palette de couleurs en utilisant le package RColorBrewer

my_palette <- colorRampPalette(c("green", "black", "red"))(n = 1000)

et voyez à quoi cela ressemble. Mais je suppose que dans votre cas, seule la mise à l'échelle serait utile si vous voulez vraiment garder le noir au "milieu". Vous pouvez simplement utiliser my_palette Au lieu de redgreen()

Je vous recommande de consulter le package RColorBrewer , ils ont de jolies palettes intégrées et voir interactif site Web pour colorbrewer .

13
user2489252

Voici une autre option pour ceux qui n'utilisent pas heatmap.2 (aheatmap c'est bien!)

Créez un vecteur séquentiel de 100 valeurs de min à max de votre matrice d'entrée, trouvez la valeur la plus proche de 0, créez deux vecteurs de couleurs vers et à partir du milieu souhaité, combinez-les et utilisez-les:

breaks <- seq(from=min(range(inputMatrix)), to=max(range(inputMatrix)), length.out=100)
midpoint <- which.min(abs(breaks - 0))
rampCol1 <- colorRampPalette(c("forestgreen", "darkgreen", "black"))(midpoint)
rampCol2 <- colorRampPalette(c("black", "darkred", "red"))(100-(midpoint+1))
rampCols <- c(rampCol1,rampCol2)
0
bruce.moran

Je pense que vous devez définir symbreaks = FALSE Cela devrait permettre des échelles de couleurs asymétriques.

0
Whsky Steve