Custom error message for draw_path. issues : #8131 (bad error message from pyplot.plot) #8176

Merged
merged 5 commits into from Apr 30, 2017

Conversation

Projects
None yet
5 participants
Contributor

herilalaina commented Mar 1, 2017

Addressing the issue #8131, this PR adds reference to the agg.path.chunksize params in the overflow error message.

Contributor

NelleV commented Mar 8, 2017

Hi @herilalaina
Sorry it took so long for us to review the pull request and thanks for the patch!

I'd rather have the try except surround only the part of the code that can raise an overflow error for readabiblity. It means having two try except, but I think we can live with that.
Do you mind making this small change?

Contributor

herilalaina commented Mar 8, 2017

Hi @NelleV, no problem. I will make this change as soon as I can :)

tacaswell added this to the 2.1 (next point release) milestone Mar 8, 2017

@QuLogic

Typo needs to be fixed; tests are broken.

lib/matplotlib/backends/backend_agg.py
+ try:
+ self._renderer.draw_path(gc, p, transform, rgbFace)
+ except OverflowError as e:
+ e.args = ("Exceeded cell block limit (set 'agg.path.chunksize' rcparam)",)
@QuLogic

QuLogic Mar 9, 2017

Member

I'm not sure about this; should we raise a new exception?

@herilalaina

herilalaina Mar 9, 2017

Contributor

I am not sure I understand your point. In fact, the same overflow error occurs if we set agg.path.chunksize with a big number. Here, I just change the overflow error message

@QuLogic

QuLogic Mar 12, 2017

Member

I mean, is changing e.args a good thing to do, vs raising a new exception entirely.

@herilalaina

herilalaina Mar 13, 2017

Contributor

in fact, if we raise new overflow error. We get something like this

Exception in Tkinter callback
Traceback (most recent call last):
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/backends/backend_agg.py", line 171, in draw_path
self._renderer.draw_path(gc, path, transform, rgbFace)
OverflowError: In draw_path: Exceeded cell block limit

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib_env/lib/python3.5/tkinter/init.py", line 1562, in call
return self.func(*args)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/backends/backend_tkagg.py", line 284, in resize
self.show()
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/backends/backend_tkagg.py", line 355, in draw
FigureCanvasAgg.draw(self)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/backends/backend_agg.py", line 475, in draw
self.figure.draw(self.renderer)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/artist.py", line 68, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/figure.py", line 1240, in draw
renderer, self, artists, self.suppressComposite)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/image.py", line 139, in _draw_list_compositing_images
a.draw(renderer)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/artist.py", line 68, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/axes/_base.py", line 2386, in draw
mimage._draw_list_compositing_images(renderer, self, artists)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/image.py", line 139, in _draw_list_compositing_images
a.draw(renderer)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/artist.py", line 68, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/lines.py", line 800, in draw
line_func(renderer, gc, tpath, affine.frozen())
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/lines.py", line 1248, in _draw_solid
renderer.draw_path(gc, path, trans)
File "/home/herilalaina/Documents/contribution/matplotlib_contrib/matplotlib/lib/matplotlib/backends/backend_agg.py", line 173, in draw_path
raise OverflowError("Exceeded cell block limit (set 'agg.path.chunksize' rcparam)")
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)

I will make the change if It's okay.

@QuLogic

QuLogic Mar 25, 2017

Member

Obviously, it does appear to work, but I don't have an answer whether it is a good or idiomatic thing to be doing or not.

Opinions, @tacaswell?

@herilalaina

herilalaina Mar 27, 2017

Contributor

Hi @QuLogic , checks failed on coverage. I'm new to code coverage. Do I need to implement test (for overflow error) to fix that ?

lib/matplotlib/backends/backend_agg.py
else:
- self._renderer.draw_path(gc, path, transform, rgbFace)
+ try:
+ self._renderer.draw_path(gc, p, transform, rgbFace)
@QuLogic

QuLogic Mar 9, 2017

Member

Should be path, not p.

@herilalaina

herilalaina Mar 9, 2017

Contributor

Sorry about that. thank you

lib/matplotlib/backends/backend_agg.py
npts = path.vertices.shape[0]
+
if (nmax > 100 and npts > nmax and path.should_simplify and
@phobson

phobson Mar 29, 2017

Member

This half of the if/else block is untested. Think you could add a test?

@herilalaina

herilalaina Mar 30, 2017

Contributor

hi @phobson , thank you. I will do it

Owner

tacaswell commented Apr 4, 2017

👍 on this. To test the missed branch I assume you need to user a very long line with a chunk size that is too big?

herilalaina added some commits Apr 4, 2017

@herilalaina herilalaina Add chunksize test for backend agg
3f796d9
@herilalaina herilalaina Delete test on overflowError
75be34d
lib/matplotlib/tests/test_agg.py
+ rcParams['agg.path.chunksize'] = 8000000
+ with pytest.raises(OverflowError):
+ ax.plot(x, np.sin(x))
+ plt.show()
@herilalaina

herilalaina Apr 5, 2017

Contributor

Hi @tacaswell , it doesn't raise OverflowError. Do you have any idea how to handle it?

@tacaswell

tacaswell Apr 6, 2017

Owner

Is that chunk size big enough to cause a overflow?

@herilalaina

herilalaina Apr 10, 2017

Contributor

It never raises overflow even if I increase chunk size. The test just crashed

lib/matplotlib/tests/test_agg.py
+def test_chunksize():
+ x = range(9000000)
+ fig = plt.figure()
+ ax = fig.add_subplot(1, 1, 1)
@QuLogic

QuLogic Apr 12, 2017

Member

fig, ax = plt.subplots()

lib/matplotlib/tests/test_agg.py
+ ax = fig.add_subplot(1, 1, 1)
+
+ # Test with small chunksize
+ tmp = rcParams['agg.path.chunksize']
@QuLogic

QuLogic Apr 12, 2017

Member

You don't need to worry about this; the cleanup on the test will reset all rcParams.

Member

QuLogic commented Apr 12, 2017

I think the test is not doing anything because of the plt.show; replacing it with fig.canvas.draw() at least triggers something, though it still doesn't seem to cause an exception...

Member

QuLogic commented Apr 12, 2017 • edited

Actually, if all you want to do is test that side of the branch, you only need a path longer than the chunksize (which must be greater than 100), so set the chunksize to 105 and make a path that's 110 long. 9000000 is much too long, I think.

If you want to trigger the exception, that might be a little more difficult and I'm not sure how to do that.

Member

QuLogic commented Apr 13, 2017 • edited

After some testing, it looks like you need roughly range(200000) to trigger the exception with chunksize<=100. That means that you'd need approximately range(20000000) to trigger an exception with chunksize>100. I think this is basically impossible so I don't think we should try to trigger the exception in the latter case.

Contributor

herilalaina commented Apr 13, 2017

Thank you for your great feedback ! I will fix them.

herilalaina added some commits Apr 14, 2017

@herilalaina herilalaina Fix test_chunksize on test_agg
f00156f
@herilalaina herilalaina Change chunksize
665c640

@phobson phobson merged commit 1ef4d39 into matplotlib:master Apr 30, 2017

2 checks passed

continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details

herilalaina deleted the herilalaina:error-msg-plot branch Jun 8, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment