From: John H. <jdh...@ac...> - 2004-11-11 15:14:56
|
>>>>> "Nils" == Nils Wagner <nw...@me...> writes: Nils> Hi all, Structure plots provide a quick visual check on the Nils> sparsity pattern of the matrix. A structure plot is a Nils> rectangular array of dots; a dot is black if the Nils> corresponding matrix element is nonzero otherwise it is Nils> white. Nils> Is it possible to generate such plots with scipy or should Nils> we switch over to matplotlib ? A quick matplotlib implementation is below. In matlab this function is called "spy" and Alexander Schmolck requested this in an earlier post. The spy implementation uses plot markers which are fixed sizes (in points). For large matrices, you'll likely want to use a smaller markersize. Perhaps better would be to use a polygon collection setup so that the marker sizes filled the boundaries of the matrix cell. This would take a little more work, and would also have a different call signature that matlab's, since matlab also uses plots markers . If you have any thoughts on how you would like the implementation to work, please share them... JDH from matplotlib.matlab import * def get_xyz_where(Z, Cond): """ Z and Cond are MxN matrices. Z are data and Cond is a boolean matrix where some condition is satisfied. Return value is x,y,z where x and y are the indices into Z and z are the values of Z at those indices. x,y,z are 1D arrays This is a lot easier in numarray - is there a more elegant way to do this that works on both numeric and numarray? """ M,N = Z.shape z = ravel(Z) ind = nonzero( ravel(Cond) ) x = arange(M); x.shape = M,1 X = repeat(x, N, 1) x = ravel(X) y = arange(N); y.shape = 1,N Y = repeat(y, M) y = ravel(Y) x = take(x, ind) y = take(y, ind) z = take(z, ind) return x,y,z def spy(Z, marker='s', markersize=10, **kwargs): """ SPY(Z, **kwrags) plots the sparsity pattern of the matrix S. kwargs give the marker properties - see help(plot) for more information on marker properties """ x,y,z = get_xyz_where(Z, Z>0) plot(x+0.5,y+0.5, linestyle='None', marker=marker,markersize=markersize, **kwargs) M,N = 25,20 data = zeros((M,N))*0. data[:,12] = rand(M) data[5,:] = rand(N) spy(data) axis([0,M,0,N]) show() |