Eu gostaria de fazer um mapa de calor como este (mostrado em FlowingData ):
Os dados de origem estão aqui , mas dados e rótulos aleatórios podem ser usados, ou seja,
import numpy
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = numpy.random.rand(4,4)
Fazer o mapa de calor é bastante fácil em matplotlib:
from matplotlib import pyplot as plt
heatmap = plt.pcolor(data)
E eu até encontrei argumentos de um mapa de cores que parecem certos:heatmap = plt.pcolor(data, cmap=matplotlib.cm.Blues)
Mas, além disso, não consigo descobrir como exibir rótulos para as colunas e linhas e exibir os dados na orientação adequada (origem no canto superior esquerdo em vez de inferior esquerdo).
Todas as tentativas de manipulação heatmap.axes
(por exemplo heatmap.axes.set_xticklabels = column_labels
) falharam. O que estou perdendo aqui?
python
matplotlib
data-visualization
heatmap
Jason Sundram
fonte
fonte
Respostas:
Já é tarde, mas aqui está minha implementação em python do mapa de calor da NBA fluindo dados.
atualizado: 04/01/2014 : obrigado a todos
A saída é semelhante a esta:
Há um notebook ipython com todo esse código aqui . Eu aprendi muito com 'overflow, então espero que alguém ache isso útil.
fonte
pcolor
assim, mas que também tem valores numéricos mostrados. OU: Eu quero fazer um matplotlibtable
que colore suas células. Já vi soluções para o outro problema, e elas são esteticamente feias. Isso parece ótimo, se eu soubesse como sobrepor os números.O módulo python seaborn é baseado em matplotlib e produz um mapa de calor muito bom.
Abaixo está uma implementação com seaborn, projetada para o notebook ipython / jupyter.
O resultado é o seguinte: Usei o mapa de cores matplotlib Blues, mas pessoalmente acho as cores padrão muito bonitas. Usei matplotlib para girar os rótulos do eixo x, pois não consegui encontrar a sintaxe do mar. Conforme observado por grexor, foi necessário especificar as dimensões (fig.set_size_inches) por tentativa e erro, o que achei um pouco frustrante.
Conforme observado por Paul H, você pode adicionar facilmente os valores aos mapas de calor (annot = True), mas, neste caso, não acho que isso tenha melhorado a figura. Vários trechos de código foram retirados da excelente resposta de joelotz.
fonte
O principal problema é que primeiro você precisa definir a localização de seus tiques xey. Além disso, ajuda a usar a interface mais orientada a objetos para matplotlib. Ou seja, interaja com o
axes
objeto diretamente.Espero que ajude.
fonte
heatmap.axes
propriedade, que por algum motivo não faz nada.ax.xaxis.set_label_position('top')
sem sucesso.annot=True
quando chamado ( stanford.edu/~mwaskom/software/seaborn/generated/… )Alguém editou esta pergunta para remover o código que eu usei, então fui forçado a adicioná-la como uma resposta. Obrigado a todos que participaram respondendo a esta pergunta! Acho que a maioria das outras respostas é melhor do que este código, estou apenas deixando isso aqui para fins de referência.
Com agradecimentos a Paul H e unutbu (que respondeu a esta pergunta ), tenho uma saída de aparência muito boa:
E aqui está o resultado:
fonte