2017-09-22 4 views
-1

Je cherche un moyen facile de créer une carte de chaleur personnalisée (en Python, ou R, ou Tableau). Je n'arrive pas à comprendre comment personnaliser les couleurs quand j'en ai besoin.Carte de chaleur avec des couleurs personnalisées

Fondamentalement, j'ai un fichier .tsv avec fonctionnalité et leur classement. Le classement va, par exemple, de 1 à 10 et de -1 à -10 dans le même fichier.

J'ai besoin d'un blanc pour les zéros. Puis, des couleurs plus foncées pour 1 et -1 qui deviennent alors plus légères. Ainsi, par exemple, je dois avoir du rouge foncé pour 1 et du rouge clair pour 10, puis du bleu foncé pour -1 et du bleu clair pour -10.

Une idée sur la façon dont j'ai pu obtenir ce résultat?


modifier: Voici comment mon regard de données:

structure(list(Features = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 11L, 12L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 
20L, 21L), .Label = c("char_per_tok", "cpos_dist_AUX", "cpos_dist_NUM", 
"dep_dist_aux", "dep_dist_nummod", "dep_freq_aux", "dep_freq_nmod", 
"dep_freq_nummod", "in_dict", "in_dict_types", "in_FO", "in_FO_types", 
"itwac_forme", "itwac_lemmi", "n_prepositional_chains", "prep_dist_3", 
"prep_freq_1", "prep_freq_3", "subj_post", "verb_edges_dist_7", 
"verb_edges_freq_7"), class = "factor"), A10 = c(1L, -14L, -6L, 
-8L, -5L, -7L, 3L, -3L, -1L, -11L, -2L, -4L, 0L, 59L, 4L, -9L, 
2L, -10L, 0L, -13L, -12L), A11 = c(3L, -14L, -6L, -8L, -5L, -7L, 
4L, -4L, -1L, -11L, -2L, -3L, 1L, 2L, 0L, -9L, 5L, -10L, 0L, 
-13L, -12L), A12 = c(3L, 0L, -3L, -5L, -2L, -4L, 0L, -1L, 0L, 
0L, 0L, 0L, 1L, 2L, 0L, -6L, 0L, -7L, 0L, -9L, -8L), A13 = c(3L, 
0L, -3L, 0L, -2L, 0L, 0L, -1L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, -4L, 
0L, -5L, 0L, 0L, 0L), A14 = c(1L, 0L, -3L, 0L, -2L, 0L, 0L, -1L, 
0L, 0L, 0L, 0L, 0L, 2L, 0L, -4L, 0L, -5L, 0L, 0L, 0L), A15 = c(2L, 
0L, -3L, 0L, -2L, 0L, 0L, -1L, 0L, 0L, 0L, 0L, 1L, 3L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), A16 = c(0L, 0L, -4L, -5L, -1L, 0L, 0L, -2L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, -3L, 0L, 0L)), .Names = c("Features", 
"A10", "A11", "A12", "A13", "A14", "A15", "A16"), class = "data.frame", row.names = c(NA, 
-21L)) 
+1

Qu'avez-vous fait jusqu'à présent? Un exemple de la façon dont vous avez créé un heatmap sans vos couleurs spécifiées serait utile pour comprendre où vous avez besoin d'aide. – asongtoruin

Répondre

0

En R, vous pouvez utiliser la bibliothèque ggplot2, geom_tile pour indiquer ce qui est tracée et scale_fill_gradientn pour spécifier les couleurs. Voici un exemple:

#diamonds + column rank with a range of -10:10 
library(ggplot2) 
data(diamonds) 
diamonds_1= data.frame(diamonds, rank = sample(c(-10:10), nrow(diamonds), replace = T)) 


ggplot(data = diamonds_1)+ 
    geom_tile(aes(color, cut, fill = rank))+ 
    scale_fill_gradientn(colors = c("lightblue", "blue", "white", "red", "pink"), 
         values = scales::rescale(c(-10, -1, 0, 1, 10)))+ 
    coord_equal() 

enter image description here

EDIT: avec des données fournies (je l'importaient pour objet z)

z_melt = reshape2::melt(z, id.vars = 1) #convert to long format 
library(ggplot2) 
ggplot(data = z_melt)+ 
    geom_tile(aes(y = Features, x = variable, fill = value))+ 
    scale_fill_gradientn(colors = c("#ccccff", "lightblue", "blue", "white", "red", "#ff7f7f", "#ffcccc"), 
         values = scales::rescale(c(min(z_melt$value), -10, -1, 0, 1, 10, max(z_melt$value))), 
         breaks = c(-10, 0, 10, 40), 
         labels=c(-10, 0, 10, 40))+       
    coord_equal()+ 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

enter image description here

+0

Merci, c'est en fait le type de colorant que je cherchais! – Bet

+0

J'ai ajouté une image de mes données. Pouvez-vous s'il vous plaît m'expliquer comment les tracer afin que j'obtienne le même résultat de votre photo? – Bet

+0

@Bet s'il vous plaît fournir des données avec «dput» ou au moins sous la forme d'un tableau de texte. – missuse

0

dans R, vous pouvez utiliser le package scales pour générer les valeurs de couleur.

Pour générer les couleurs, utilisez gradient_n_pal. Choisissez la couleur que vous voulez pour les valeurs négatives, la couleur pour les positifs, puis placez "white" entre eux. seq(0, 1, length.out = 21) crée un vecteur de longueur 21 qui définit l'évanouissement.

gradient <- scales::gradient_n_pal(c("purple", "white", "green"))(seq(0, 1, length.out = 21)) 

Ce barplot trivial montre le résultat

library(ggplot2) 

Dframe <- data.frame(x = factor(-10:10)) 

ggplot(data = Dframe, 
     mapping = aes(x = x)) + 
    geom_bar(fill = gradient) 

enter image description here

0

Pour créer le nuancier dans Tableau: Si vous voulez des couleurs individuelles pour chaque rang, faites simplement glisser votre [Classement] dimension à la couleur. Si vous voulez une sortie bagués, vous pouvez créer un champ de clé de couleur calculée, d'une part attribuer une valeur à chaque classement en créant un nouveau champ calculé comme:

If [Ranking] = -10 then "Cold" 
ElseIf [Ranking] = -9 then "Cold" 
ElseIf [Ranking] = -8 then "Cold" 
ElseIf [Ranking] = -7 then "Cold" 
ElseIf [Ranking] = -6 then "Cold" 
ElseIf [Ranking] = -5 then "Warm" 
ElseIf [Ranking] = -4 then "Warm" 
ElseIf [Ranking] = -3 then "Warm" 
ElseIf [Ranking] = -2 then "Warm" 
ElseIf [Ranking] = -1 then "Warm" 
ElseIf [Ranking] = -0 then "Warm" 
ElseIf [Ranking] = 1 then "Warm" 
ElseIf [Ranking] = 2 then "Warm" 
ElseIf [Ranking] = 3 then "Warm" 
ElseIf [Ranking] = 4 then "Warm" 
ElseIf [Ranking] = 5 then "Hot" 
ElseIf [Ranking] = 6 then "Hot" 
ElseIf [Ranking] = 7 then "Hot" 
ElseIf [Ranking] = 8 then "Hot" 
ElseIf [Ranking] = 9 then "Hot" 
ElseIf [Ranking] = 10 then "Hot" 
else "Unknown ranking" end 

Faites glisser ce champ à la couleur et vous pouvez appliquer un palais de votre choix à lui. Il s'agit d'une manière légèrement longue d'écrire le champ calculé, en fonction de la mise en forme de votre champ de classement. Vous pouvez utiliser des bandes numériques à la place, mais en l'écrivant, vous pouvez voir clairement ce qui se passe pour chaque partition.

+0

Une déclaration de cas est moins verbeuse –