8000 Avoid using Bbox machinery in Path.get_extents; special case polylines. · matplotlib/matplotlib@3a959d9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3a959d9

Browse files
committed
Avoid using Bbox machinery in Path.get_extents; special case polylines.
update_from_data_xy is much slower than needed; we can use plain numpy instead. For polylines, we can completely skip the bezier handling for even more speedup.
1 parent 57c8baa commit 3a959d9

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

lib/matplotlib/path.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -588,13 +588,19 @@ def get_extents(self, transform=None, **kwargs):
588588
from .transforms import Bbox
589589
if transform is not None:
590590
self = transform.transform_path(self)
591-
bbox = Bbox.null()
592-
for curve, code in self.iter_bezier(**kwargs):
593-
# places where the derivative is zero can be extrema
594-
_, dzeros = curve.axis_aligned_extrema()
595-
# as can the ends of the curve
596-
bbox.update_from_data_xy(curve([0, *dzeros, 1]), ignore=False)
597-
return bbox
591+
if (self.codes is None
592+
or len(np.intersect1d(self.codes,
593+
[Path.CURVE3, Path.CURVE4])) == 0):
594+
xys = self.vertices
595+
else:
596+
xys = []
597+
for curve, code in self.iter_bezier(**kwargs):
598+
# places where the derivative is zero can be extrema
599+
_, dzeros = curve.axis_aligned_extrema()
600+
# as can the ends of the curve
601+
xys.append(curve([0, *dzeros, 1]))
602+
xys = np.concatenate(xys)
603+
return Bbox([xys.min(axis=0), xys.max(axis=0)])
598604

599605
def intersects_path(self, other, filled=True):
600606
"""

0 commit comments

Comments
 (0)
0