Skip to content

PathCollection (and therefore Scatter) points are badly placed since v1.4 #7262

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

Open
pelson opened this issue Oct 12, 2016 · 9 comments
Open
Labels
keep Items to be ignored by the “Stale” Github Action

Comments

@pelson
Copy link
Member

pelson commented Oct 12, 2016

Since https://github.com/matplotlib/matplotlib/pull/2156/files#diff-506c6bd01694bddbd8999f2c6e920705R283 scatter has used renderer.draw_markers for same scale/color/style marker plots. Unfortunately, it appears that this code path snaps marker locations inconsistently with how they were placed before.

First off, some code:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

x = np.linspace(0, 10, 200).astype(np.float32)
y = np.sin(x)

offsets = np.dstack((x, y))

ax = plt.axes()

# Create a PathCollection to mirror the scatter behaviour.
def my_scatter(x, y):
    from matplotlib.collections import PathCollection
    from matplotlib.path import Path
    import matplotlib.transforms as mtransforms

    phi = np.linspace(0, 2 * np.pi, 100)
    # Scale, in pixel coordinates
    rad = 2
    x_circle = np.cos(phi) * rad
    y_circle = np.sin(phi) * rad

    verts = np.vstack([x_circle, y_circle]).T
    path = Path(verts, closed=False)
    collection = PathCollection([path], facecolor='blue', edgecolor='black',
                                offsets=offsets,
                                transOffset=ax.transData,
                                )
    collection.set_transform(mtransforms.IdentityTransform())
    ax.add_collection(collection, autolim=True)

    ax.autoscale()


my_scatter(x, y)
ax.plot(x, y)
ax.grid(True)

plt.savefig('scatter.{}.png'.format(matplotlib.__version__))

plt.show()

In mpl 1.3:

scatter 1 3 1

In mpl 1.5
scatter 1 5 2

If you open both of these images in new tabs and flick between them, you will see the jitter that the above comment has introduced.

I'm reporting this as an investigation on behalf of @bjlittle. I'm not certain I'm going to get a huge amount of time to address this problem, but maybe some hints from @mdboom might enable @bjlittle to take a look at fixing the problem.

@anntzer
Copy link
Contributor

anntzer commented Oct 12, 2016

I have some issues installing 1.3 right now to check but I wonder whether this is the same issue as #7233. Can you give it a try and consolidate the two issues if this is the case?

@Kojoley
Copy link
Member

Kojoley commented Oct 12, 2016

I wonder whether this is the same issue as #7233

I think it is.

1.4.0
issue_7262-1.4.0.png

1.3.1
issue_7262-1.3.1.png

@Kojoley
Copy link
Member

Kojoley commented Oct 12, 2016

I have some issues installing 1.3

I have to downgrade numpy to 1.6.0 to install matplotlib 1.3

@tacaswell tacaswell added this to the 2.0 (style change major release) milestone Oct 29, 2016
@tacaswell
Copy link
Member

Disabling the fast-path does fix this

diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py
index 5997192..63aa9ec 100644
--- a/lib/matplotlib/collections.py
+++ b/lib/matplotlib/collections.py
@@ -328,7 +328,7 @@ class Collection(artist.Artist, cm.ScalarMappable):
                 extents.height < height):
                 do_single_path_optimization = True

-        if do_single_path_optimization:
+        if False and do_single_path_optimization:
             gc.set_foreground(tuple(edgecolors[0]))
             gc.set_linewidth(self._linewidths[0])
             gc.set_dashes(*self._linestyles[0])

scatter 2 0 0b4 post252 dev0 g92da7f6

One other thing to notice is that in 1.4+ the (0, 0) marker is right on the intersection of the two grid lines, where as for 1.3.1 the marker is off by a bit.

I am pretty sure that the underlying problem is in draw_markers and related to snapping.

@tacaswell
Copy link
Member

attn @mdboom

@NelleV NelleV modified the milestones: 2.1 (next point release), 2.0 (style change major release) Nov 10, 2016
@mdboom
Copy link
Member

mdboom commented Dec 5, 2016

I'd suggest making the fast path optimization an rcParam -- and @tacaswell's code snippet above highlights exactly where to use it. There are good reasons to have it -- particularly for large point clouds in astronomy which is where it first came from. But clearly there are also good reasons not to have it.

@anntzer
Copy link
Contributor

anntzer commented Feb 24, 2017

Turning off the fast path optimization does not solve #7624, so there may be multiple issues at hand here...

@brunodigiorgi
Copy link

brunodigiorgi commented Mar 12, 2017

I noticed that plotting the markers one at a time solves this problem in my case:

def draw_markers(points, marker, markersize, mew, mec, mfc, snap, ax):
    for p in points:
        ax.plot(p[0], p[1], marker=marker, markersize=markersize, mew=mew, mec=mec, mfc=mfc, snap=snap)

@tacaswell tacaswell modified the milestones: 2.1 (next point release), 2.2 (next next feature release) Sep 24, 2017
@github-actions
Copy link

This issue has been marked "inactive" because it has been 365 days since the last comment. If this issue is still present in recent Matplotlib releases, or the feature request is still wanted, please leave a comment and this label will be removed. If there are no updates in another 30 days, this issue will be automatically closed, but you are free to re-open or create a new issue if needed. We value issue reports, and this procedure is meant to help us resurface and prioritize issues that have not been addressed yet, not make them disappear. Thanks for your help!

@github-actions github-actions bot added the status: inactive Marked by the “Stale” Github Action label Mar 31, 2023
@anntzer anntzer added the keep Items to be ignored by the “Stale” Github Action label Mar 31, 2023
@rcomer rcomer removed the status: inactive Marked by the “Stale” Github Action label Mar 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
keep Items to be ignored by the “Stale” Github Action
Projects
None yet
Development

No branches or pull requests

8 participants