@@ -189,7 +189,7 @@ def get_datalim(self, transData):
189
189
paths = self .get_paths ()
190
190
191
191
if not transform .is_affine :
192
- paths = [ transform . transform_path_non_affine ( p ) for p in paths ]
192
+ paths = self . _non_affine_transform_paths ( paths , transform )
193
193
transform = transform .get_affine ()
194
194
if not transOffset .is_affine :
195
195
offsets = transOffset .transform_non_affine (offsets )
@@ -213,6 +213,22 @@ def get_window_extent(self, renderer):
213
213
# cases other than scatter plot legend
214
214
return self .get_datalim (transforms .IdentityTransform ())
215
215
216
+ def _non_affine_transform_paths (self , paths , transform ):
217
+ """
218
+ Sometimes there will be many paths, and the transform is
219
+ slow to run. This helper concatenates the paths, transforms,
220
+ the points, and then splits them back into the individual paths.
221
+ """
222
+ vertices = np .vstack (path .vertices for path in paths )
223
+ pos = np .cumsum ([len (x ) for x in paths ])
224
+ vertices = transform .transform_path_non_affine (vertices )
225
+ # repopulate paths
226
+ verts = np .split (vertices , pos [:- 1 ])
227
+ for nn , verti in enumerate (verts ):
228
+ paths [nn ].vertices = verti
229
+
230
+ return paths
231
+
216
232
def _prepare_points (self ):
217
233
"""Point prep for drawing and hit testing"""
218
234
@@ -236,8 +252,7 @@ def _prepare_points(self):
236
252
offsets = np .column_stack ([xs , ys ])
237
253
238
254
if not transform .is_affine :
239
- paths = [transform .transform_path_non_affine (path )
240
- for path in paths ]
255
+ paths = self ._non_affine_transform_paths (paths , transform )
241
256
transform = transform .get_affine ()
242
257
if not transOffset .is_affine :
243
258
offsets = transOffset .transform_non_affine (offsets )
0 commit comments