@@ -667,18 +667,21 @@ def __call__(self):
667
667
except ValueError :
668
668
return []
669
669
670
- if dmin > dmax :
671
- dmax , dmin = dmin , dmax
672
- delta = relativedelta (dmax , dmin )
670
+ return self .tick_values (dmin , dmax )
671
+
672
+ def tick_values (self , vmin , vmax ):
673
+ if vmin > vmax :
674
+ vmax , vmin = vmin , vmax
675
+ delta = relativedelta (vmax , vmin )
673
676
674
677
# We need to cap at the endpoints of valid datetime
675
678
try :
676
- start = dmin - delta
679
+ start = vmin - delta
677
680
except ValueError :
678
681
start = _from_ordinalf (1.0 )
679
682
680
683
try :
681
- stop = dmax + delta
684
+ stop = vmax + delta
682
685
except ValueError :
683
686
# The magic number!
684
687
stop = _from_ordinalf (3652059.9999999 )
@@ -688,19 +691,19 @@ def __call__(self):
688
691
# estimate the number of ticks very approximately so we don't
689
692
# have to do a very expensive (and potentially near infinite)
690
693
# 'between' calculation, only to find out it will fail.
691
- nmax , nmin = date2num ((dmax , dmin ))
694
+ nmax , nmin = date2num ((vmax , vmin ))
692
695
estimate = (nmax - nmin ) / (self ._get_unit () * self ._get_interval ())
693
696
# This estimate is only an estimate, so be really conservative
694
697
# about bailing...
695
698
if estimate > self .MAXTICKS * 2 :
696
699
raise RuntimeError (
697
700
'RRuleLocator estimated to generate %d ticks from %s to %s: '
698
- 'exceeds Locator.MAXTICKS * 2 (%d) ' % (estimate , dmin , dmax ,
701
+ 'exceeds Locator.MAXTICKS * 2 (%d) ' % (estimate , vmin , vmax ,
699
702
self .MAXTICKS * 2 ))
700
703
701
- dates = self .rule .between (dmin , dmax , True )
704
+ dates = self .rule .between (vmin , vmax , True )
702
705
if len (dates ) == 0 :
703
- return date2num ([dmin , dmax ])
706
+ return date2num ([vmin , vmax ])
704
707
return self .raise_if_exceeds (date2num (dates ))
705
708
706
709
def _get_unit (self ):
@@ -866,6 +869,9 @@ def __call__(self):
866
869
self .refresh ()
867
870
return self ._locator ()
868
871
872
+ def tick_values (self , vmin , vmax ):
873
+ return self .get_locator (vmin , vmax ).tick_values (vmin , vmax )
874
+
869
875
def nonsingular (self , vmin , vmax ):
870
876
# whatever is thrown at us, we can scale the unit.
871
877
# But default nonsingular date plots at an ~4 year period.
@@ -1012,11 +1018,19 @@ def __init__(self, base=1, month=1, day=1, tz=None):
1012
1018
}
1013
1019
1014
1020
def __call__ (self ):
1015
- dmin , dmax = self .viewlim_to_dt ()
1016
- ymin = self .base .le (dmin .year )
1017
- ymax = self .base .ge (dmax .year )
1021
+ # if no data have been set, this will tank with a ValueError
1022
+ try :
1023
+ dmin , dmax = self .viewlim_to_dt ()
1024
+ except ValueError :
1025
+ return []
1026
+
1027
+ return self .tick_values (dmin , dmax )
1028
+
1029
+ def tick_values (self , vmin , vmax ):
1030
+ ymin = self .base .le (vmin .year )
1031
+ ymax = self .base .ge (vmax .year )
1018
1032
1019
- ticks = [dmin .replace (year = ymin , ** self .replaced )]
1033
+ ticks = [vmin .replace (year = ymin , ** self .replaced )]
1020
1034
while 1 :
1021
1035
dt = ticks [- 1 ]
1022
1036
if dt .year >= ymax :
@@ -1184,11 +1198,20 @@ def set_data_interval(self, vmin, vmax):
1184
1198
self ._wrapped_locator .set_data_interval (vmin , vmax )
1185
1199
return DateLocator .set_data_interval (self , vmin , vmax )
1186
1200
1187
- def __call__ (self , * args , ** kwargs ):
1188
- vmin , vmax = self .axis .get_view_interval ()
1189
- vmin *= MUSECONDS_PER_DAY
1190
- vmax *= MUSECONDS_PER_DAY
1191
- ticks = self ._wrapped_locator .tick_values (vmin , vmax )
1201
+ def __call__ (self ):
1202
+ # if no data have been set, this will tank with a ValueError
1203
+ try :
1204
+ dmin , dmax = self .viewlim_to_dt ()
1205
+ except ValueError :
1206
+ return []
1207
+
1208
+ return self .tick_values (dmin , dmax )
1209
+
1210
+ def tick_values (self , vmin , vmax ):
1211
+ nmin , nmax = date2num ((vmin , vmax ))
1212
+ nmin *= MUSECONDS_PER_DAY
1213
+ nmax *= MUSECONDS_PER_DAY
1214
+ ticks = self ._wrapped_locator .tick_values (nmin , nmax )
1192
1215
ticks = [tick / MUSECONDS_PER_DAY for tick in ticks ]
1193
1216
return ticks
1194
1217
0 commit comments