8000 [MNT]: Refactor autoscaling in 3D · Issue #28444 · matplotlib/matplotlib · GitHub
[go: up one dir, main page]

Skip to content
[MNT]: Refactor autoscaling in 3D #28444
Open
@timhoffm

Description

@timhoffm

Summary

From #28403 (review):

Current logic

Extract all data coordinates xyz from the artist and feed them into auto_scale_xyz().

This updates the xy_dataLim, zz_dataLim BBoxes via .Bbox.update_from_data_xy/x/y(), which in turn creates a Path and calls .Bbox.update_from_path().

This is quite a lot data pushing (and maybe copying) just to update dataLim bboxes.

Proposed logic

Separation of concerns: The Artists should have a function to get their data lims. These limits should be used to update the Bbox. Basically some Bbox.update_from_box, a kind of an in-place Bbox.union, which we don't seem to have.

Essentially, we have should implement a 3D variant of Collection.get_datalim` for 3D.

Proposed fix

Rough outline: We may start minimal with rolling a small

class _Bbox3d:
    def __init__(self, points):
        ((self.xmin, self.xmax),
         (self.ymin, self.ymax),
         (self.zmin, self.zmax)) = points

    def to_bbox_xy(self):
        return Bbox(((self.xmin, self.xmax), (self.ymin, self.ymax)))

    def to_bbox_zz(self):
        # first component contains z, second is unused
        return Bbox(((self.zmin, self.zmax), (0, 0)))

and implement _get_datalim3d() -> _Bbox3d on the 3d collections.

Then

def add_collection(col, autolim=True):
    ...
    if autolim:
        self.auto_scale_lim(col.get_datalim3d())

and

def auto_scale_lim(bbox3d):
     ...
     self.dataLim_xy.update_from_box(bbox3d.to_bbox_xy())
     self.dataLim_zz.update_from_box(bbox3d.to_bbox_zz())

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0