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

Return a Patch object in PointPixelRegion.as_artist()? #487

Open
adonath opened this issue Oct 28, 2022 · 4 comments
Open

Return a Patch object in PointPixelRegion.as_artist()? #487

adonath opened this issue Oct 28, 2022 · 4 comments

Comments

@adonath
Copy link
Member

adonath commented Oct 28, 2022

Currently the objects returned by PointPixelRegion.as_artist() and e.g. CirclePixelRegion.as_artist() are different. In one case a Line2D object is returned, while in the other it is a Patch object. This will always require an extra check when looping over or plotting multiple regions the Line2D plotting arguments are different than the ones for Patch. E.g. facecolor and edgecolor will work for Patch, but the corresponding argument for Line2D are markeredgecolor and markerfacecolor instead. So one typically ends up with code like:

for region_pix in regions_pix:
    
    if isinstance(region, PointSkyRegion):
        artist = region_pix.as_artist(**kwargs_line2d)
    else:
        artist = region_pix.as_artist(**kwargs)

    ax.add_artist(artist)

I was wondering whether is is possible to unify the behavior, such that the special cases are not needed anymore. I guess what is convenient for the Line2D object is the ability to work with different marker styles (points, stars, triangles etc.), which would be good to keep. From a quick search it seems there is no MarkerPatch in matplotlib, which is unfortunate. @keflavich suggested to use a PathPatch, however this might require a lot of additional code, to achieve what Line2D already does. A compromise might be to maybe allow for an alias of the most common Patch properties, like:

ARTIST_TO_LINE_PROPERTIES = {
    "color": "markeredgecolor",
    "edgecolor": "markeredgecolor",
    "ec": "markeredgecolor",
    "facecolor": "markerfacecolor",
    "fc": "markerfacecolor",
    "linewidth": "markerwidth",
    "lw": "markerwidth",
}
@keflavich
Copy link
Contributor

Ah, my proposal was because I was thinking Line2D was for actual line segments, not point collections. There may be a more appropriate patch type than Line2D for Point regions. I don't love the idea of maintaining our own matplotlib keyword alias lists.

@adonath
Copy link
Member Author

adonath commented Oct 28, 2022

@keflavich I agree maintaining and our matplotlib keyword alias is far from ideal. I guess the object we are looking for is a MarkerPatch, which does not seem to exist. Maybe it is even worth opening a feature request to matplotlib...

@keflavich
Copy link
Contributor

Are there Collection objects that behave like patches?

@adonath
Copy link
Member Author

adonath commented Oct 28, 2022

Are there Collection objects that behave like patches?

Not exactly, but I think the behavior of e.g. a LineCollection and CircleCollection should be uniform.

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

No branches or pull requests

2 participants