2016-01-19 26 views
2

我试过在网站上搜索解决方案,但还没有找到一个为我工作的。 我试图绘制一个非常大的热图 - x轴有21个容器,y轴有18个。我从CSV读取数据,大部分情况下,这些单元格都是空的 - 除了少数。我也试图标签的轴。matplotlib - 大型热图

当我绘制热图,它不显示整个事情。我不确定它是否是图形格式或热图的问题。如果我保留任何格式,情节将起作用 - 但它不会显示所有行/列。当我尝试更改轴限制或设置图形的大小时,它实际上会破坏绘图并且数值无法准确显示。

如何使它显示所有列和行,即使值单元格为空?

import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 

x_labels = ['A','B','C','D','E','F' 
    'G','H','I','J','K','L', 
    'M','N','O','P','Q','R', 
    'S','T','U'] 
y_labels =['A','B','C','D','E','F','G','H','I','J', 
    'K','L','M','N','O','P','Q','R'] 

#reading in a CSV, data in the file is mostly empty - only 3 of the cells have values in them. I included a link to what the .csv looks like 
metrics = pd.read_csv("filename.csv", index_col=0) 

fig, ir = plt.subplots() 
heatmap = ir.pcolor(metrics, cmap=plt.cm.Spectral) 

#trying to set the axis labels. Should this reference the column and row labels in the csv instead of the variable I created? 
ir.set_xticklabels(x_labels, minor=False) 
ir.set_yticklabels(y_labels, minor=False) 

ir.invert_yaxis() 

plt.show() 

这里是什么样的csv文件看起来像截图: csv file

这是我得到的 current_heatmap

情节这是数据帧的打印截图 datafame_output

+3

你检查,如果所有的数据被转移到变量'metrics'正确?也许你通过删除'.csv'导入并生成虚拟数据来测试python itselve来减少你的例子。 – BerndGit

+0

[这里](http://stackoverflow.com/questions/2709050/draw-csv-file-data-as-a-heatmap-using-numpy-and-matplotlib)是一个可能有用的例子。首先检查数据是否正确加载,然后确保绘图正确。 –

+0

我做了一个简单的打印(度量),输出显示整个csv被正确读入。 –

回答

2

发生了什么事情是,您正在设置蜱的标签,但不改变它们的位置。

如果您希望每个单元格都有标签,他们需要指定您希望在那里标记。

例如,你可以这样做:

ax.set(xticks=np.arange(len(xlabels)), xticklabels=xlabels, 
     yticks=np.arange(len(ylabels)), yticklabels=ylabels) 

您也可能会希望限制你的x/y范围的数据的限制。

此外,您可能使用imshow(data, interpolation='nearest')matshow(data)而不是pcolor。首先,它们要快得多。其次,默认范围将中心每个单元格覆盖整数值,而不是将单元格的边缘设置为整数值。另外,matshow/imshow将限制轴的范围到数据的范围。

例如,使用pcolor我们会得到:

import numpy as np 
import matplotlib.pyplot as plt 

labels = 'ABCDEFGHIKJLMNOPQRSTUV' 
data = np.random.random((len(labels), len(labels))) 

fig, ax = plt.subplots() 
ax.pcolor(data) 
ax.axis('tight') 
ax.set(xticks=np.arange(len(labels)), xticklabels=labels, 
     yticks=np.arange(len(labels)), yticklabels=labels) 
plt.show() 

enter image description here

虽然与matshow,我们可以这样做:

import numpy as np 
import matplotlib.pyplot as plt 

labels = 'ABCDEFGHIKJLMNOPQRSTUV' 
data = np.random.random((len(labels), len(labels))) 

fig, ax = plt.subplots() 
ax.matshow(data) 
ax.set(xticks=np.arange(len(labels)), xticklabels=labels, 
     yticks=np.arange(len(labels)), yticklabels=labels) 
plt.show() 

enter image description here

1

我认为matshow比pcolor更受欢迎。但你的问题是蜱位置,所以你需要改变他们太多,不仅标签:

ir.matshow(metrics, cmap=plt.cm.Spectral) 

ir.set_xticks(range(len(x_labels))) 
ir.set_xticklabels(x_labels) 
ir.set_yticks(range(len(y_labels))) 
ir.set_yticklabels(y_labels) 

在你的情况下,自动产生的X/yticks位置是:

array([ 0., 5., 10., 15., 20., 25.]) 

您通过的标签将转到这6个第一个标签的位置,因为您只有6个定义的标签位置。这就是你在X轴上看到的A,B,C,D,E和F.所以,你可以快速解决与:的

ir.set_xticklabels(x_labels[::5]) 

代替

ir.set_xticklabels(x_labels) 

,你会得到AFJPU如在正确的位置标签。但是如果您想要所有标签,则需要创建滴答位置

仍然存在使用matshow时自动设置的x/ylim的问题。 matshow的另一个优点是,它将标签置于列或行中(如Joe Kington的答案所示)。但是在这种情况下,您也需要定义滴答位置,因为使用matshow时,xticks甚至更​​加怪异(不知道他们为什么像他这样做,也许它属于正确设置纵横比),无论如何,像这样:

xticks: [-5.0, 0.0, 5.0, 10.0, 15.0, 20.0, 25.0] 
labels: [u'', u'0', u'5', u'10', u'15', u'20', u''] 

所以在这里,如果你不重新定义xticks,你就会有情节(在位置-5)以外的第一个标签。

HTH

0

@ JoeKington的答案是CORRE ct - 您需要在设置刻度标签之前设置刻度位置。

另一种方法是使用matplotlib.ticker模块,并使用MultipleLocator,设置为1的倍数 - 即每个单元格一个记号。

对于你的榜样,它看起来是这样的:

import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 
import matplotlib.ticker as ticker 

x_labels = ['A','B','C','D','E','F' 
    'G','H','I','J','K','L', 
    'M','N','O','P','Q','R', 
    'S','T','U'] 
y_labels =['A','B','C','D','E','F','G','H','I','J', 
    'K','L','M','N','O','P','Q','R'] 

#reading in a CSV, data in the file is mostly empty - only 3 of the cells have values in them. I included a link to what the .csv looks like 
metrics = pd.read_csv("filename.csv", index_col=0) 

fig, ir = plt.subplots() 
heatmap = ir.pcolor(metrics, cmap=plt.cm.Spectral) 

ir.xaxis.set_major_locator(ticker.MultipleLocator(1)) 
ir.yaxis.set_major_locator(ticker.MultipleLocator(1)) 

ir.set_xticklabels(x_labels, minor=False) 
ir.set_yticklabels(y_labels, minor=False) 

ir.invert_yaxis() 

plt.show() 
+0

谢谢 - 设置tick地点得到它的工作!谢谢大家。 –