Skip to content

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

@adonath

Description

@adonath

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",
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions