J'aimerais créer une carte thermique comme celle-ci (affichée sur FlowingData ):
Les données sources sont ici , mais des données aléatoires et des étiquettes seraient bien à utiliser, c'est-à-dire
import numpy
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = numpy.random.rand(4,4)
Faire la carte thermique est assez simple dans matplotlib:
from matplotlib import pyplot as plt
heatmap = plt.pcolor(data)
Et j'ai même trouvé des arguments de palette de couleurs qui semblent corrects :heatmap = plt.pcolor(data, cmap=matplotlib.cm.Blues)
Mais au-delà de cela, je ne peux pas comprendre comment afficher les étiquettes pour les colonnes et les lignes et afficher les données dans la bonne orientation (origine en haut à gauche au lieu de en bas à gauche).
Les tentatives de manipulation heatmap.axes
(par exemple heatmap.axes.set_xticklabels = column_labels
) ont toutes échoué. Qu'est-ce que j'oublie ici?
la source
Réponses:
C'est tard, mais voici mon implémentation python de la carte thermique NBA de flowingdata.
mise à jour: 1/4/2014 : merci à tous
La sortie ressemble à ceci:
Il y a un notebook ipython avec tout ce code ici . J'ai beaucoup appris du débordement alors j'espère que quelqu'un trouvera cela utile.
la source
pcolor
comme celui-ci mais qui a des valeurs numériques montrées aussi. OU: Je veux créer un matplotlibtable
qui colore ses cellules. J'ai vu des solutions à l'autre problème, et elles sont esthétiquement laides. Cela a l'air génial, si seulement je savais comment superposer les chiffres.Le module python seaborn est basé sur matplotlib, et produit une très belle carte thermique.
Vous trouverez ci-dessous une implémentation avec seaborn, conçue pour le notebook ipython / jupyter.
Le résultat ressemble à ceci: j'ai utilisé la carte de couleurs matplotlib Blues, mais je trouve personnellement les couleurs par défaut assez belles. J'ai utilisé matplotlib pour faire pivoter les étiquettes de l'axe x, car je ne trouvais pas la syntaxe seaborn. Comme noté par grexor, il était nécessaire de spécifier les dimensions (fig.set_size_inches) par essais et erreurs, ce que j'ai trouvé un peu frustrant.
Comme l'a noté Paul H, vous pouvez facilement ajouter les valeurs aux cartes thermiques (annot = True), mais dans ce cas, je ne pense pas que cela ait amélioré la figure. Plusieurs extraits de code ont été extraits de l'excellente réponse de joelotz.
la source
Le problème principal est que vous devez d'abord définir l'emplacement de vos graduations x et y. En outre, cela aide à utiliser l'interface plus orientée objet vers matplotlib. À savoir, interagissez
axes
directement avec l' objet.J'espère que cela pourra aider.
la source
heatmap.axes
propriété, qui pour une raison quelconque ne fait rien.ax.xaxis.set_label_position('top')
en vain.annot=True
fois appelé ( stanford.edu/~mwaskom/software/seaborn/generated/… )Quelqu'un a édité cette question pour supprimer le code que j'ai utilisé, j'ai donc été obligé de l'ajouter comme réponse. Merci à tous ceux qui ont répondu à cette question! Je pense que la plupart des autres réponses sont meilleures que ce code, je laisse cela ici à des fins de référence.
Avec mes remerciements à Paul H et à unutbu (qui a répondu à cette question ), j'ai une sortie assez jolie:
Et voici la sortie:
la source