On Sep 26, 2008, at 5:01 PM, Eric Firing wrote: > Also, if an image cannot be resolved by the output device, info is > lost--one might not see anything at a location where there actually > is a value--whereas with markers, a marker will always show up, and > the only problem is that one can't necessarily distinguish a single > point from a cluster. > > The real problem with all-zero values is that plot can't handle > "plot([],[])". One can work around this by putting in bogus values > to plot a single point, saving the line, and then setting the line > data to empty; or, better, by not using the high-level plot command, > but by generating the Line2D object and adding it to the axes. The > Line2D initializer is happy with empty x and y sequences. I think if > you use this approach it will kill two bugs (failure on all-zeros > with sparse and full arrays) with one very simple stone. > > Eric
Thanks for the tip Eric. Below is a patch for spy that implements Eric's suggestion. This patch seems to work for a couple simple tests on my end: sparse and dense arrays with non-zero and all-zero values. A couple of notes: * the call to `add_artist` isn't needed to show the correct plot, but it may be helpful for debugging. * the docstring for `spy` suggests that a Line2D instance is returned, but `spy` currently returns a list with a Line2D instance. I set all- zero arrays to return a list also, for consistency. -Tony Index: matplotlib/lib/matplotlib/axes.py =================================================================== --- matplotlib/lib/matplotlib/axes.py (revision 6123) +++ matplotlib/lib/matplotlib/axes.py (working copy) @@ -6723,9 +6723,9 @@ else: if hasattr(Z, 'tocoo'): c = Z.tocoo() - y = c.row - x = c.col - z = c.data + nonzero = c.data != 0. + y = c.row[nonzero] + x = c.col[nonzero] else: Z = np.asarray(Z) if precision is None: mask = Z!=0. @@ -6733,8 +6733,12 @@ y,x,z = mlab.get_xyz_where(mask, mask) if marker is None: marker = 's' if markersize is None: markersize = 10 - lines = self.plot(x, y, linestyle='None', - marker=marker, markersize=markersize, **kwargs) + if len(x) == 0: + lines = [mlines.Line2D([], [])] + self.add_artist(lines[0]) + else: + lines = self.plot(x, y, linestyle='None', + marker=marker, markersize=markersize, **kwargs) nr, nc = Z.shape self.set_xlim(xmin=-0.5, xmax=nc-0.5) self.set_ylim(ymin=nr-0.5, ymax=-0.5) Index: matplotlib/examples/pylab_examples/masked_demo.py =================================================================== --- matplotlib/examples/pylab_examples/masked_demo.py (revision 6123) +++ matplotlib/examples/pylab_examples/masked_demo.py (working copy) @@ -1,4 +1,4 @@ -#!/bin/env python +#!/usr/bin/env python ''' Plot lines with points masked out. Index: matplotlib/examples/misc/rec_groupby_demo.py =================================================================== --- matplotlib/examples/misc/rec_groupby_demo.py (revision 6123) +++ matplotlib/examples/misc/rec_groupby_demo.py (working copy) @@ -2,7 +2,7 @@ import matplotlib.mlab as mlab -r = mlab.csv2rec('data/aapl.csv') +r = mlab.csv2rec('../data/aapl.csv') r.sort() def daily_return(prices): ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel