Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
7869153
working on toolbar
May 17, 2023
6a9fa9a
toolbar updates
May 18, 2023
4bab1ce
basic toolbar for plot implemented
May 19, 2023
3e916c9
base logic in notebook for gridplot toolbar
May 19, 2023
2fa309b
gp toolbar working when subplots have names & mix names/no names
May 19, 2023
b985f31
initial changes to simple plot toolbar
May 19, 2023
1702938
updates to plot toolbar, still need to refactor into separate file
May 22, 2023
20ef9dd
fixed gridplot toolbar, still need to move to separate class
May 22, 2023
47612a4
add flip button
May 22, 2023
14fda3c
adding click event handler for gp toolbar dropdown options
May 23, 2023
5bb9f00
keep new clicked plot up-to-date with toggle button values
May 23, 2023
7519116
Merge branch 'master' into buttons
clewis7 May 23, 2023
561b4eb
requested changes
May 23, 2023
0eacf45
Merge branch 'buttons' of https://github.com/kushalkolar/fastplotlib …
May 23, 2023
1fffdf1
adding record button
May 23, 2023
48775c3
record button
May 24, 2023
b125530
Merge branch 'master' into more_buttons
clewis7 May 24, 2023
9e6ed71
silly miss in merge conflict resolve
May 24, 2023
2b59076
wow I am struggling this am
May 24, 2023
9bdd2f7
imagewidget toolbar for single plot iw
May 24, 2023
edc1ab3
toolbar for iw with gridplot
May 24, 2023
3dc010e
requested changes
May 25, 2023
039d142
update flip icon
May 25, 2023
539b45a
toolbar updates
May 25, 2023
5778dd5
changes to linear selector event handler removal
May 25, 2023
0bbe464
Update fastplotlib/widgets/image.py
kushalkolar Jun 2, 2023
480e67f
simplify toolbar stuff in show(), simplify image widget toolbar
kushalkolar Jun 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
toolbar updates
  • Loading branch information
Caitlin Lewis
Caitlin Lewis committed May 25, 2023
commit 539b45ae2125994881a81f384f9d64c0cff08d30
169 changes: 92 additions & 77 deletions examples/buttons.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"cell_type": "code",
"execution_count": 1,
"id": "6725ce7d-eea7-44f7-bedc-813e8ce5bf4f",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from fastplotlib import Plot, GridPlot, ImageWidget\n",
Expand All @@ -16,12 +18,14 @@
"cell_type": "code",
"execution_count": 2,
"id": "33bf59c4-14e5-43a8-8a16-69b6859864c5",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1c3e43293aca45a19d365903625b1c46",
"model_id": "5039947949ac4d5da76e561e082da8c2",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -43,7 +47,7 @@
{
"data": {
"text/plain": [
"<weakproxy at 0x7fdab55af790 to LineGraphic at 0x7fdaea470cd0>"
"<weakproxy at 0x7ff6ca7af970 to LineGraphic at 0x7ff6ca7f0290>"
]
},
"execution_count": 2,
Expand All @@ -64,12 +68,14 @@
"cell_type": "code",
"execution_count": 3,
"id": "68ea8011-d6fd-448f-9bf6-34073164d271",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cb10c2023f584bacabc6ee5fbb897006",
"model_id": "5819995040a04300b5ccf10abac8b69e",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -88,14 +94,16 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 4,
"id": "91a31531-818b-46a2-9587-5d9ef5b59b93",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5fe57d44e1f648b2a52be84a24b89c1d",
"model_id": "2f318829d0a4419798a008c5fe2d6677",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -115,9 +123,11 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 5,
"id": "e96bbda7-3693-42f2-bd52-f668f39134f6",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"img = np.random.rand(512,512)\n",
Expand All @@ -127,22 +137,24 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 6,
"id": "03b877ba-cf9c-47d9-a0e5-b3e694274a28",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c78082de5ce146e1a134bd307fbed39e",
"model_id": "ff5064077bb944c6a5248f135f052668",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layout(width='auto'…"
]
},
"execution_count": 7,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -153,35 +165,16 @@
},
{
"cell_type": "code",
"execution_count": 9,
"id": "afc0cd52-fb24-4561-9876-50fbdf784502",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0, 1)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gp[0,1].position"
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 7,
"id": "36f5e040-cc58-4b0a-beb1-1f66ea02ccb9",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f902391ceb614f2a812725371184ce81",
"model_id": "f21de0c607b24fd281364a7bec8ad837",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -199,9 +192,11 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 8,
"id": "c6753d45-a0ae-4c96-8ed5-7638c4cf24e3",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"for subplot in gp2:\n",
Expand All @@ -210,22 +205,24 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 9,
"id": "5a769c0f-6d95-4969-ad9d-24636fc74b18",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "65a2a30036f44e22a479c6edd215e25a",
"model_id": "fcb816a9aaab42b3a7a7e443607ad127",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layout(width='auto'…"
]
},
"execution_count": 10,
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -236,24 +233,28 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 2,
"id": "3958829a-1a2b-4aa2-8c9d-408dce9ccf30",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"data = np.random.rand(500, 512, 512)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 3,
"id": "9f60c0b0-d0ee-4ea1-b961-708aff3b91ae",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "449ab6a6c0b0461eb688055d0fe4826a",
"model_id": "433485ec12b44aa68082a93c264e613c",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -274,27 +275,29 @@
}
],
"source": [
"iw = ImageWidget(data=data)"
"iw = ImageWidget(data=data, vmin_vmax_sliders=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 4,
"id": "346f241c-4bd0-4f90-afd5-3fa617d96dad",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6289b56a99d044818516f0ced6e74724",
"model_id": "a1bdd59532f240948d33ae440d61c4a5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layout(width='auto'…"
"VBox(children=(VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layo…"
]
},
"execution_count": 5,
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -305,47 +308,51 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 5,
"id": "0563ddfb-8fd3-4a99-bcee-3a83ae5d0f32",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"ename": "TypeError",
"evalue": "must pass list or numpy array",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m iw2 \u001b[38;5;241m=\u001b[39m \u001b[43mImageWidget\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgrid_plot_kwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcontrollers\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mNone\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mslider_dims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/repos/fastplotlib/fastplotlib/widgets/image.py:518\u001b[0m, in \u001b[0;36mImageWidget.__init__\u001b[0;34m(self, data, dims_order, slider_dims, window_funcs, frame_apply, vmin_vmax_sliders, grid_shape, names, grid_plot_kwargs, **kwargs)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grid_plot_kwargs \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 516\u001b[0m grid_plot_kwargs \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcontrollers\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msync\u001b[39m\u001b[38;5;124m\"\u001b[39m}\n\u001b[0;32m--> 518\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_plot: GridPlot \u001b[38;5;241m=\u001b[39m \u001b[43mGridPlot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mshape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgrid_shape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mgrid_plot_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mimage_graphics \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m()\n\u001b[1;32m 521\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m data_ix, (d, subplot) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mzip\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mplot)):\n",
"File \u001b[0;32m~/repos/fastplotlib/fastplotlib/layouts/_gridplot.py:91\u001b[0m, in \u001b[0;36mGridPlot.__init__\u001b[0;34m(self, shape, cameras, controllers, canvas, renderer, size, **kwargs)\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m controllers \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 89\u001b[0m controllers \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m*\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m])\u001b[38;5;241m.\u001b[39mreshape(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape)\n\u001b[0;32m---> 91\u001b[0m controllers \u001b[38;5;241m=\u001b[39m \u001b[43mto_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcontrollers\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m controllers\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape:\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m\n",
"File \u001b[0;32m~/repos/fastplotlib/fastplotlib/layouts/_gridplot.py:22\u001b[0m, in \u001b[0;36mto_array\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m a\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(a, \u001b[38;5;28mlist\u001b[39m):\n\u001b[0;32m---> 22\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmust pass list or numpy array\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(a)\n",
"\u001b[0;31mTypeError\u001b[0m: must pass list or numpy array"
]
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "79e924078e7f4cf69be71eaf12a94854",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"RFBOutputContext()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"iw2 = ImageWidget(data=[data, data, data, data], grid_plot_kwargs={'controllers': \"None\"}, slider_dims=\"t\")"
"iw2 = ImageWidget(data=[data, data, data, data], grid_plot_kwargs={'controllers': np.array([[0, 1], [2, 3]])}, slider_dims=\"t\", vmin_vmax_sliders=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"id": "d7fb94f8-825f-4447-b161-c9dafa1a068a",
"metadata": {},
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "532e0cebc3774c0b97ffe9e18d5553c1",
"model_id": "bb3b7dd92b4d4f74ace4adfbca35aaf3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layout(width='auto'…"
"VBox(children=(VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layo…"
]
},
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -357,7 +364,15 @@
{
"cell_type": "code",
"execution_count": null,
"id": "96d4554f-5788-4ac6-ad7f-4840f9570507",
"id": "3743219d-6702-468a-bea6-0e4c4549e9e4",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "68bafb86-db5a-4681-8176-37ec72ce04a8",
"metadata": {},
"outputs": [],
"source": []
Expand Down
5 changes: 3 additions & 2 deletions fastplotlib/layouts/_gridplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ def show(self, toolbar: bool = True):

for subplot in self:
subplot.auto_scale(maintain_aspect=True, zoom=0.95)

self.canvas.set_logical_size(*self._starting_size)

# check if in jupyter notebook or not
Expand Down Expand Up @@ -345,7 +345,8 @@ def __init__(self,
values.append(self.plot[pos].name)
else:
values.append(str(pos))
self.dropdown = Dropdown(options=values, disabled=False, description='Subplots:')
self.dropdown = Dropdown(options=values, disabled=False, description='Subplots:',
layout=Layout(width='200px'))

self.widget = HBox([self.autoscale_button,
self.center_scene_button,
Expand Down
Loading