diff --git a/mne/viz/_3d.py b/mne/viz/_3d.py index 96dc264aaef..2fd44c51a91 100644 --- a/mne/viz/_3d.py +++ b/mne/viz/_3d.py @@ -1521,7 +1521,7 @@ def _plot_mpl_stc(stc, subject=None, surface='inflated', hemi='lh', return fig -def link_brains(brains, time=True, camera=False): +def link_brains(brains, time=True, camera=False, colorbar=True): """Plot multiple SourceEstimate objects with PyVista. Parameters @@ -1532,6 +1532,8 @@ def link_brains(brains, time=True, camera=False): If True, link the time controllers. Defaults to True. camera : bool If True, link the camera controls. Defaults to False. + colorbar : bool + If True, link the colorbar controllers. Defaults to True. """ from .backends.renderer import _get_3d_backend if _get_3d_backend() != 'pyvista': @@ -1551,7 +1553,7 @@ def link_brains(brains, time=True, camera=False): raise TypeError("Expected type is Brain but" " {} was given.".format(type(brain))) # link brains properties - _LinkViewer(brains, time, camera) + _LinkViewer(brains, time, camera, colorbar) def _triage_stc(stc, src, surface, backend_name, kind='scalar'): diff --git a/mne/viz/_brain/_timeviewer.py b/mne/viz/_brain/_timeviewer.py index 32b5ab049a6..72a190fb0bc 100644 --- a/mne/viz/_brain/_timeviewer.py +++ b/mne/viz/_brain/_timeviewer.py @@ -775,7 +775,7 @@ def configure_sliders(self): brain=self.brain, name="fmin" ) - fmin_slider = self.plotter.add_slider_widget( + self.fmin_slider = self.plotter.add_slider_widget( self.fmin_call, value=self.brain._data["fmin"], rng=rng, title="clim", @@ -789,7 +789,7 @@ def configure_sliders(self): brain=self.brain, name="fmid", ) - fmid_slider = self.plotter.add_slider_widget( + self.fmid_slider = self.plotter.add_slider_widget( self.fmid_call, value=self.brain._data["fmid"], rng=rng, title="", @@ -803,7 +803,7 @@ def configure_sliders(self): brain=self.brain, name="fmax", ) - fmax_slider = self.plotter.add_slider_widget( + self.fmax_slider = self.plotter.add_slider_widget( self.fmax_call, value=self.brain._data["fmax"], rng=rng, title="", @@ -816,20 +816,21 @@ def configure_sliders(self): plotter=self.plotter, brain=self.brain, ) - fscale_slider = self.plotter.add_slider_widget( + self.fscale_slider = self.plotter.add_slider_widget( self.fscale_call, value=1.0, rng=self.default_scaling_range, title="fscale", pointa=(0.82, 0.10), pointb=(0.98, 0.10) ) - self.fscale_call.fscale_slider_rep = fscale_slider.GetRepresentation() + self.fscale_call.fscale_slider_rep = \ + self.fscale_slider.GetRepresentation() # register colorbar slider representations self.reps = { - "fmin": fmin_slider.GetRepresentation(), - "fmid": fmid_slider.GetRepresentation(), - "fmax": fmax_slider.GetRepresentation(), + "fmin": self.fmin_slider.GetRepresentation(), + "fmid": self.fmid_slider.GetRepresentation(), + "fmax": self.fmax_slider.GetRepresentation(), } self.fmin_call.reps = self.reps self.fmid_call.reps = self.reps @@ -838,10 +839,10 @@ def configure_sliders(self): # set the slider style self.set_slider_style(smoothing_slider) - self.set_slider_style(fmin_slider) - self.set_slider_style(fmid_slider) - self.set_slider_style(fmax_slider) - self.set_slider_style(fscale_slider) + self.set_slider_style(self.fmin_slider) + self.set_slider_style(self.fmid_slider) + self.set_slider_style(self.fmax_slider) + self.set_slider_style(self.fscale_slider) if time_slider is not None: self.set_slider_style(playback_speed_slider) self.set_slider_style(time_slider) @@ -1301,6 +1302,9 @@ def clean(self): self.clear_points() self.actions.clear() self.reps = None + self.fmin_slider = None + self.fmid_slider = None + self.fmax_slider = None self._time_slider = None self._playback_speed_slider = None if self.orientation_call is not None: @@ -1351,7 +1355,7 @@ def clean(self): class _LinkViewer(object): """Class to link multiple _TimeViewer objects.""" - def __init__(self, brains, time=True, camera=False): + def __init__(self, brains, time=True, camera=False, colorbar=True): self.brains = brains self.time_viewers = [brain.time_viewer for brain in brains] @@ -1394,6 +1398,27 @@ def _func(*args, **kwargs): if time_viewer.show_traces: time_viewer.mpl_canvas.time_func = _func + if colorbar: + for slider_name in ('min', 'mid', 'max'): + func = getattr(self, "set_f" + slider_name) + self.link_sliders( + name="f" + slider_name + "_slider", + callback=func, + event_type="always" + ) + + def set_fmin(self, value): + for time_viewer in self.time_viewers: + time_viewer.fmin_call(value) + + def set_fmid(self, value): + for time_viewer in self.time_viewers: + time_viewer.fmid_call(value) + + def set_fmax(self, value): + for time_viewer in self.time_viewers: + time_viewer.fmax_call(value) + def set_time_point(self, value): for time_viewer in self.time_viewers: time_viewer.time_call(value, update_widget=True)