Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for empty collection check in axes.add_collection #1497

Merged
merged 4 commits into from Feb 17, 2013
Merged

Fix for empty collection check in axes.add_collection #1497

merged 4 commits into from Feb 17, 2013

Conversation

akhmerov
Copy link
Contributor

Fixes #1490

@ivanov
Copy link
Member

ivanov commented Nov 14, 2012

looks good, @akhmerov, thanks for the fix. Could you add a test for this, so we don't run into it again - something like the original report in #1490?

@akhmerov
Copy link
Contributor Author

Done. As I mentioned, this is not a full fix of #1490, and another issue has to be opened to ensure that datalimits of empty collections are calculated properly.

if autolim:
if collection._paths and len(collection._paths):
self.update_datalim(collection.get_datalim(self.transData))
if autolim and collection._paths and len(collection._offsets):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tiny nitpick on something you haven't written: we should not test for an emtpy list using len(list) but just list.
An empty list evaluates as false in python.

Maybe you can replace:

if autolim and collection._paths and len(collection._offsets):

by

if autolim and collection._paths and collection._offsets:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I wrote in a comment earlier, collection._offsets is a numpy array, not a list. This means that bool(np.array([0])) == False, and bool(np.array([0, 0])) raises an error.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My mistake.

I'd then use the shape method instead of the length attribute, but that's too much nitpicking :)

Thanks for clarifying.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Behavior of len is well-defined and documented for numpy arrays, so I still believe it's the better way due to improved readability.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with @akhmerov on this point. I personally don't like the idiom of the empty list evaluating to false partly because of this reason. I work with numpy arrays so much. My second reason is that an iterator to an empty list evaluates to True, and so could cause a lot of confusion when coding in py3k with iterators being so prevelent there.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The more and more I look at this PR, the more I can't bring myself to accept it. I would rather fix the underlying problem.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR doesn't introduce yet another special condition, it rather corrects the condition which already existed before (I even suspect the original condition was a typo, since the second clause was pointless). In this sense it doesn't hurt anything. Even if path.get_path_collection_extents would be working properly, this condition could be reasonable to keep.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem that can now occur is if collection._offsets is None. Previously, the check on collection._paths would be sufficient to prevent an exception from being thrown when doing a len() on None. Now that protection is gone.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line 1440 of collections.py in my fork of matplotlib uses the same assumption:

if len(self._offsets):
    xs = self.convert_xunits(self._offsets[:0])

Additionally, searching for all occurences of _offsets, I cannot confirm that they can ever assume a None value, instead _offsets are always an array.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WeatherGod / @akhmerov - I've submitted a PR which moves this line to the Collection class in v1.3.1: #2444

@dmcdougall
Copy link
Member

What's the status on this? Is it good to go? The tests pass but I'm aware @WeatherGod has some concerns. How do others feel?

@efiring
Copy link
Member

efiring commented Dec 3, 2012

I don't see any reason not to merge it.

@WeatherGod
Copy link
Member

I would be willing to back off if we make a new issue to investigate the root reason for the bug that this is papering over. We just need to figure out a way to still be able to test for that bug even with this fix.

@akhmerov
Copy link
Contributor Author

akhmerov commented Dec 3, 2012

This is also my suggestion (I didn't fix the underlying issue due to lacking time/cpp skill). Testing the underlying issue would be easy: one just needs to check output on path.get_path_collection_extents when supplied an empty collection, as I described in #1490.

@dmcdougall
Copy link
Member

Ok sounds like, as @WeatherGod said, if we open a separate issue for the underlying problem we are pretty happy to merge this PR.

@WeatherGod Would you mind opening a new issue?

@WeatherGod
Copy link
Member

Would it make sense to add a KnownFailure test to this PR and open a ticket
against that test?

@dmcdougall
Copy link
Member

I think that's a fine idea.

@akhmerov
Copy link
Contributor Author

A known failure test would require knowing what is the correct return value for path.get_path_collection_extents if the collection is empty. I don't think this is set anywhere as of now.

@akhmerov
Copy link
Contributor Author

akhmerov commented Feb 3, 2013

Since creating a KnownFailure test would require deciding first, what should happen if the test was not to fail, and since no such action was taken, I have created #1735 to not lose track of the bug in _path.get_path_collection_extents. I think this PR can be now merged and #1490 closed.

@@ -54,6 +54,18 @@ def test_formatter_ticker():
ax.set_xlabel( "x-label 005" )
ax.autoscale_view()

def test_add_collection():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to have the @cleanup decorator to the figures get cleared after the test.

@@ -54,6 +54,19 @@ def test_formatter_ticker():
ax.set_xlabel( "x-label 005" )
ax.autoscale_view()

@cleanup
def test_add_collection():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this test needs a comment re what the purpose of the test is.

efiring added a commit that referenced this pull request Feb 17, 2013
Fix for empty collection check in axes.add_collection
@efiring efiring merged commit 99d1a2f into matplotlib:master Feb 17, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

empty scatter messes up the limits
8 participants