Python matplotlib-大型热图

Python matplotlib-大型热图,python,matplotlib,Python,Matplotlib,我尝试在网站上搜索解决方案,但没有找到适合我的解决方案。 我正试图绘制一张相当大的热图——x轴有21个容器,y轴有18个。我从CSV中读取数据,大多数情况下,单元格是空的——除了少数。我还试着给轴贴上标签 当我绘制热图时,它并没有显示全部内容。我不确定这是图形的格式问题,还是热图的问题。如果我省略了任何格式,绘图就可以工作——但它不会显示所有的行/列。当我试图改变轴的限制,或设置图形的大小时,它实际上破坏了绘图,并且值不能准确显示 如何使其显示所有列和行,即使值单元格为空 import matp

我尝试在网站上搜索解决方案,但没有找到适合我的解决方案。 我正试图绘制一张相当大的热图——x轴有21个容器,y轴有18个。我从CSV中读取数据,大多数情况下,单元格是空的——除了少数。我还试着给轴贴上标签

当我绘制热图时,它并没有显示全部内容。我不确定这是图形的格式问题,还是热图的问题。如果我省略了任何格式,绘图就可以工作——但它不会显示所有的行/列。当我试图改变轴的限制,或设置图形的大小时,它实际上破坏了绘图,并且值不能准确显示

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

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
文件的屏幕截图:

这就是我得到的情节

这是数据帧打印的屏幕截图
我认为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/Ytick位置为:

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
xtick
更奇怪(不知道为什么他们会像他那样做,可能是因为正确设置了纵横比),无论如何,你有这样的东西:

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

发生的事情是,您正在为记号设置标签,但没有更改其位置

如果您希望在每个单元格上都有记号标签,则需要指定您也希望在那里有记号

例如,您可以执行以下操作:

ax.set(xticks=np.arange(len(xlabels)), xticklabels=xlabels,
       yticks=np.arange(len(ylabels)), yticklabels=ylabels)
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()
您可能还希望将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()

使用
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()

@JoeKington的答案是正确的-在设置记号标签之前,您需要设置记号位置

另一种方法是使用模块,并使用a,设置为
1
的倍数,即每个单元格打一个勾

对于您的示例,它看起来像:

ax.set(xticks=np.arange(len(xlabels)), xticklabels=xlabels,
       yticks=np.arange(len(ylabels)), yticklabels=ylabels)
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()

您是否已检查所有数据是否正确地传输到变量
度量值
?。也许您可以通过删除
.csv
导入并生成虚拟数据以在python itselve中进行测试来简化示例。这是一个可能有用的例子。首先检查数据是否正确加载,然后确保正确打印。我进行了简单打印(度量),结果显示整个csv读取正确。我认为问题实际上可能是轴标签的格式问题。我要么缩小字体,要么旋转文字垂直显示。有什么建议吗?你能上传一张你当前绘图的图片,让我们看看问题是什么样子的吗?谢谢-设置勾选位置让它工作了!谢谢大家。