如何在Python中绘制带颜色编码的矩阵稀疏模式?

6 投票
2 回答
6496 浏览
提问于 2025-04-18 08:24

我正在使用matplotlib.pyplot中的spy函数来绘制一个来自scipy.sparse的csc_matrix的稀疏性图案,像这样:

>>> import scipy.sparse as sprs
>>> import matplotlib.pyplot as plt
>>> Matrix=sprs.rand(10,10, density=0.1, format='csc')
>>> plt.spy(Matrix)
>>> plt.show()

我想做同样的事情,但想根据矩阵元素的大小给它们上颜色。有没有简单的方法可以让spy做到这一点?如果没有,还有其他方法可以实现吗?

2 个回答

3

我遇到过类似的问题。我的解决办法是使用带有颜色条的散点图。

简单来说,我有一个100乘100的稀疏矩阵,但我想把所有的点和这些点的值都可视化出来。

用imshow来处理稀疏矩阵并不是个好主意,因为根据我的经验,它可能不会显示所有的点!对我来说,这可是个大问题。

spy对于稀疏矩阵是可靠的,但你不能添加颜色条。

所以我尝试提取非零值,然后在散点图中绘制这些值,并根据非零元素的值添加颜色条。

下面是一个例子:

import numpy as np
import matplotlib.pyplot as plt

# example sparse matrix with different values inside
mat = np.zeros((20,20))
mat[[1,5,5,5,10,15],[1,4,5,6,10,15]] = [1,5,5,5,10,15]

fig,ax = plt.subplots(figsize=(8, 4), dpi= 80, facecolor='w', edgecolor='k')

# prepare x and y for scatter plot
plot_list = []
for rows,cols in zip(np.where(mat!=0)[0],np.where(mat!=0)[1]):
    plot_list.append([cols,rows,mat[rows,cols]])
plot_list = np.array(plot_list)

# scatter plot with color bar, with rows on y axis
plt.scatter(plot_list[:,0],plot_list[:,1],c=plot_list[:,2], s=50)
cb = plt.colorbar()

# full range for x and y axes
plt.xlim(0,mat.shape[1])
plt.ylim(0,mat.shape[0])
# invert y axis to make it similar to imshow
plt.gca().invert_yaxis()

结果图,y轴反转

6

你可以使用 imshow 这个函数:

d=Matrix.todense()
plt.imshow(d,interpolation='none',cmap='binary')
plt.colorbar()

这样做会得到:

在这里输入图片描述

撰写回答