@@ -142,6 +142,15 @@ def __init__(self, root_model, link, source_plot, target_plot):
142
142
continue
143
143
144
144
axes [f'{ axis } _range' ] = target_plot .handles [f'{ axis } _range' ]
145
+ interval = getattr (link , f'intervals{ axis } ' , None )
146
+ if interval is not None and bokeh34 :
147
+ min , max = interval
148
+ if min is not None :
149
+ axes [f'{ axis } _range' ].min_interval = min
150
+ if max is not None :
151
+ axes [f'{ axis } _range' ].max_interval = max
152
+ self ._set_range_for_interval (axes [f'{ axis } _range' ], max )
153
+
145
154
bounds = getattr (link , f'bounds{ axis } ' , None )
146
155
if bounds is not None :
147
156
start , end = bounds
@@ -152,19 +161,27 @@ def __init__(self, root_model, link, source_plot, target_plot):
152
161
axes [f'{ axis } _range' ].end = end
153
162
axes [f'{ axis } _range' ].reset_end = end
154
163
155
- interval = getattr (link , f'intervals{ axis } ' , None )
156
- if interval is not None and bokeh34 :
157
- min , max = interval
158
- if min is not None :
159
- axes [f'{ axis } _range' ].min_interval = min
160
- if max is not None :
161
- axes [f'{ axis } _range' ].max_interval = max
162
-
163
164
tool = RangeTool (** axes )
164
165
source_plot .state .add_tools (tool )
165
166
if toolbars :
166
167
toolbars [0 ].tools .append (tool )
167
168
169
+ def _set_range_for_interval (self , axis , max ):
170
+ # Changes the existing Range1d axis range to be in the interval
171
+ for n in ("" , "reset_" ):
172
+ start = getattr (axis , f"{ n } start" )
173
+ try :
174
+ end = start + max
175
+ except Exception as e :
176
+ # Handle combinations of datetime axis and timedelta interval
177
+ # Likely a better way to do this
178
+ try :
179
+ import pandas as pd
180
+ end = (pd .array ([start ]) + pd .array ([max ]))[0 ]
181
+ except Exception :
182
+ raise e from None
183
+ setattr (axis , f"{ n } end" , end )
184
+
168
185
169
186
class DataLinkCallback (LinkCallback ):
170
187
"""
0 commit comments