Python matplotlib-大型热图
我尝试在网站上搜索解决方案,但没有找到适合我的解决方案。 我正试图绘制一张相当大的热图——x轴有21个容器,y轴有18个。我从CSV中读取数据,大多数情况下,单元格是空的——除了少数。我还试着给轴贴上标签 当我绘制热图时,它并没有显示全部内容。我不确定这是图形的格式问题,还是热图的问题。如果我省略了任何格式,绘图就可以工作——但它不会显示所有的行/列。当我试图改变轴的限制,或设置图形的大小时,它实际上破坏了绘图,并且值不能准确显示 如何使其显示所有列和行,即使值单元格为空Python matplotlib-大型热图,python,matplotlib,Python,Matplotlib,我尝试在网站上搜索解决方案,但没有找到适合我的解决方案。 我正试图绘制一张相当大的热图——x轴有21个容器,y轴有18个。我从CSV中读取数据,大多数情况下,单元格是空的——除了少数。我还试着给轴贴上标签 当我绘制热图时,它并没有显示全部内容。我不确定这是图形的格式问题,还是热图的问题。如果我省略了任何格式,绘图就可以工作——但它不会显示所有的行/列。当我试图改变轴的限制,或设置图形的大小时,它实际上破坏了绘图,并且值不能准确显示 如何使其显示所有列和行,即使值单元格为空 import matp
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读取正确。我认为问题实际上可能是轴标签的格式问题。我要么缩小字体,要么旋转文字垂直显示。有什么建议吗?你能上传一张你当前绘图的图片,让我们看看问题是什么样子的吗?谢谢-设置勾选位置让它工作了!谢谢大家。