Repository navigation
Releases: fastplotlib/fastplotlib
Release list
v0.7.0
This is a big release with a ton of new features!
New
- NDWidget: The biggest new addition, a system for viewing n-dimensional multi-modal datasets with arbitrary graphical representations. For more information see docs on the data model and a guide on how to use it. While this does talk about neuroscience datasets, it is applicable to any forms of scientific data that fit the data model (n-dim, multi modal, heterogeneous sampling, etc.). Big thanks to everyone who was involved in designing, brainstorming and reviewing the NDWidget! @clewis7 @apasarkar @FlynnOConnell
- New graphics:
MeshGraphic,SurfaceGraphic,PolygonGraphic,InfLineGraphic, andImageYUVGraphic(YUV components sent straight to the GPU, much faster for displaying video data, use withasyncvideo: https://pypi.org/project/asyncvideo/). - Collections refactor: new
ScatterCollection,ScatterStack,ImageCollectionandImageGrid. Numpy-like fancy indexing across graphics. - Lines and scatters:
dash_patternandthinargs, andcmap_range - Images: native dtypes are kept (only 64-bit types are cast to float32), new args: gamma, colorspace, cpu_buffer and texture_usage.
- Data setters: setting data with a different size or shape automaticlaly allocates a new buffer!
- Graphic: scale, map_model_to_world()/map_world_to_model(), tooltip_format.
- Selectors: the
HighlightSelectors,VisibilitySelector,ImageVisibilitySelector,SelectorCollection(LinearSelectors, RectangleSelectors, …) and SelectionVector. - Tools: a
Cursortool and a tooltips. - imgui: windows can go on any edge, float, or sit in the toolbar, for a figure or a single subplot (add_imgui_window). Each graphic can have its own right-click popup. ImguiColorbar replaces the HistogramLUTTool.
- Config system, see the docs.
- Other: Figure(rects=/extents=) accepts a dict keyed by subplot name; axis labels; PlotArea.x_range/y_range/map_world_to_screen(); matplotlib migration guide.
Breaking
- Dependencies: Python ≥ 3.11, numpy ≥ 2.1, pygfx == 0.17.0. imgui requires imgui-bundle<1.92.900 until the next wgpu-py release.
- isolated_buffer removed from every graphic; buffers always copy, some graphics such as
ImageGraphic, have acpu_bufferthat you can set to false for directly sending data to the GPU with no copy. - All uniform_* kwargs removed: uniform_color(s), uniform_marker, uniform_edge_color, uniform_size and point_rotation_mode are gone, and the mode is inferred from the passed or set value. A single color is now uniform, so line.colors returns a pygfx.Color and line.colors[i] = ... raises TypeError unless per-vertex colors were passed.
- Line/scatter cmap: returns a cmap.Colormap and is applied on the GPU. Use cmap_transform/cmap_range instead of graphic.cmap.transform.
- Image cmap: returns a
cmap.Colormapinstead of a str. - Collections:
collection[i]andcollection[slice]are removed; usecollection.graphics[i]or the accessors, e.g.collection.data[i]. kwargs_lines and uniform_colors are gone. - LineStack(separation=): was a float (default 10) added to each line's own max. It is now an (x, y, z) gap (default (0, 0, 0)) added to one step shared by all graphics (the max over all the data).
- Defaults: scatter sizes went from 1 to 5. Lines with thickness < 1.1 no longer switch to the thin material automatically, pass thin=True.
- Tooltips: now on by default in every subplot. Figure(show_tooltips=), figure.show_tooltips and figure.tooltip_manager are gone. Use subplot.tooltip.enabled and graphic.tooltip_format.
- imgui renames:
- add_gui()/guis → add_imgui_window()/imgui_windows
- register_popup/open_popup/Graphic.right_click_menu → set_imgui_right_click()
- ui.EdgeWindow/Window/Popup/BaseGUI/GUI_EDGES → ImguiWindow/ImguiPopup/ImguiBase/EDGES
- ColormapPicker removed
- HistogramLUTTool removed, replaced by ui.ImguiColorbar.
- ImageWidget is now a thin wrapper over NDWidget. ndim, n_scrollable_dims, n_img_dims and reset_vmin_vmax_frame() are gone, and window_funcs returns the plain {dim: (func, size)} dict.
- fpl.utils.get_nearest_graphics* → fpl.get_nearest_graphics*.
Fixed
- Newer images now layer above older ones (#944).
- LinearSelector/LinearRegionSelector no longer crash with parent=None (#945).
- Setting image/volume alpha now works; it used to write to a nonexistent material.alpha (#1074).
- LinearSelector.limits are no longer rounded to integers.
- Nested loops over a Figure or collection work; the loops used to share one iterator.
- PolygonSelector buffers now shrink as well as grow (#958).
- ImageWidget.set_data() accepts arrays whose slider dims have different lengths (#965).
- The coolwarm cmap ambiguity warning is gone (#1079).
What's Changed
- fix z layering for images by @kushalkolar in #944
- fix linear and linear region selectors offset when parent is None by @kushalkolar in #945
- Polygon buffer also shrinks when it can by @almarklein in #958
- Add support for mesh and surface by @almarklein in #953
- remove dim length checks in
iw.set_data()by @kushalkolar in #965 - center links and badges by @FlynnOConnell in #969
- cursor tool and better tooltips by @kushalkolar in #947
- Fixes bug where tooltip info is incorrectly retrieved when tooltip in… by @apasarkar in #986
- fix type annot by @kushalkolar in #987
- rename test that was never being run before by @kushalkolar in #988
- fix typos by @kushalkolar in #991
- make ndc pos tuple an array before adding by @kushalkolar in #992
- Small updates by @kushalkolar in #989
- setting initial scale was missing from
Graphic._set_world_objectby @kushalkolar in #993 - Adding top gui to fpl by @clewis7 in #999
- fix bug in layout setting by @clewis7 in #1001
- add AI statements by @clewis7 in #1007
- remove screenshot accidentally uploaded to repo by @clewis7 in #1008
- Update GOVERNANCE.md by @clewis7 in #1009
Figurecan acceptrectsorextentsas andictwith keys indicating subplot names by @kushalkolar in #1014- add partial camera linking example by @kushalkolar in #1020
- drop python 3.10 by @kushalkolar in #1062
- Edit contributing.md, add PR template by @kushalkolar in #1059
- Use namespaced "matplotlib:coolwarm" to silence cmap ambiguity warning by @hmaarrfk in #1079
- pin to newer pygfx by @kushalkolar in #1082
NDWidgetby @kushalkolar in #971- generate api docs during sphinx build by @kushalkolar in #1086
- Imgui legend by @kushalkolar in #1088
- Torch transpose by @kushalkolar in #1091
- ndwidget writeup by @kushalkolar in #1090
- Update _version.py by @kushalkolar in #1093
New Contributors
Full Changelog: v0.6.1...v0.7.0
v0.6.1
This release changes the pygfx version pin due to upstream changes in rendercanvas and wgpu that cause CI issues, does not affect users.
It also includes a fix for how plot areas are auto scaled when controllers manage multiple cameras.
What's Changed
- update pygfx pin by @kushalkolar in #939
- Bump by @kushalkolar in #942
- better plot scaling logic by @kushalkolar in #938
Full Changelog: v0.6.0...v0.6.1
v0.6.0
New
ImageVolumeGraphic, #791VectorsGraphic, #929- Scatter markers and other new scatter features, #913
- alpha handling, transparent objects are now pickable! #873
PolygonSelector, #837- Better handling of z-order for rendering, #906 .
What's Changed
- Update CODE_OF_CONDUCT.md by @kushalkolar in #879
- Tweaks to adjust to new pygfx blending by @almarklein in #838
- add emails to gov doc by @kushalkolar in #880
- remove graphic suffix by @clewis7 in #882
- add link to quickstart nb at top of guide by @kushalkolar in #864
- Update guide.rst by @kushalkolar in #887
- add kwarg for axes visibility by @clewis7 in #891
- Update README.md by @kushalkolar in #889
- Fix typo in Visible graphics feature by @almarklein in #892
- Implement PolygonSelector by @almarklein in #837
- Refactor handling of alpha by @almarklein in #873
- add
ImageVolumeGraphicby @kushalkolar in #791 - remove a old text editor temp file by @kushalkolar in #909
- Adjust for PyGfx's new ticks by @almarklein in #910
- Refactor z-order to ensure axes are on top by @almarklein in #906
- remove existing screenshots in regenerate action by @kushalkolar in #915
- thinner selectors by @kushalkolar in #914
- New screenshots :D by @kushalkolar in #919
- fewer github actions for CI by @kushalkolar in #925
- skip existing arrays in ImageWidget.set_data() by @kushalkolar in #924
- add animation func getter and
clear_animations()method by @clewis7 in #896 - Scatter markers and other scatter features by @kushalkolar in #913
- Fix docstring by @kushalkolar in #930
- VectorsGraphic by @kushalkolar in #929
- bump version to 0.6.0 by @kushalkolar in #934
Full Changelog: v0.5.1...v0.6.0
v0.5.1
Bugfix release
What's Changed
- fix iw.set_data by @kushalkolar in #851
- add github button to docs by @kushalkolar in #845
- retry sklearn datset downloads if 403 error by @kushalkolar in #844
- Update docstrings by @kushalkolar in #841
- remove
Graphic.share_property()andunshare_property()by @kushalkolar in #842 - better docs on use in jupyterlab and ipython by @kushalkolar in #843
- fix move to pointer for linear and linear region selector by @kushalkolar in #855
- Imgui pin to attempt bugfix release by @kushalkolar in #876
Full Changelog: v0.5.0...v0.5.1
v0.5.0
New
- Tooltips!
figure = Figure(show_tooltips=True)will autogenerate tooltips that display the graphic's data at the current mouse pointer position. For customization see the examples gallery. Graphicis now public and available as a top level import, useful for typing and subclassing.fastplotlib.Graphic.- All GraphicFeatures are now public and available under the
fastplotlib.graphics.featuresnamespace. Useful for typing and subclassing for advanced use cases. GraphicFeatureEventis now public and also available as a top level import, i.e.fastplotlib.GraphicFeatureEvent, since this can be frequently used for typing in event callback functions.- Faster array subsampling that takes into account the relative dimensions of the input array, now used for
quick_min_max(). Thanks @FlynnOConnell ! - Infinite line material from
pygfxgives us a much nicerLinearSelector!
What's Changed
- bump version by @kushalkolar in #778
- Use pyproject.toml by @almarklein in #782
- Use _version.py that includes details using git by @almarklein in #784
- more event docs, make some things public by @kushalkolar in #773
- optimized array subsampling by @FlynnOConnell in #721
- add ignore_dims arg to subsample_array by @FlynnOConnell in #797
- add show fps and blend modes to right click menu options by @kushalkolar in #796
- Improve hover color behavior for selectors by @almarklein in #799
- Refactor selector drag behavior by @almarklein in #800
- Fixes array issue that was causing incompatibility in the subsample a… by @apasarkar in #803
- fix typo in dev docs by @kushalkolar in #807
- use
LineInfiniteSegmentMaterialforLinearSelectorby @kushalkolar in #813 - Fix rect manager by @kushalkolar in #820
- vertex_thickness -> vertex_size to be consistent with names of scatter property names by @apasarkar in #815
- coerce dtype=np.int64 for np.prod calls in subsample by @FlynnOConnell in #806
- docstring and docs cleanup, other misc small things by @kushalkolar in #828
- iw.current_index is now non-reentrant by @kushalkolar in #829
- lint by @clewis7 in #831
- Tooltips, add overlay render pass by @kushalkolar in #830
- pin to pygfx v0.10.0 for release by @kushalkolar in #836
Full Changelog: v0.4.0...v0.5.0
v0.4.0
New
- Window layouts! You can create subplots with arbitrary rects/extents on the canvas, move and resize them! From #740.
See the Examples Gallery to learn how to create them.
rects-2025-03-08_02.43.12.mp4
- Bidirectional events are supported! No changes in the API, just add event handlers as you normally would without worrying about recursion if you end up with cycles in your event graph. 😄 #744
- #771 , not officially documented for now, the way in which you access this might change in the future but we plan to keep this because it's very useful
Breaking
Subplot.set_titleno longer exists, useSubplot.title = "new_title_text".Subplot.titlewill return aTextGraphicthat you can further format.- The prototype video recorder (which wasn't really exposed) has been removed since it was very wonky. Once #765 is done we will have a proper way to create a video.
What's Changed
- Update governance by @clewis7 in #719
- removes size attribute use for histogram component of imagewidget by @apasarkar in #712
- fit old rtd links in faq by @kushalkolar in #720
- bump version to 0.4.0 by @kushalkolar in #713
- Update
WGPU_FORCE_OFFSCREENtoRENDERCANVAS_FORCE_OFFSCREENby @kushalkolar in #723 - Get nearest graphics indices by @FlynnOConnell in #699
- replace weird quotes, update
GraphicMethodsMixinby @kushalkolar in #735 - move viewport rect logic from subplot and docks to Figure by @kushalkolar in #724
- remove old video writer code by @kushalkolar in #736
- Update CONTRIBUTING.md by @kushalkolar in #737
- add kmeans clustering example by @clewis7 in #734
- implemenet
@block_reentrancedecorator by @kushalkolar in #744 - docs via ssh by @kushalkolar in #751
- Rectangle/bbox layouts in a Figure by @kushalkolar in #740
- fix comment, fix doc example readme file by @kushalkolar in #769
- Imgui stats by @kushalkolar in #771
- update gov and CoC about LLM spam by @kushalkolar in #774
- soft pin to pygfx~=0.9.0 for fpl release v04.0 by @kushalkolar in #775
Full Changelog: v0.3.0...v0.4.0
v0.3.0
New
- Axes! We finally have basic axes, thanks to @almarklein 🥳 . Currently not very performative but good enough for many use cases. If you do not need axes and require the absolute highest performance set the axes visibility to
False. - ImGUI integration! Optional imgui integration using
imgui_bundle. Provides subplot toolbars, right click menus, and allows implementation of UI elements within the canvas. This allows you to create UIs that will work across all GUI backends, Qt, glfw, and jupyter! See the examples to learn more. - use the
cmaplibrary - RectangleRegionSelector
- More examples
What's Changed
- add user guide by @clewis7 in #513
- fix guide by @clewis7 in #536
- fix legend by @kushalkolar in #544
- Bump version by @kushalkolar in #543
- adjust to latest wgpu by @kushalkolar in #542
- Use real references to
Graphics, proper garbage collection in ipython and jupyter by @kushalkolar in #546 - Update GOVERNANCE.md by @clewis7 in #556
- Figure_shape in imagewidget and related histogram widget bug fix by @apasarkar in #555
- catchup with pygfx, remove checks for pending uploads from tests by @kushalkolar in #562
- Basic axes by @kushalkolar in #551
- use cmap library for colormaps (#390) by @kushalkolar in #574
- change basis of axes by @kushalkolar in #567
- Update README.md by @clewis7 in #594
- fix
BaseSelector._move_to_pointerby @kushalkolar in #592 - add rectangular region selector by @clewis7 in #576
- add lorenz attractor example by @clewis7 in #595
- add FAQ by @clewis7 in #559
- Fix move to pointer for selectors again by @kushalkolar in #601
- pin pygfx>=0.4.0 by @kushalkolar in #607
- Fix rect selector by @kushalkolar in #609
- do get_ipython() only once in import by @kushalkolar in #611
- start imgui implementation by @kushalkolar in #571
ImageWidgetrgb bool arg by @kushalkolar in #630- Fix lfs file by @kushalkolar in #632
- fix auto canvas detection by @kushalkolar in #638
- docs reorganization take 3 by @kushalkolar in #639
- fix limits when rect selector is added from image by @kushalkolar in #641
- update github workflows by @kushalkolar in #651
- cleanup readme and move driver stuff to gpu guide by @kushalkolar in #653
- add example of exploration of a covariance matrix by @kushalkolar in #652
- remove ipywidget code from selectors and cleanup docstrings by @kushalkolar in #644
- better event docs, better docstring too by @kushalkolar in #654
- remove .readthedocs.yml by @kushalkolar in #655
- PlotArea.center_graphic() default zoom 1.35 -> 1.0 by @kushalkolar in #656
- cleanup CI by @kushalkolar in #661
- display adapters in HTML table upon import in notebooks by @kushalkolar in #659
- Update LICENSE by @kushalkolar in #665
- Delete apt.txt by @kushalkolar in #666
- add vertex, edge, and fill color properties by @clewis7 in #664
- update contrib guide, add developer notes by @clewis7 in #667
- update comments for image data shapes by @kushalkolar in #668
- updates related to upstream changes by @kushalkolar in #687
- Update year by @kushalkolar in #688
- add
size_spacetopygfx.PointsMaterialscatter kwargs by @FlynnOConnell in #689 - small wgpu changes by @kushalkolar in #691
- update python versions for CI by @kushalkolar in #692
- add fft example by @kushalkolar in #693
- fix
ImageWidget.reset_vmin_vmax()by @kushalkolar in #690 - remove glfw import that leaked in by @kushalkolar in #696
- raise ModuleNotFoundError if user tries to import imgui and it doesn't exist by @kushalkolar in #697
- simplify CI and install extras by @kushalkolar in #698
- update screenshot by @kushalkolar in #700
- Update ci step by @kushalkolar in #701
- add job that uses release version of pygfx by @kushalkolar in #706
- add macos-latest to CI matrix by @kushalkolar in #707
- Fix imgui popup menus by @kushalkolar in #695
- pin pygfx to v0.7.x for release by @kushalkolar in #708
- Update the README by @clewis7 in #704
- separate CI workflow that uses release version of pygfx by @kushalkolar in #709
- reorganized Figure export stuff by @kushalkolar in #710
New Contributors
- @FlynnOConnell made their first contribution in #689
Full Changelog: v0.2.0...v0.3.0
v0.2.0
Major release
Breaking changes
Graphicproperties (such as data, colors, thickness etc.) have been refactored. They are much simpler now.- Please see this for a description of the new API, concise and in-depth comparison are given: #511 (comment)
- Events should be added onto graphics now, not onto graphic properties. ex: do not do:
line.colors.add_event_handler(), instead do:line.add_event_handler(<callback>, "colors"). Decorators are also supported, for more info see #511 (comment) - selector
selectionis now in data space, and doesn't return indices. For example,linear_selector.selectionwill return the x or y position of the selector in data space, not the index like before. See the "selectors" section here for more details or the selector docs: #511 (comment)
Figureis new and is largely the same as the formerGridplot.Plotno longer exists. See #479
What's Changed
- update contrib guide for git-lfs by @tlambert03 in #391
- add faq to docs index by @kushalkolar in #400
- fix bug when remove_graphic() is used by @kushalkolar in #405
- add
Deletedas a graphic feature by @kushalkolar in #404 - Update README.md by @clewis7 in #411
- gpu info upon notebook import by @kushalkolar in #410
- set default renderer pixel_ratio=2 by @kushalkolar in #412
- add gpu info to docs by @kushalkolar in #409
- update screenshots, pygfx line shader changes by @kushalkolar in #414
- add gif files to .gitattributes by @kushalkolar in #415
- legends, part 1 by @kushalkolar in #406
- use
pytest<8until things catch up by @kushalkolar in #419 - more detailed contrib docs by @kushalkolar in #418
- ruff format everything by @kushalkolar in #421
- add zmq example by @kushalkolar in #422
- fix
fastplotlib.__init__by @kushalkolar in #424 - Fix typo by @almarklein in #423
- Just use asarray by @almarklein in #426
- Image widget by @almarklein in #429
- Remove duplicate code (mesh_masks) by @almarklein in #430
- Lazy import av by @almarklein in #432
- A bit of black by @almarklein in #433
- Add black to setup in optional feature set for tests by @EricThomson in #436
- update for changes in pygfx@main by @clewis7 in #443
- add codeowners file by @clewis7 in #442
- Rotation by @BalzaniEdoardo in #439
- require only one reviewer by @kushalkolar in #455
- Use simpler form of super() where possible by @almarklein in #453
- env var required for nb test funcs to run by @kushalkolar in #460
- Improvements to GUI selection and Qt support by @almarklein in #431
- simplify screenshot testing by @kushalkolar in #447
- set min version py3.10, cleanup type annotations by @kushalkolar in #465
- revert setting pixel ratio by @kushalkolar in #466
- add
Referencesobject toPlotArea, other cleanup, better garbage collection by @kushalkolar in #467 - gridplot controllers kwarg is back, other improvements to gp by @kushalkolar in #477
- Iw refactor by @kushalkolar in #482
Gridplot->Figureby @kushalkolar in #479- making picking default for all graphics by @kushalkolar in #484
- update qt examples by @kushalkolar in #485
- remove
__all__from top level by @kushalkolar in #490 - Select gpu by @kushalkolar in #491
- Create GOVERNANCE.md by @kushalkolar in #402
- Small cleanup by @kushalkolar in #498
- simple scatter animation example in quickstart by @kushalkolar in #500
- cycle colors in scatter example by @kushalkolar in #501
- Graphic features refactor by @kushalkolar in #511
- ndarray.ptp -> np.ptp for numpy v2 by @kushalkolar in #524
- update example w.r.t. gfeatures refactor by @kushalkolar in #528
- always cast to float32, try to convert other array types too by @kushalkolar in #527
- Get nearest graphics by @kushalkolar in #519
- disable cmap property for RGB images by @clewis7 in #529
- sphinx gallery by @clewis7 in #509
- Fix off by one error by @kushalkolar in #530
- Figure.export() by @kushalkolar in #531
- update readme by @kushalkolar in #532
- Update deps by @kushalkolar in #533
New Contributors
- @tlambert03 made their first contribution in #391
- @EricThomson made their first contribution in #436
- @BalzaniEdoardo made their first contribution in #439
Full Changelog: v0.1.0.a16...v0.2.0
v0.1.0.a16
Breaking changes
- in #382 the
controllersargument forGridPlothas been replaced by two new arguments. See the new docstring for details, briefly:controller_idsto specify how controllers can be synced across subplotscontroller_typesto specify the controller types, such as "panzoom", "fly", "orbit", etc.
- after #364
PlotArea.auto_scale()only takes keyword arguments and no positional arguments.
What's Changed
- try CI with bigmem runner again by @kushalkolar in #363
- set canvas default fps as 60 by @kushalkolar in #370
Plot.auto_scale()shouldn't change the camera aspect unless desired by @kushalkolar in #364ImageWidgetnotebook tests by @kushalkolar in #371- histogram LUT calculation fix, kinda by @kushalkolar in #372
- forget notebook_finished() call by @kushalkolar in #373
- skip setting data to hlut tool if not present in image widget subplot dock by @kushalkolar in #378
- cameras and controllers refactor by @kushalkolar in #382
Full Changelog: v0.1.0.a15...v0.1.0.a16
v0.1.0.a15
What's Changed
- fix controller getting disabled by @kushalkolar in #354
- fix normalize_min_max by @kushalkolar in #353
- make hlut widget optional by @clewis7 in #351
- bugfixes and more tests by @kushalkolar in #358
Note: CI for this version was performed locally and reference images were checked manually. GitHub actions was bugging out heavily.
Full Changelog: v0.1.0.a14...v0.1.0.a15