35
35
36
36
def _set_viewer_slice (idx , im ):
37
37
"""Helper to set a viewer slice number"""
38
- im .idx = idx
38
+ im .idx = max ( min ( int ( round ( idx )), im . size - 1 ), 0 )
39
39
im .set_data (im .get_slice (im .idx ))
40
40
for fun in im .cross_setters :
41
- fun ([idx ] * 2 )
41
+ fun ([im . idx ] * 2 )
42
42
43
43
44
44
class OrthoSlicer3D (object ):
@@ -133,24 +133,21 @@ def __init__(self, data, axes=None, aspect_ratio=(1, 1, 1), cmap='gray',
133
133
origin = 'lower' )
134
134
135
135
# Start midway through each axis
136
- st_x , st_y , st_z = (data_shape - 1 ) / 2.
137
- sts = (st_x , st_y , st_z )
138
- n_x , n_y , n_z = data_shape
139
- z_get_slice = lambda i : self .data [:, :, min (i , n_z - 1 )].T
140
- y_get_slice = lambda i : self .data [:, min (i , n_y - 1 ), :].T
141
- x_get_slice = lambda i : self .data [min (i , n_x - 1 ), :, :].T
142
- im1 = ax1 .imshow (z_get_slice (st_z ), ** kw )
143
- im2 = ax2 .imshow (y_get_slice (st_y ), ** kw )
144
- im3 = ax3 .imshow (x_get_slice (st_x ), ** kw )
136
+ z_get_slice = lambda i : self .data [:, :, i ].T
137
+ y_get_slice = lambda i : self .data [:, i , :].T
138
+ x_get_slice = lambda i : self .data [i , :, :].T
139
+ sts = (data_shape - 1 ) // 2
140
+ im1 = ax1 .imshow (z_get_slice (sts [2 ]), ** kw )
141
+ im2 = ax2 .imshow (y_get_slice (sts [1 ]), ** kw )
142
+ im3 = ax3 .imshow (x_get_slice (sts [0 ]), ** kw )
143
+ # idx is the current slice number for each panel
144
+ im1 .idx , im2 .idx , im3 .idx = sts
145
+ self ._ims = (im1 , im2 , im3 )
145
146
im1 .get_slice , im2 .get_slice , im3 .get_slice = (
146
147
z_get_slice , y_get_slice , x_get_slice )
147
- self ._ims = (im1 , im2 , im3 )
148
-
149
- # idx is the current slice number for each panel
150
- im1 .idx , im2 .idx , im3 .idx = st_z , st_y , st_x
151
148
152
149
# set the maximum dimensions for indexing
153
- im1 .size , im2 .size , im3 .size = n_z , n_y , n_x
150
+ im1 .size , im2 .size , im3 .size = data_shape
154
151
155
152
# set up axis crosshairs
156
153
colors = ['r' , 'g' , 'b' ]
@@ -191,6 +188,7 @@ def __init__(self, data, axes=None, aspect_ratio=(1, 1, 1), cmap='gray',
191
188
for fig in self .figs :
192
189
fig .canvas .mpl_connect ('scroll_event' , self .on_scroll )
193
190
fig .canvas .mpl_connect ('motion_notify_event' , self .on_mousemove )
191
+ fig .canvas .mpl_connect ('button_press_event' , self .on_mousemove )
194
192
195
193
def show (self ):
196
194
""" Show the slicer; convenience for ``plt.show()``
@@ -203,6 +201,26 @@ def close(self):
203
201
for f in self .figs :
204
202
plt .close (f )
205
203
204
+ def set_indices (self , x = None , y = None , z = None ):
205
+ """Set current displayed slice indices
206
+
207
+ Parameters
208
+ ----------
209
+ x : int | None
210
+ Index to use. If None, do not change.
211
+ y : int | None
212
+ Index to use. If None, do not change.
213
+ z : int | None
214
+ Index to use. If None, do not change.
215
+ """
216
+ draw = False
217
+ for im , val in zip (self ._ims , (z , y , x )):
218
+ if val is not None :
219
+ im .set_viewer_slice (val )
220
+ draw = True
221
+ if draw :
222
+ self ._draw_ims ()
223
+
206
224
def _axis_artist (self , event ):
207
225
"""Return artist if within axes, and is an image, else None
208
226
"""
@@ -216,8 +234,7 @@ def on_scroll(self, event):
216
234
im = self ._axis_artist (event )
217
235
if im is None :
218
236
return
219
- idx = (im .idx + (1 if event .button == 'up' else - 1 ))
220
- idx = max (min (idx , im .size - 1 ), 0 )
237
+ idx = im .idx + (1 if event .button == 'up' else - 1 )
221
238
im .set_viewer_slice (idx )
222
239
self ._draw_ims ()
223
240
@@ -227,9 +244,7 @@ def on_mousemove(self, event):
227
244
im = self ._axis_artist (event )
228
245
if im is None :
229
246
return
230
- x_im , y_im = im .x_im , im .y_im
231
- x , y = np .round ((event .xdata , event .ydata )).astype (int )
232
- for i , idx in zip ((x_im , y_im ), (x , y )):
247
+ for i , idx in zip ((im .x_im , im .y_im ), (event .xdata , event .ydata )):
233
248
i .set_viewer_slice (idx )
234
249
self ._draw_ims ()
235
250
0 commit comments