【发布时间】:2016-12-11 22:42:21
【问题描述】:
我有一个大小为 500 X 28000 的矩阵,其中包含很多零。但是让我们考虑一个使用矩阵 A 的工作示例:
A = [[0, 0, 0, 1, 0],
[1, 0, 0, 2, 3],
[5, 3, 0, 0, 0],
[5, 0, 1, 0, 3],
[6, 0, 0, 9, 0]]
我想绘制上述矩阵的热图,但由于它包含很多零,所以热图几乎包含空白区域,如下图所示。
如何忽略矩阵中的零点并绘制热图?
这是我尝试过的最小工作示例:
im = plt.matshow(A, cmap=pl.cm.hot, norm=LogNorm(vmin=0.01, vmax=64), aspect='auto') # pl is pylab imported a pl
plt.colorbar(im)
plt.show()
产生:
如您所见,这是因为出现了空白。
但是我的原始矩阵大小为 500X280000 包含很多零,这使我的颜色图几乎是白色的!!
【问题讨论】:
-
我不相信仅仅因为可视化不清晰就删除数据是正确的做法。您是否考虑过对数据进行分组,或寻找不同类型的图?如果您能告诉我们更多关于您正在使用的数据的性质,这可能会有所帮助。
-
我想不出除了颜色图之外的任何其他东西来直观地表示我的数据。如果有任何其他的表示方式,请告诉我。
-
您可以在绘制热图之前尝试使用层次聚类。
-
“忽略”到底是什么意思?您是说非零元素如此稀有且不可见,因为一个元素甚至不占用 500x280000 数据集的单个像素?如果是这样,如何在非零元素的位置绘制一个固定大小的标记,让读者明白不在标记中心的其他元素的值都是零?
-
我的意思是,我们将您的矩阵
A视为包含 140,000,000(=500*280000) 个元素的数据集。每个元素都有行索引、列索引和值的属性。换句话说,我们从概念上考虑(我不是说我们在 python 代码中这样做),ds = {A[0,0], A[0,1], .., A[0,279999], A[1,0], A[1,1], .., A[1,279999], ..., A[499, 279999]}的数据。ds的第 k 个元素对应于A[i,j]和一些i和j。那么ds[k]的“行索引”为i,ds[k]的“列索引”为j,ds[k]的值为A[i,j]。0<=row_index[k]<500,但0<=k<140,000,000。
标签: python python-2.7 matplotlib heatmap colormap