From: Todd M. <jm...@st...> - 2004-04-05 21:48:41
|
Hi, JC Hsu reported that loglog() was broken with numarray and was raising an exception due to an "illegal" call to __nonzero__(). >>> from matplotlib.matlab import * >>> loglog(arange(2,800)) [<matplotlib.lines.Line2D instance at 0x41e0ae8c>] >>> show() Traceback (most recent call last): File "<stdin>", line 1, in ? File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 57, in show manager.show() File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 163, in show self.canvas.show() File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 115, in show FigureCanvasAgg.draw(self) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_agg.py", line 353, in draw self.figure.draw(self.renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/figure.py", line 89, in _draw for a in self.axes: a.draw(renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/axes.py", line 531, in _draw self.xaxis.draw(renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/axis.py", line 378, in _draw locs = self.get_ticklocs() File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/axis.py", line 596, in get_ticklocs ind = nonzero(ticklocs>=10.0**vmin * ticklocs<=10.0**vmax) File "/home/jmiller/work/lib/python2.3/site-packages/numarray/generic.py", line 474, in __nonzero__ raise RuntimeError("An array doesn't make sense as a truth value. Use sometrue(a) or alltrue(a).") RuntimeError: An array doesn't make sense as a truth value. Use sometrue(a) or alltrue(a). Confusingly, the explicit call to nonzero() is not what is causing the numarray problem. The problem is an implicit call to NumArray.__nonzero__() resulting from the range expression. I found I could "fix" the numarray exception by adding parens to the range expression: nonzero((ticklocs >= 10.0**ymin) * (ticklocs <= 10.0**ymax)) Evaluating using the attached script, I got the impression that while numarray was raising an exception, Numeric was giving an unintended / wrong answer. Anyway, I wanted to get a second opinion before committing anything since it smacks of hacking matplotlib to work around numarray limitations. Lastly, assuming the parens are correct, there is still a problem with the log functions which I haven't looked at yet: >>> loglog(arange(2,800)) [<matplotlib.lines.Line2D instance at 0x41e0ae8c>] >>> show() opened /home/jmiller/work/share/matplotlib/Vera.ttf log iterable warning, non-positive data ignored Traceback (most recent call last): File "<stdin>", line 1, in ? File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 57, in show manager.show() File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 163, in show self.canvas.show() File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py", line 115, in show FigureCanvasAgg.draw(self) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/backends/backend_agg.py", line 353, in draw self.figure.draw(self.renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/figure.py", line 89, in _draw for a in self.axes: a.draw(renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/axes.py", line 541, in _draw line.draw(renderer) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/artist.py", line 88, in draw self._draw(renderer, *args, **kwargs) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/lines.py", line 184, in _draw self._lineFunc(renderer, gc, xt, yt) File "/home/jmiller/work/lib/python2.3/site-packages/matplotlib/lines.py", line 308, in _draw_solid renderer.draw_lines(gc, xt,yt) ValueError: x and y must be equal length sequences Regards, Todd |