napari 0.4.17#

We’re happy to announce the release of napari 0.4.17! napari is a fast, interactive, multi-dimensional image viewer for Python. It’s designed for browsing, annotating, and analyzing large multi-dimensional images. It’s built on top of Qt (for the GUI), vispy (for performant GPU-based rendering), and the scientific Python stack (numpy, scipy).

For more information, examples, and documentation, please visit our website: https://github.com/napari/napari

Highlights#

This release is focused on documentation improvements and bug fixes, with few changes to napari’s API. We picked out a few highlights, but keep reading below for the full list of changes!

Minimum blending and inverted colormaps#

We added a new blending mode, minimum, in #4875, along with some inverted colormaps by @cleterrier. The new mode and colormaps enable visualizing data as color intensities on a white background. This is particularly nice when using the Light theme. For more inspiration see #invertedLUT on Twitter and the built-in napari example examples/minimum_blending.py.

Option to edit second shortcut in preferences#

We improved customization of napari preferences by allowing you to define a second, alternative shortcut for each napari action. This allows you, for example, to have both numeric (e.g. 1, 2, 3 - related to button positions) and semantic (F - for fill) shortcuts defined for use in napari.

One line image loading#

We added napari.imshow in #4928 as a convenience function to load image data and return both a Viewer and the image Layer all in one line.

viewer, layer = napari.imshow(data)

See the docstring of napari.imshow for more details.

Experimental support for Qt6#

We added some basic support for PyQt6 and PySide6 in #3707, though we expect some issues. If you need or want to use Qt6, please try this out and report any bugs you find.

Multi-color text#

We added support for assigning multiple colors for text annotations of points and shapes in #4464. See examples/add_points_with_multicolor_text.py This uses the API that we intend to spread elsewhere for other style attributes like Points.face_color, so if you are a heavy user of those types of attributes you should try this out and leave feedback on Zulip or create issues on GitHub.

New Features#

  • Multi-color text with color encodings (#4464)

  • add layer reader in tooltip and info dialog (#4664)

  • Feature: Minimum blending (#4875)

  • Add option for forcing plugin choice when opening files in the GUI (#4882)

  • Add saving folders to preferences (#4902)

  • Add napari.imshow to return viewer and layers (#4928)

  • Option to load all dock widgets (#4954)

  • Feature: register a keyboard shortcut for preserve_labels checkbox (#5017)

  • Add option to edit second shortcut in settings (#5018)

  • Autorepeatable keybindings & keybindings for label brush size (#5086)

Improvements#

  • support PyQt6, remove logic for compile_qt_svgs (#3707)

  • Improvements on scale bar (#4511)

  • allow use of validate_all=True on nested evented models (#4551)

  • Add modal dialogs for window/application closure (#4637)

  • Optimization: convert point slice indices to floats (#4648)

  • honor confirm close settings when quitting (#4700)

  • Use custom color field classes in all models (#4704)

  • napari.viewer.current_viewer fallback ancestor (#4715)

  • Add public API for dims transpose (#4727)

  • Add a public API for the setGeometry method of _qt_window (#4729)

  • Expose points layer antialiasing control publicly (#4735)

  • Use npe2 list to show plugin info (#4739)

  • Allow pandas.Series as properties values (#4755)

  • Allow stack to be specified multiple times (#4783)

  • Refactor: use app-model and in-n-out (#4784)

  • Fix point experimental_canvas_size_limits and set sane defaults (#4790)

  • Improve “select all” logic in points layer, adding “select all across slices” behavior (#4809)

  • Make docked widgets of qt_viewer lazy (#4811)

  • Restore Labels, Points and Shapes layer mode after hold key (#4814)

  • Confirmation on close, alternative approach (#4820)

  • add path specificity scoring (#4830)

  • [Automatic] Update albertosottile/darkdetect vendored module (#4845)

  • Add plugin reader warning dialog (#4852)

  • Fix python name in macOS menu bar (#4989)

  • Explicit convert color to string when compile resources (#4997)

  • Add link to docs artifact to pull requests (#5014)

  • Reverse order of plugin name and widget name (#5054)

Performance#

  • Optimization: convert vector slice indices to floats (#4794)

Bug Fixes#

  • Fix: Always save settings after migration (#4490)

  • Make sure reader dialog pops open if File -> Open Sample is compatible with multiple readers (#4500)

  • Do not add duplicate layers (#4544)

  • Disconnect a removed slider’s _pull_label callback from the axis label change event (#4557)

  • Clean status message after leave canvas (#4607)

  • Alternate fix for alt-text issues (#4617)

  • Fix numpy version comparison for dev versions of numpy (#4622)

  • Restore “show all key bindings” shortcut (#4628)

  • Raise error when rgb True but data not correct dims (#4630)

  • Define different shortcuts for different screenshot actions in file menu (#4636)

  • Do not use keyword argument for QListWidgetItem parent set in constructor (#4661)

  • fix: fix manifest reader extensions, ensure that all builtins go through npe2 (#4668)

  • Fix source of copied layer events by use layer.as_layer_data_tuple (#4681)

  • Tracks tail update fix beyond _max_length (#4688)

  • Keep order of layers when select to save multiple selected layers (#4689)

  • Apply shown mask to points._view_size_scale (#4699)

  • Color edit without tooltip fix (#4717)

  • fix presentation and enablement of npe1 plugins (#4721)

  • fix clim init for dask arrays (#4724)

  • split Image interpolation on two properties, interpoltion2d and interpolation3d (#4725)

  • Fix bug in deepcopy of utils.context.Expr (#4730)

  • Fix _get_state for empty Vectors and Points layers (#4748)

  • Stop slider animation on display and dimension changes (#4761)

  • Fix deepcopy for trans objects when passing args (#4786)

  • Make newly added points editable (#4829)

  • Allow empty tuple layer to be returned #4571 (#4831)

  • Disable notifications if no main window (#4839)

  • Fix multiscale level selection when zoomed out (#4842)

  • Move vector mesh generation to napari vispy visual and fix vectors refesh (#4846)

  • Fix creation QtViewer for ViewerModel with already added layers (#4854)

  • Update hub.py (#4863)

  • Fix viewer.reset() throws TypeError (#4868)

  • fix icon urls for close dialog (#4887)

  • Fix missing slice from dims (#4889)

  • Raise exception when layer created with a scale value of 0 (#4906)

  • Fix for display of label colors (#4935)

  • Initialize plugins before validating widget in napari -w {plugin} (#4948)

  • Fix resize window problem by to long text in help (#4981)

  • Fix throttled status updates by ensuring GUI updates occur on the main thread (#4983)

  • Fix throttled status updates by use QSignalThrottler in _QtMainWindow constructor (#4985)

  • Ensure non-negative edge width (#5035)

  • Fix the wrong guardian for the build tooltip when bind button (#5075)

  • disable mip and minip cutoffs if opaque blending (#5085)

  • Fix blending presets. (#5087)

  • Bugfix: disable opacity slider for opaque blending (#5088)

  • Add extra garbage collection for some viewer tests (#5108)

  • Fix typestub and check manifest problems with build package (#5112)

  • Fix error with “None” key press (#5115)

  • Fix shortcuts deleting (#5119)

  • Standardise file extension when reading (#5121)

  • Fix slow points (#5133)

  • Use cross shape when cursor is small (#5141)

API Changes#

  • Removed unused private Layer._position (#4604)

  • Add public API for dims transpose (#4727)

  • Add a public API for the setGeometry method of _qt_window (#4729)

  • Expose points layer antialiasing control publicly (#4735)

Deprecations#

  • Deprecate layers.move_selected (#4559)

  • Update deprecation warnings with versions (#4757)

  • Make viewer.events.layers_change event deprecated (#4895)

Build Tools#

  • [pre-commit.ci] pre-commit autoupdate (#4506)

  • Limit workflows runs based on file changes (#4555)

  • [Automatic] Update albertosottile/darkdetect vendored module (#4561)

  • Dockerfile: stay on 20.04/LTS for python3.8 (#4572)

  • Block lxml 4.9.0 version (#4616)

  • Remove meshzoo from napari (#4620)

  • ci(dependabot): bump peter-evans/create-pull-request from 3 to 4 (#4675)

  • ci(dependabot): bump docker/build-push-action from 2.5.0 to 3 (#4676)

  • ci(dependabot): bump actions/setup-python from 3 to 4 (#4677)

  • ci(dependabot): bump toshimaru/auto-author-assign from 1.3.4 to 1.5.0 (#4678)

  • ci(dependabot): bump docker/metadata-action from 3 to 4 (#4679)

  • ci(dependabot): bump styfle/cancel-workflow-action from 0.9.1 to 0.10.0 (#4770)

  • ci(dependabot): bump actions/download-artifact from 2 to 3 (#4771)

  • ci(dependabot): bump actions/github-script from 5 to 6 (#4772)

  • ci(dependabot): bump bruceadams/get-release from 1.2.2 to 1.2.3 (#4773)

  • ci(dependabot): bump docker/login-action from 1.9.0 to 2 (#4774)

  • Bump vispy 0.11.0 (#4778)

  • [pre-commit.ci] pre-commit autoupdate (#4779)

  • ci(dependabot): bump toshimaru/auto-author-assign from 1.5.0 to 1.6.1 (#4890)

  • Docker: Update xpra’s apt too (#4901)

Documentation#

  • Proposal to accept NAP-1 - add institutional and funding partners to governance (#4458)

  • Fix ImportErrors for instance attributes when building docs (#4471)

  • Update viewer tutorial (#4473)

  • Fix selection events documentation for LayerList (#4478)

  • add ABRF LMRG workshop recording (#4487)

  • Add alt_text (#4502)

  • DOC: misc syntax updates and typoes (#4517)

  • Start a NAP about conda packaging for napari (#4519)

  • Add CZI as an Institutional and Funding Partner (#4524)

  • add I2K workshop (#4528)

  • Add NAP1 to ToC. (#4552)

  • Forward port of release note updates for 0.4.16rc2 and rc3 (#4563)

  • Add option to use npe2 shim/adaptor for npe1 plugins (#4564)

  • Forward port further 0.4.16 release note changes (#4592)

  • Discuss the approval of NAP-2 (conda-based packaging for napari) (#4602)

  • Add versioned API docs workflow (#4635)

  • Update installation instruction in documentation (#4639)

  • Fix docs for shape/points layer properties (#4659)

  • Embeding viewers in plugins widget example (#4665)

  • Add NAP-3: Spaces (#4684)

  • Fix NAP-1 status/type (#4685)

  • Add new core devs to docs (#4691)

  • add ‘napari-xpra’ target to dockerfile (#4703)

  • Fix Image parameter docs (#4750)

  • Make references to examples link there (#4767)

  • Add documentation about apply napari style to separate windows (#4780)

  • Fix documentation link errors. (#4787)

  • Fixing readme typo (#4791)

  • Add Talley to the steering council (#4798)

  • Update documenation : install plugin from URL (#4799)

  • Accept NAP-2: Distributing napari with conda-based packaging (#4810)

  • Fixes duplicate label warnings in the documentation (#4823)

  • added description of how to save layers without compression (#4832)

  • Add the ability to return a List[Layer] in magicgui (#4851)

  • Fix NAP-3 table of contents (#4872)

  • Feature: Minimum blending (#4875)

  • NAP 4: asynchronous slicing (#4892)

  • Correct minor typo in quick_start.md (#4908)

  • Add Google Calendar ID to directive (#4914)

  • Fix docs dependencies (#4915)

  • Maintenance: Add title to example and remove unused redirect configuration (#4921)

  • Use napari/packaging for Conda CI (#4923)

  • Correct minor typos on ‘Contributing resources’ page (#4927)

  • DOC Add docs on napari models and events (#4929)

  • DOC Fix add image examples (#4932)

  • add SciPy 2022 materials (#4934)

  • Remove repeated items in gallery ToC. (#4936)

  • DOC Remove references to old add_volume (#4939)

  • Fix calendar ID (#4944)

  • DOC Add docs on how to run napari headless (#4955)

  • Removes deprecated configuration options for notebooks from docs build (#4958)

  • Update async slicing discussion section with PR feedback (#4959)

  • DOC Add section on downloading CI built docs (#4961)

  • DOC Expand explanation of interaction_box_image example (#4962)

  • DOC: Fix some incorrect parameters names. (#4965)

  • DOC Add headless doc to toc (#4970)

  • Remove preliminary admonition for last two release notes (#4974)

  • Enabe tags in gallery examples. (#4975)

  • Update viewer screenshot in docs and make more prominent on napari.org (#4988)

  • Move the docs downloading screenshots to LFS (#4990)

  • DOC Enable intersphinx linking in examples (#4992)

  • Fix broken links in Napari Code of Conduct (#5005)

  • Add linkcheck (#5008)

  • Add link to docs artifact to pull requests (#5014)

  • Add release notes for 0.4.17 (#5031)

  • add #4954 to release notes (#5038)

  • add new PRs merged for 0.4.17 to release notes (#5045)

  • Proposal to accept NAP #4: asynchronous slicing (#5052)

  • Update v0.4.17.rc0 release notes (#5058)

  • update core dev group to remove Ziyang and Justine (#5059)

  • Better script for prepare release notes (#5061)

  • Bugfix: disable opacity slider for opaque blending (#5088)

  • Update links in NAP-2 (#5099)

  • Update release notes for v0.4.17rc1 (#5110)

  • Update release notes for v0.4.17rc3 (#5147)

Other Pull Requests#

  • Fire features event on Labels feature change (#4481)

  • Image layer control dtype normalization for tensorstore compatibility (#4482)

  • Reorder tests (#4483)

  • Test if events for all properties are defined (#4486)

  • throttle status update (#4488)

  • use inject_napari_dependencies in layer_actions commands (#4489)

  • Add _get_value_3d to surface (#4492)

  • Reduce canvas margin (#4496)

  • Fix trailing comma fixes black formatting (#4498)

  • Update layer list context keys (#4499)

  • Do not allow None when coercing encodings (#4504)

  • [Automatic] Update albertosottile/darkdetect vendored module (#4508)

  • Try to upload pytest json report as artifact. (#4518)

  • Try to speedup tests. (#4521)

  • change default blending mode on image layer to translucent no depth (#4523)

  • Accessor refactor (#4533)

  • Add explanation what EmitterGroup.block_all and EmitterGroup.unblock_all do in docstring (#4536)

  • Revert “change default blending mode on image layer to translucent no depth” (#4540)

  • add ci for asv benchmark suite (#4554)

  • Fixes/modifications to nested list model and Group in prep for layergroups (#4560)

  • Fix macos release version comparison in main (#4565)

  • Update base docker image to ubuntu 22.04, optimize container size. (#4568)

  • Patch scikit-image cells3d data function when testing examples (#4578)

  • Add question about qt backends to PR tests (#4583)

  • Don’t build bundle in PRs on doc changes (#4584)

  • Fix Auto-open trans issue. (#4586)

  • Internationalisation testing. (#4588)

  • Add test for QtPerformance widget (#4591)

  • Split coverage on parts (#4595)

  • More updates to the ignored translations file and translation CI infrastructure (#4596)

  • feat: add codespace (#4599)

  • Enable patch coverage reporting (#4632)

  • Add tests for qt_progress_bar.py (#4634)

  • Remove some sleepy tests, wait with timeout instead (#4638)

  • Speed up notebook display tests (#4641)

  • build: slight updates/de-dups in setupcfg (#4645)

  • test: Speed up test_viewer tests, split out pyqt5/pyside2 tests again (#4646)

  • Move test examples on end of test run them in different CI job (#4647)

  • Allow to trigger test_translation manually (#4652)

  • Limit comprehensive test concurrency to 1. (#4655)

  • Do not run asv on push (#4656)

  • ci: fix tox factor names in tests (#4660)

  • test: speed up magicgui forward ref tests (#4662)

  • Remove unused points _color state (#4666)

  • test: Cleanup usage of npe2 plugin manager in tests (#4669)

  • add dependabot for github actions dependencies (#4671)

  • Use cache: pip from actions setup-python (#4672)

  • Remove restore_settings_on_exit test util (#4673)

  • bump npe2 version, use new features (#4686)

  • [pre-commit.ci] pre-commit autoupdate (#4687)

  • Remove unnecessary uses of make_napari_viewer (replace with ViewerModel) (#4690)

  • Design issue template assignees (#4701)

  • Refactor label painting by moving code from mouse bindings onto layer, adding staged history and paint event (#4702)

  • Split out builtins into another top-level module (#4706)

  • use python 3.9 for mac tests until numcodecs 3.10 wheels are available (#4707)

  • Remove print statement in settings (#4718)

  • Use some features from npe2 v0.5.0 (#4719)

  • use same coverage report like in pull requests (#4722)

  • Update translation documentation link in pull request template (#4728)

  • Cleanup list of non-translatable strings. (#4732)

  • Add mini interactive prompt to edit string_list.json (#4733)

  • Do not inform about coverage untill all CI jobs are done (#4751)

  • Refactor NapariQtNotification test for better cleaning Qt objects (#4763)

  • Set focus on QtViewer object after creating main window (#4768)

  • Add missed call of running_as_bundled_app in __main__ (#4777)

  • test: fix ability to use posargs with tox (#4788)

  • Allow dunder methods use in PublicOnlyProxy (#4792)

  • add update_mesh method (#4793)

  • mock npe1 plugin manager during tests (fix tests with npe1 plugins installed) (#4806)

  • [Automatic] Update albertosottile/darkdetect vendored module (#4808)

  • Improve using Qt flags by direct use enums. (#4817)

  • Move searching parent outside NapariQtNotification constructor (#4841)

  • Enable plugin menu contributions with app-model (#4847)

  • Raise better errors from lazy getattr (#4848)

  • Allow to undock docked viewers in multiple viewers example (#4859)

  • MAINT: disable failing conda bundling. (#4878)

  • MAINT: Work around conda bundling issue. (#4883)

  • remove a few more qtbot.wait calls in tests (#4888)

  • use npe2api in plugin install dialog (#4893)

  • Add perfmon directory for shared configs and tools (#4898)

  • Conda: fix macOS signing (#4904)

  • Improve error message for a failed write (#4913)

  • Minor type fix (add Optional) (#4916)

  • add user keymap (#4946)

  • MAINT: temporary mypy disabling as it’s failing everywhere. (#4950)

  • Adjust the slider value to include current_size (#4951)

  • MAINT: re-enable type checking workflow (#4960)

  • MAINT: bump napari-console to 0.0.6. (#4967)

  • [pre-commit.ci] pre-commit autoupdate (#4968)

  • Fix: bump app-model, add test for layer buttons (#4972)

  • Add FUNDING.yml file to enable sponsor button and increase discoverability of option to sponsor napari (#4978)

  • Start adding a CODEOWNERS file. (#4993)

  • Add emacs temporary & local files to .gitignore (#4998)

  • Set fixpoint before move for shapes (#4999)

  • Fix sys.path issue with subprocess relaunch in macOS (#5007)

  • MAINT: update issue failing template (#5012)

  • [pre-commit.ci] pre-commit autoupdate (#5015)

  • Fix shift selection for points (#5022)

  • Revert “Fix sys.path issue with subprocess relaunch in macOS” (#5027)

  • Use Source object to track if a layer is duplicated (#5028)

  • Revert “Revert “Fix sys.path issue with subprocess relaunch in macOS”” (#5029)

  • update some of the ignored translations (#5032)

  • MAINT: fix a couple of trans._. (#5034)

  • MAINT: Update Future Warning. (#5037)

  • MAINT: Unnecessary formatting of constant. (#5044)

  • Small shortcuts preference pane wording update after #5018 (#5049)

  • Small changes to points defaults. (#5050)

  • MAINT: Don’t deprecate something that was never stable. (#5068)

  • Try to avoid latest shiboken that break CI (#5073)

  • Add new core libraries to napari info (#5077)

  • Update config directory paths for perfmon tools (#5081)

  • Update some strings to be translated, some to be ignored (#5082)

48 authors added to this release (alphabetical)#

32 reviewers added to this release (alphabetical)#