matplotlib与pcolor的热图?

我想制作一个像这样的热图(在FlowingData上显示 ): 热图

源数据在这里 ,但随机数据和标签将是罚款使用,即

import numpy column_labels = list('ABCD') row_labels = list('WXYZ') data = numpy.random.rand(4,4) 

在matplotlib中制作热图非常简单:

 from matplotlib import pyplot as plt heatmap = plt.pcolor(data) 

我甚至发现了一个看起来正确的colormap参数: heatmap = plt.pcolor(data, cmap=matplotlib.cm.Blues)

但除此之外,我不知道如何显示列和行的标签,并显示在正确的方向(原点左上angular,而不是左下angular)的数据。

尝试操作heatmap.axes (例如heatmap.axes.set_xticklabels = column_labels )都失败了。 我在这里错过了什么?

现在已经很晚了,但是这里是我的stream行数据NBA热图的python实现。

更新:2014年1月1日 :谢谢大家

 # -*- coding: utf-8 -*- # <nbformat>3.0</nbformat> # ------------------------------------------------------------------------ # Filename : heatmap.py # Date : 2013-04-19 # Updated : 2014-01-04 # Author : @LotzJoe >> Joe Lotz # Description: My attempt at reproducing the FlowingData graphic in Python # Source : http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/ # # Other Links: # http://stackoverflow.com/questions/14391959/heatmap-in-matplotlib-with-pcolor # # ------------------------------------------------------------------------ import matplotlib.pyplot as plt import pandas as pd from urllib2 import urlopen import numpy as np %pylab inline page = urlopen("http://datasets.flowingdata.com/ppg2008.csv") nba = pd.read_csv(page, index_col=0) # Normalize data columns nba_norm = (nba - nba.mean()) / (nba.max() - nba.min()) # Sort data according to Points, lowest to highest # This was just a design choice made by Yau # inplace=False (default) ->thanks SO user d1337 nba_sort = nba_norm.sort('PTS', ascending=True) nba_sort['PTS'].head(10) # Plot it out fig, ax = plt.subplots() heatmap = ax.pcolor(nba_sort, cmap=plt.cm.Blues, alpha=0.8) # Format fig = plt.gcf() fig.set_size_inches(8, 11) # turn off the frame ax.set_frame_on(False) # put the major ticks at the middle of each cell ax.set_yticks(np.arange(nba_sort.shape[0]) + 0.5, minor=False) ax.set_xticks(np.arange(nba_sort.shape[1]) + 0.5, minor=False) # want a more natural, table-like display ax.invert_yaxis() ax.xaxis.tick_top() # Set the labels # label source:https://en.wikipedia.org/wiki/Basketball_statistics labels = [ 'Games', 'Minutes', 'Points', 'Field goals made', 'Field goal attempts', 'Field goal percentage', 'Free throws made', 'Free throws attempts', 'Free throws percentage', 'Three-pointers made', 'Three-point attempt', 'Three-point percentage', 'Offensive rebounds', 'Defensive rebounds', 'Total rebounds', 'Assists', 'Steals', 'Blocks', 'Turnover', 'Personal foul'] # note I could have used nba_sort.columns but made "labels" instead ax.set_xticklabels(labels, minor=False) ax.set_yticklabels(nba_sort.index, minor=False) # rotate the plt.xticks(rotation=90) ax.grid(False) # Turn off all the ticks ax = plt.gca() for t in ax.xaxis.get_major_ticks(): t.tick1On = False t.tick2On = False for t in ax.yaxis.get_major_ticks(): t.tick1On = False t.tick2On = False 

输出如下所示: 像数据流一样的nba热图

这里有一个ipython笔记本,所有的代码。 我从“溢出”中学到了很多东西,所以希望有人会觉得这很有用。

主要问题是您首先需要设置您的x和y滴答的位置。 另外,它有助于使用更多的面向对象的接口matplotlib。 即直接与axes对象交互。

 import matplotlib.pyplot as plt import numpy as np column_labels = list('ABCD') row_labels = list('WXYZ') data = np.random.rand(4,4) fig, ax = plt.subplots() heatmap = ax.pcolor(data) # put the major ticks at the middle of each cell, notice "reverse" use of dimension ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False) ax.set_xticks(np.arange(data.shape[1])+0.5, minor=False) ax.set_xticklabels(row_labels, minor=False) ax.set_yticklabels(column_labels, minor=False) plt.show() 

希望有所帮助。

python seaborn模块基于matplotlib,并生成一个非常好的热图。

下面是一个seaborn的实现,为ipython / jupyter笔记本devise。

 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline # import the data directly into a pandas dataframe nba = pd.read_csv("http://datasets.flowingdata.com/ppg2008.csv", index_col='Name ') # remove index title nba.index.name = "" # normalize data columns nba_norm = (nba - nba.mean()) / (nba.max() - nba.min()) # relabel columns labels = ['Games', 'Minutes', 'Points', 'Field goals made', 'Field goal attempts', 'Field goal percentage', 'Free throws made', 'Free throws attempts', 'Free throws percentage','Three-pointers made', 'Three-point attempt', 'Three-point percentage', 'Offensive rebounds', 'Defensive rebounds', 'Total rebounds', 'Assists', 'Steals', 'Blocks', 'Turnover', 'Personal foul'] nba_norm.columns = labels # set appropriate font and dpi sns.set(font_scale=1.2) sns.set_style({"savefig.dpi": 100}) # plot it out ax = sns.heatmap(nba_norm, cmap=plt.cm.Blues, linewidths=.1) # set the x-axis labels on the top ax.xaxis.tick_top() # rotate the x-axis labels plt.xticks(rotation=90) # get figure (usually obtained via "fig,ax=plt.subplots()" with matplotlib) fig = ax.get_figure() # specify dimensions and save fig.set_size_inches(15, 20) fig.savefig("nba.png") 

输出如下所示: seaborn nba热图 我使用了matplotlib Blues彩色地图,但是个人发现默认的颜色相当漂亮。 我用matplotlib来旋转x轴标签,因为我找不到seaborn语法。 正如grexor所指出的,有必要通过反复试验来指定尺寸(fig.set_size_inches),这让我感到有些沮丧。

正如Paul H所指出的那样,你可以很容易地将这些值加到热图上(annot = True),但在这种情况下,我并不认为它改善了这个数字。 joelotz的优秀答案取自几个代码片段。

有人编辑这个问题来删除我使用的代码,所以我被迫添加它作为一个答案。 感谢所有参与回答这个问题的人! 我认为大多数其他答案比这个代码更好,我只是把它留在这里作为参考。

感谢Paul H和unutbu (谁回答了这个问题 ),我有一些非常漂亮的输出:

 import matplotlib.pyplot as plt import numpy as np column_labels = list('ABCD') row_labels = list('WXYZ') data = np.random.rand(4,4) fig, ax = plt.subplots() heatmap = ax.pcolor(data, cmap=plt.cm.Blues) # put the major ticks at the middle of each cell ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False) ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False) # want a more natural, table-like display ax.invert_yaxis() ax.xaxis.tick_top() ax.set_xticklabels(row_labels, minor=False) ax.set_yticklabels(column_labels, minor=False) plt.show() 

这里是输出:

Matplotlib HeatMap