@@ -62,7 +62,6 @@ class Collection(artist.Artist, cm.ScalarMappable):
62
62
ignoring those that were manually passed in.
63
63
"""
64
64
_offsets = np .zeros ((0 , 2 ))
65
- _transOffset = transforms .IdentityTransform ()
66
65
#: Either a list of 3x3 arrays or an Nx3x3 array (representing N
67
66
#: transforms), suitable for the `all_transforms` argument to
68
67
#: `~matplotlib.backend_bases.RendererBase.draw_path_collection`;
@@ -194,20 +193,17 @@ def __init__(self,
194
193
else :
195
194
self ._joinstyle = None
196
195
196
+ # default to zeros
197
197
self ._offsets = np .zeros ((1 , 2 ))
198
- # save if offsets passed in were none...
199
- self ._offsetsNone = offsets is None
200
- self ._uniform_offsets = None
198
+
201
199
if offsets is not None :
202
200
offsets = np .asanyarray (offsets , float )
203
201
# Broadcast (2,) -> (1, 2) but nothing else.
204
202
if offsets .shape == (2 ,):
205
203
offsets = offsets [None , :]
206
- if transOffset is not None :
207
- self ._offsets = offsets
208
- self ._transOffset = transOffset
209
- else :
210
- self ._uniform_offsets = offsets
204
+ self ._offsets = offsets
205
+
206
+ self ._transOffset = transOffset
211
207
212
208
self ._path_effects = None
213
209
self .update (kwargs )
@@ -223,11 +219,23 @@ def get_transforms(self):
223
219
return self ._transforms
224
220
225
221
def get_offset_transform (self ):
226
- t = self ._transOffset
227
- if (not isinstance (t , transforms .Transform )
228
- and hasattr (t , '_as_mpl_transform' )):
229
- t = t ._as_mpl_transform (self .axes )
230
- return t
222
+ """Return the `.Transform` instance used by this artist offset."""
223
+ if self ._transOffset is None :
224
+ self ._transOffset = transforms .IdentityTransform ()
225
+ elif (not isinstance (self ._transOffset , transforms .Transform )
226
+ and hasattr (self ._transOffset , '_as_mpl_transform' )):
227
+ self ._transOffset = self ._transOffset ._as_mpl_transform (self .axes )
228
+ return self ._transOffset
229
+
230
+ def set_offset_transform (self , transOffset ):
231
+ """
232
+ Set the artist offset transform.
233
+
234
+ Parameters
235
+ ----------
236
+ transOffset : `.Transform`
237
+ """
238
+ self ._transOffset = transOffset
231
239
232
240
def get_datalim (self , transData ):
233
241
# Calculate the data limits and return them as a `.Bbox`.
@@ -248,8 +256,8 @@ def get_datalim(self, transData):
248
256
249
257
transform = self .get_transform ()
250
258
transOffset = self .get_offset_transform ()
251
- if ( not self ._offsetsNone and
252
- not transOffset .contains_branch (transData ) ):
259
+ hasOffsets = np . any ( self ._offsets ) # True if any non-zero offsets
260
+ if hasOffsets and not transOffset .contains_branch (transData ):
253
261
# if there are offsets but in some coords other than data,
254
262
# then don't use them for autoscaling.
255
263
return transforms .Bbox .null ()
@@ -279,7 +287,7 @@ def get_datalim(self, transData):
279
287
self .get_transforms (),
280
288
transOffset .transform_non_affine (offsets ),
281
289
transOffset .get_affine ().frozen ())
282
- if not self . _offsetsNone :
290
+ if hasOffsets :
283
291
# this is for collections that have their paths (shapes)
284
292
# in physical, axes-relative, or figure-relative units
285
293
# (i.e. like scatter). We can't uniquely set limits based on
@@ -542,20 +550,12 @@ def set_offsets(self, offsets):
542
550
offsets = np .asanyarray (offsets , float )
543
551
if offsets .shape == (2 ,): # Broadcast (2,) -> (1, 2) but nothing else.
544
552
offsets = offsets [None , :]
545
- # This decision is based on how they are initialized above in __init__.
546
- if self ._uniform_offsets is None :
547
- self ._offsets = offsets
548
- else :
549
- self ._uniform_offsets = offsets
553
+ self ._offsets = offsets
550
554
self .stale = True
551
555
552
556
def get_offsets (self ):
553
557
"""Return the offsets for the collection."""
554
- # This decision is based on how they are initialized above in __init__.
555
- if self ._uniform_offsets is None :
556
- return self ._offsets
557
- else :
558
- return self ._uniform_offsets
558
+ return self ._offsets
559
559
560
560
def _get_default_linewidth (self ):
561
561
# This may be overridden in a subclass.
@@ -1441,9 +1441,6 @@ def set_segments(self, segments):
1441
1441
seg = np .asarray (seg , float )
1442
1442
_segments .append (seg )
1443
1443
1444
- if self ._uniform_offsets is not None :
1445
- _segments = self ._add_offsets (_segments )
1446
-
1447
1444
self ._paths = [mpath .Path (_seg ) for _seg in _segments ]
1448
1445
self .stale = True
1449
1446
@@ -1474,19 +1471,6 @@ def get_segments(self):
1474
1471
1475
1472
return segments
1476
1473
1477
- def _add_offsets (self , segs ):
1478
- offsets = self ._uniform_offsets
1479
- Nsegs = len (segs )
1480
- Noffs = offsets .shape [0 ]
1481
- if Noffs == 1 :
1482
- for i in range (Nsegs ):
1483
- segs [i ] = segs [i ] + i * offsets
1484
- else :
1485
- for i in range (Nsegs ):
1486
- io = i % Noffs
1487
- segs [i ] = segs [i ] + offsets [io :io + 1 ]
1488
- return segs
1489
-
1490
1474
def _get_default_linewidth (self ):
1491
1475
return mpl .rcParams ['lines.linewidth' ]
1492
1476
0 commit comments