@@ -62,7 +62,6 @@ class Collection(artist.Artist, cm.ScalarMappable):
6262 mappable will be used to set the ``facecolors`` and ``edgecolors``,
6363 ignoring those that were manually passed in.
6464 """
65- _offsets = np .zeros ((0 , 2 ))
6665 #: Either a list of 3x3 arrays or an Nx3x3 array (representing N
6766 #: transforms), suitable for the `all_transforms` argument to
6867 #: `~matplotlib.backend_bases.RendererBase.draw_path_collection`;
@@ -193,16 +192,12 @@ def __init__(self,
193192 else :
194193 self ._joinstyle = None
195194
196- # default to zeros
197- self ._offsets = np .zeros ((1 , 2 ))
198- self ._has_offsets = offsets is not None
199-
200- if self ._has_offsets :
195+ if offsets is not None :
201196 offsets = np .asanyarray (offsets , float )
202197 # Broadcast (2,) -> (1, 2) but nothing else.
203198 if offsets .shape == (2 ,):
204199 offsets = offsets [None , :]
205- self ._offsets = offsets
200+ self ._offsets = offsets
206201
207202 self ._offset_transform = offset_transform
208203
@@ -264,9 +259,12 @@ def get_datalim(self, transData):
264259 # if the offsets are in some coords other than data,
265260 # then don't use them for autoscaling.
266261 return transforms .Bbox .null ()
267- offsets = self ._offsets
262+ offsets = self .get_offsets ()
268263
269264 paths = self .get_paths ()
265+ if not len (paths ):
266+ # No paths to transform
267+ return transforms .Bbox .null ()
270268
271269 if not transform .is_affine :
272270 paths = [transform .transform_path_non_affine (p ) for p in paths ]
@@ -275,35 +273,34 @@ def get_datalim(self, transData):
275273 # transforms.get_affine().contains_branch(transData). But later,
276274 # be careful to only apply the affine part that remains.
277275
278- if isinstance (offsets , np .ma .MaskedArray ):
279- offsets = offsets .filled (np .nan )
280- # get_path_collection_extents handles nan but not masked arrays
281-
282- if len (paths ):
283- if any (transform .contains_branch_seperately (transData )):
284- # collections that are just in data units (like quiver)
285- # can properly have the axes limits set by their shape +
286- # offset. LineCollections that have no offsets can
287- # also use this algorithm (like streamplot).
288- return mpath .get_path_collection_extents (
289- transform .get_affine () - transData , paths ,
290- self .get_transforms (),
291- offset_trf .transform_non_affine (offsets ),
292- offset_trf .get_affine ().frozen ())
293-
294- if self ._has_offsets :
295- # this is for collections that have their paths (shapes)
296- # in physical, axes-relative, or figure-relative units
297- # (i.e. like scatter). We can't uniquely set limits based on
298- # those shapes, so we just set the limits based on their
299- # location.
300- offsets = (offset_trf - transData ).transform (offsets )
301- # note A-B means A B^{-1}
302- offsets = np .ma .masked_invalid (offsets )
303- if not offsets .mask .all ():
304- bbox = transforms .Bbox .null ()
305- bbox .update_from_data_xy (offsets )
306- return bbox
276+ if any (transform .contains_branch_seperately (transData )):
277+ # collections that are just in data units (like quiver)
278+ # can properly have the axes limits set by their shape +
279+ # offset. LineCollections that have no offsets can
280+ # also use this algorithm (like streamplot).
281+ if isinstance (offsets , np .ma .MaskedArray ):
282+ offsets = offsets .filled (np .nan )
283+ # get_path_collection_extents handles nan but not masked arrays
284+ return mpath .get_path_collection_extents (
285+ transform .get_affine () - transData , paths ,
286+ self .get_transforms (),
287+ offset_trf .transform_non_affine (offsets ),
288+ offset_trf .get_affine ().frozen ())
289+
290+ # NOTE: None is the default case where no offsets were passed in
291+ if self ._offsets is not None :
292+ # this is for collections that have their paths (shapes)
293+ # in physical, axes-relative, or figure-relative units
294+ # (i.e. like scatter). We can't uniquely set limits based on
295+ # those shapes, so we just set the limits based on their
296+ # location.
297+ offsets = (offset_trf - transData ).transform (offsets )
298+ # note A-B means A B^{-1}
299+ offsets = np .ma .masked_invalid (offsets )
300+ if not offsets .mask .all ():
301+ bbox = transforms .Bbox .null ()
302+ bbox .update_from_data_xy (offsets )
303+ return bbox
307304 return transforms .Bbox .null ()
308305
309306 def get_window_extent (self , renderer ):
@@ -316,7 +313,7 @@ def _prepare_points(self):
316313
317314 transform = self .get_transform ()
318315 offset_trf = self .get_offset_transform ()
319- offsets = self ._offsets
316+ offsets = self .get_offsets ()
320317 paths = self .get_paths ()
321318
322319 if self .have_units ():
@@ -327,10 +324,9 @@ def _prepare_points(self):
327324 xs = self .convert_xunits (xs )
328325 ys = self .convert_yunits (ys )
329326 paths .append (mpath .Path (np .column_stack ([xs , ys ]), path .codes ))
330- if offsets .size :
331- xs = self .convert_xunits (offsets [:, 0 ])
332- ys = self .convert_yunits (offsets [:, 1 ])
333- offsets = np .column_stack ([xs , ys ])
327+ xs = self .convert_xunits (offsets [:, 0 ])
328+ ys = self .convert_yunits (offsets [:, 1 ])
329+ offsets = np .column_stack ([xs , ys ])
334330
335331 if not transform .is_affine :
336332 paths = [transform .transform_path_non_affine (path )
@@ -559,7 +555,8 @@ def set_offsets(self, offsets):
559555
560556 def get_offsets (self ):
561557 """Return the offsets for the collection."""
562- return self ._offsets
558+ # Default to zeros in the no-offset (None) case
559+ return np .zeros ((1 , 2 )) if self ._offsets is None else self ._offsets
563560
564561 def _get_default_linewidth (self ):
565562 # This may be overridden in a subclass.
@@ -2156,13 +2153,12 @@ def draw(self, renderer):
21562153 renderer .open_group (self .__class__ .__name__ , self .get_gid ())
21572154 transform = self .get_transform ()
21582155 offset_trf = self .get_offset_transform ()
2159- offsets = self ._offsets
2156+ offsets = self .get_offsets ()
21602157
21612158 if self .have_units ():
2162- if len (self ._offsets ):
2163- xs = self .convert_xunits (self ._offsets [:, 0 ])
2164- ys = self .convert_yunits (self ._offsets [:, 1 ])
2165- offsets = np .column_stack ([xs , ys ])
2159+ xs = self .convert_xunits (offsets [:, 0 ])
2160+ ys = self .convert_yunits (offsets [:, 1 ])
2161+ offsets = np .column_stack ([xs , ys ])
21662162
21672163 self .update_scalarmappable ()
21682164
0 commit comments