Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3b3d074

Browse filesBrowse files
committed
resolve merge conflict
1 parent ef7b644 commit 3b3d074
Copy full SHA for 3b3d074

File tree

Expand file treeCollapse file tree

9 files changed

+251
-39
lines changed
Filter options
Expand file treeCollapse file tree

9 files changed

+251
-39
lines changed
+59Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
Grid of images with a cursor
3+
============================
4+
5+
Example showing a grid of images in a single subplot and an interactive cursor
6+
that marks the same position in each image
7+
"""
8+
9+
# test_example = false
10+
# sphinx_gallery_pygfx_docs = 'screenshot'
11+
12+
import fastplotlib as fpl
13+
import numpy as np
14+
15+
16+
figure = fpl.Figure(size=(700, 560))
17+
18+
# make 12 images
19+
images = np.random.rand(12, 100, 100)
20+
21+
# we will display 3 rows and 4 columns
22+
rows = 3
23+
columns = 4
24+
25+
# spacing between each image
26+
spacing = 25
27+
28+
# interactive cursor
29+
cursor = fpl.Cursor(size=15, color="magenta")
30+
31+
index = 0
32+
for i in range(rows):
33+
for j in range(columns):
34+
img = images[index]
35+
# offset is x, y, z position
36+
offset = (j * img.shape[1] + spacing * j, i * img.shape[0] + spacing * i, 0)
37+
img_graphic = figure[0, 0].add_image(img, cmap="viridis", offset=offset)
38+
cursor.add(img_graphic)
39+
40+
text_label = figure[0, 0].add_text(
41+
str(index),
42+
face_color="r",
43+
font_size=25,
44+
outline_color="w",
45+
outline_thickness=0.05,
46+
anchor="bottom-right",
47+
offset=offset
48+
)
49+
50+
index += 1
51+
52+
figure.show()
53+
54+
55+
# NOTE: `if __name__ == "__main__"` is NOT how to use fastplotlib interactively
56+
# please see our docs for using fastplotlib interactively in ipython and jupyter
57+
if __name__ == "__main__":
58+
print(__doc__)
59+
fpl.run()

‎fastplotlib/graphics/_base.py

Copy file name to clipboardExpand all lines: fastplotlib/graphics/_base.py
+8-8Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def __init__(
106106
# store hex id str of Graphic instance mem location
107107
self._fpl_address: HexStr = hex(id(self))
108108

109-
self._plot_area = None
109+
self._fpl_plot_area = None
110110

111111
# event handlers
112112
self._event_handlers = defaultdict(set)
@@ -362,7 +362,7 @@ def my_handler(event):
362362
feature.remove_event_handler(wrapper)
363363

364364
def _fpl_add_plot_area_hook(self, plot_area):
365-
self._plot_area = plot_area
365+
self._fpl_plot_area = plot_area
366366

367367
def __repr__(self):
368368
rval = f"{self.__class__.__name__} @ {hex(id(self))}"
@@ -380,8 +380,8 @@ def _fpl_prepare_del(self):
380380
"""
381381
# remove axes if added to this graphic
382382
if self._axes is not None:
383-
self._plot_area.scene.remove(self._axes)
384-
self._plot_area.remove_animation(self._update_axes)
383+
self._fpl_plot_area.scene.remove(self._axes)
384+
self._fpl_plot_area.remove_animation(self._update_axes)
385385
self._axes.world_object.clear()
386386

387387
# signal that a deletion has been requested
@@ -402,12 +402,12 @@ def _fpl_prepare_del(self):
402402

403403
for ev_type in PYGFX_EVENTS:
404404
try:
405-
self._plot_area.renderer.remove_event_handler(method, ev_type)
405+
self._fpl_plot_area.renderer.remove_event_handler(method, ev_type)
406406
except (KeyError, TypeError):
407407
pass
408408

409409
try:
410-
self._plot_area.remove_animation(method)
410+
self._fpl_plot_area.remove_animation(method)
411411
except KeyError:
412412
pass
413413

@@ -452,10 +452,10 @@ def add_axes(self):
452452
if self._axes is not None:
453453
raise AttributeError("Axes already added onto this graphic")
454454

455-
self._axes = Axes(self._plot_area, offset=self.offset, grids=False)
455+
self._axes = Axes(self._fpl_plot_area, offset=self.offset, grids=False)
456456
self._axes.world_object.local.rotation = self.world_object.local.rotation
457457

458-
self._plot_area.scene.add(self.axes.world_object)
458+
self._fpl_plot_area.scene.add(self.axes.world_object)
459459
self._axes.update_using_bbox(self.world_object.get_world_bounding_box())
460460

461461
@property

‎fastplotlib/graphics/image.py

Copy file name to clipboardExpand all lines: fastplotlib/graphics/image.py
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ def add_linear_selector(
311311
**kwargs,
312312
)
313313

314-
self._plot_area.add_graphic(selector, center=False)
314+
self._fpl_plot_area.add_graphic(selector, center=False)
315315

316316
# place selector above this graphic
317317
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] + 1)
@@ -388,7 +388,7 @@ def add_linear_region_selector(
388388
**kwargs,
389389
)
390390

391-
self._plot_area.add_graphic(selector, center=False)
391+
self._fpl_plot_area.add_graphic(selector, center=False)
392392

393393
# place above this graphic
394394
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] + 1)
@@ -430,7 +430,7 @@ def add_rectangle_selector(
430430
**kwargs,
431431
)
432432

433-
self._plot_area.add_graphic(selector, center=False)
433+
self._fpl_plot_area.add_graphic(selector, center=False)
434434

435435
# place above this graphic
436436
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] + 1)

‎fastplotlib/graphics/line.py

Copy file name to clipboardExpand all lines: fastplotlib/graphics/line.py
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def add_linear_selector(
150150
**kwargs,
151151
)
152152

153-
self._plot_area.add_graphic(selector, center=False)
153+
self._fpl_plot_area.add_graphic(selector, center=False)
154154

155155
# place selector above this graphic
156156
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] + 1)
@@ -207,7 +207,7 @@ def add_linear_region_selector(
207207
**kwargs,
208208
)
209209

210-
self._plot_area.add_graphic(selector, center=False)
210+
self._fpl_plot_area.add_graphic(selector, center=False)
211211

212212
# place selector below this graphic
213213
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] - 1)
@@ -257,7 +257,7 @@ def add_rectangle_selector(
257257
**kwargs,
258258
)
259259

260-
self._plot_area.add_graphic(selector, center=False)
260+
self._fpl_plot_area.add_graphic(selector, center=False)
261261

262262
return selector
263263

‎fastplotlib/graphics/line_collection.py

Copy file name to clipboardExpand all lines: fastplotlib/graphics/line_collection.py
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ def add_linear_selector(
381381
**kwargs,
382382
)
383383

384-
self._plot_area.add_graphic(selector, center=False)
384+
self._fpl_plot_area.add_graphic(selector, center=False)
385385

386386
# place selector above this graphic
387387
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] + 1)
@@ -438,7 +438,7 @@ def add_linear_region_selector(
438438
**kwargs,
439439
)
440440

441-
self._plot_area.add_graphic(selector, center=False)
441+
self._fpl_plot_area.add_graphic(selector, center=False)
442442

443443
# place selector below this graphic
444444
selector.offset = selector.offset + (0.0, 0.0, self.offset[-1] - 1)
@@ -484,7 +484,7 @@ def add_rectangle_selector(
484484
**kwargs,
485485
)
486486

487-
self._plot_area.add_graphic(selector, center=False)
487+
self._fpl_plot_area.add_graphic(selector, center=False)
488488

489489
return selector
490490

‎fastplotlib/graphics/selectors/_base_selector.py

Copy file name to clipboardExpand all lines: fastplotlib/graphics/selectors/_base_selector.py
+17-17Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def _get_source(self, graphic):
134134
return source
135135

136136
def _fpl_add_plot_area_hook(self, plot_area):
137-
self._plot_area = plot_area
137+
self._fpl_plot_area = plot_area
138138

139139
# when the pointer is pressed on a fill, edge or vertex
140140
for wo in self._world_objects:
@@ -147,35 +147,35 @@ def _fpl_add_plot_area_hook(self, plot_area):
147147
for fill in self._fill:
148148
if fill.material.color_is_transparent:
149149
self._pfunc_fill = partial(self._check_fill_pointer_event, fill)
150-
self._plot_area.renderer.add_event_handler(
150+
self._fpl_plot_area.renderer.add_event_handler(
151151
self._pfunc_fill, "pointer_down"
152152
)
153153

154154
# when the pointer moves
155-
self._plot_area.renderer.add_event_handler(self._move, "pointer_move")
155+
self._fpl_plot_area.renderer.add_event_handler(self._move, "pointer_move")
156156

157157
# when the pointer is released
158-
self._plot_area.renderer.add_event_handler(self._move_end, "pointer_up")
158+
self._fpl_plot_area.renderer.add_event_handler(self._move_end, "pointer_up")
159159

160160
# move directly to location of center mouse button click
161-
self._plot_area.renderer.add_event_handler(self._move_to_pointer, "click")
161+
self._fpl_plot_area.renderer.add_event_handler(self._move_to_pointer, "click")
162162

163163
# mouse hover color events
164164
for wo in self._hover_responsive:
165165
wo.add_event_handler(self._pointer_enter, "pointer_enter")
166166
wo.add_event_handler(self._pointer_leave, "pointer_leave")
167167

168168
# arrow key bindings
169-
self._plot_area.renderer.add_event_handler(self._key_down, "key_down")
170-
self._plot_area.renderer.add_event_handler(self._key_up, "key_up")
171-
self._plot_area.add_animations(self._key_hold)
169+
self._fpl_plot_area.renderer.add_event_handler(self._key_down, "key_down")
170+
self._fpl_plot_area.renderer.add_event_handler(self._key_up, "key_up")
171+
self._fpl_plot_area.add_animations(self._key_hold)
172172

173173
def _check_fill_pointer_event(self, event_source: WorldObject, ev):
174174
if self._edge_hovered:
175175
# if edge is hovered, prefer edge events, disable fill moves
176176
return
177177

178-
world_pos = self._plot_area.map_screen_to_world(ev)
178+
world_pos = self._fpl_plot_area.map_screen_to_world(ev)
179179
# outside viewport, ignore
180180
# this shouldn't be possible since the event handler is registered to the fill mesh world object
181181
# but I like sanity checks anyways
@@ -210,12 +210,12 @@ def _move_start(self, event_source: WorldObject, ev):
210210
pygfx ``Event``
211211
212212
"""
213-
last_position = self._plot_area.map_screen_to_world(ev)
213+
last_position = self._fpl_plot_area.map_screen_to_world(ev)
214214

215215
self._move_info = MoveInfo(last_position=last_position, source=event_source)
216216
self._moving = True
217217

218-
self._initial_controller_state = self._plot_area.controller.enabled
218+
self._initial_controller_state = self._fpl_plot_area.controller.enabled
219219

220220
def _move(self, ev):
221221
"""
@@ -233,10 +233,10 @@ def _move(self, ev):
233233
return
234234

235235
# disable controller during moves
236-
self._plot_area.controller.enabled = False
236+
self._fpl_plot_area.controller.enabled = False
237237

238238
# get pointer current world position
239-
world_pos = self._plot_area.map_screen_to_world(ev)
239+
world_pos = self._fpl_plot_area.map_screen_to_world(ev)
240240

241241
# outside this viewport
242242
if world_pos is None:
@@ -253,7 +253,7 @@ def _move(self, ev):
253253

254254
# restore the initial controller state
255255
# if it was disabled, keep it disabled
256-
self._plot_area.controller.enabled = self._initial_controller_state
256+
self._fpl_plot_area.controller.enabled = self._initial_controller_state
257257

258258
def _move_graphic(self, delta: np.ndarray):
259259
raise NotImplementedError("Must be implemented in subclass")
@@ -265,7 +265,7 @@ def _move_end(self, ev):
265265
# restore the initial controller state
266266
# if it was disabled, keep it disabled
267267
if self._initial_controller_state is not None:
268-
self._plot_area.controller.enabled = self._initial_controller_state
268+
self._fpl_plot_area.controller.enabled = self._initial_controller_state
269269

270270
def _move_to_pointer(self, ev):
271271
"""
@@ -291,7 +291,7 @@ def _move_to_pointer(self, ev):
291291

292292
current_pos_world: np.ndarray = center + offset
293293

294-
world_pos = self._plot_area.map_screen_to_world(ev)
294+
world_pos = self._fpl_plot_area.map_screen_to_world(ev)
295295

296296
# outside this viewport
297297
if world_pos is None:
@@ -382,7 +382,7 @@ def _key_up(self, ev):
382382

383383
def _fpl_prepare_del(self):
384384
if hasattr(self, "_pfunc_fill"):
385-
self._plot_area.renderer.remove_event_handler(
385+
self._fpl_plot_area.renderer.remove_event_handler(
386386
self._pfunc_fill, "pointer_down"
387387
)
388388
del self._pfunc_fill

‎fastplotlib/tools/__init__.py

Copy file name to clipboard
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from ._histogram_lut import HistogramLUTTool
2+
from ._cursor import Cursor

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.