Reputation: 945
Given a sparse binary matrix A (csr, coo, whatever) I want to make a plot such that I can see the position (i,j) = white in the figure if A(i,j) = 1, and (i,j) = black if A(i,j) = 0;
For a dense numpy array, matshow will do the job. However, the dimension of my sparse matrix (say 100000 x 1000000) is to big to be converted to a dense array. I wonder how could I plot the pattern in my sparse matrix.
Thanks
Upvotes: 10
Views: 22847
Reputation: 17339
See matspy.
pip install matspy
Large matrices are no problem, a spy plot of tens of millions of nonzeros takes less than half a second. A small example:
from matspy import spy
import scipy
n = 9000
A = scipy.sparse.random(n, n, density=0.001) + scipy.sparse.eye(n)
spy(A)
If you want to modify the plot further, use fig, ax = matspy.spy_to_mpl(A)
instead.
Bigger example:
spy() took 0.42s to plot on my laptop:
mat = scipy.sparse.eye(10_000_000).tocsr()
spy(mat)
Upvotes: 1
Reputation: 58915
You can get a nice result using a coo_matrix
, plot()
and some adjustments:
import matplotlib.pyplot as plt
from scipy.sparse import coo_matrix
def plot_coo_matrix(m):
if not isinstance(m, coo_matrix):
m = coo_matrix(m)
fig = plt.figure()
ax = fig.add_subplot(111, facecolor='black')
ax.plot(m.col, m.row, 's', color='white', ms=1)
ax.set_xlim(0, m.shape[1])
ax.set_ylim(0, m.shape[0])
ax.set_aspect('equal')
for spine in ax.spines.values():
spine.set_visible(False)
ax.invert_yaxis()
ax.set_aspect('equal')
ax.set_xticks([])
ax.set_yticks([])
return ax
Note that the y
axis is inverted to put the first row at the top of the figure. One example:
import numpy as np
from scipy.sparse import coo_matrix
shape = (100000, 100000)
rows = np.int_(np.round_(shape[0]*np.random.random(1000)))
cols = np.int_(np.round_(shape[1]*np.random.random(1000)))
vals = np.ones_like(rows)
m = coo_matrix((vals, (rows, cols)), shape=shape)
ax = plot_coo_matrix(m)
ax.figure.show()
Upvotes: 20
Reputation: 1186
There is a function (spy
) in Matplotlib for that:
scipy equivalent for MATLAB spy
http://matplotlib.org/examples/pylab_examples/spy_demos.html
Upvotes: 12