plopp 25.11.0__tar.gz → 26.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. {plopp-25.11.0 → plopp-26.2.0}/.copier-answers.yml +1 -1
  2. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/docs.yml +1 -1
  3. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/nightly_at_main_lower_bound.yml +1 -1
  4. {plopp-25.11.0 → plopp-26.2.0}/.gitignore +1 -0
  5. {plopp-25.11.0 → plopp-26.2.0}/.pre-commit-config.yaml +5 -5
  6. {plopp-25.11.0/src/plopp.egg-info → plopp-26.2.0}/PKG-INFO +3 -3
  7. plopp-26.2.0/docs/_static/crosshairs.png +0 -0
  8. {plopp-25.11.0 → plopp-26.2.0}/docs/api-reference/index.md +2 -1
  9. {plopp-25.11.0 → plopp-26.2.0}/docs/conf.py +2 -1
  10. {plopp-25.11.0 → plopp-26.2.0}/docs/getting-started/numpy-pandas-xarray.ipynb +1 -2
  11. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/inspector-plot.ipynb +1 -3
  12. {plopp-25.11.0 → plopp-26.2.0}/pyproject.toml +7 -2
  13. {plopp-25.11.0 → plopp-26.2.0}/requirements/base.txt +1 -1
  14. {plopp-25.11.0 → plopp-26.2.0}/requirements/basetest.txt +1 -1
  15. {plopp-25.11.0 → plopp-26.2.0}/requirements/nightly.txt +1 -1
  16. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/__init__.py +1 -1
  17. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/canvas.py +3 -3
  18. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/plotly/canvas.py +2 -2
  19. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/colormapper.py +14 -4
  20. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/graphicalview.py +5 -4
  21. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/common.py +3 -3
  22. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/inspector.py +100 -43
  23. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/mesh3d.py +1 -1
  24. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/plot.py +2 -2
  25. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/scatter.py +3 -3
  26. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/scatter3d.py +5 -5
  27. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/slicer.py +2 -2
  28. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/superplot.py +2 -2
  29. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/xyplot.py +2 -2
  30. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/__init__.pyi +4 -3
  31. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/clip3d.py +160 -41
  32. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/drawing.py +70 -0
  33. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/linesave.py +1 -1
  34. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/slice.py +2 -2
  35. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/style.py +1 -1
  36. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/tools.py +3 -3
  37. {plopp-25.11.0 → plopp-26.2.0/src/plopp.egg-info}/PKG-INFO +3 -3
  38. {plopp-25.11.0 → plopp-26.2.0}/src/plopp.egg-info/SOURCES.txt +1 -1
  39. {plopp-25.11.0 → plopp-26.2.0}/src/plopp.egg-info/requires.txt +2 -2
  40. {plopp-25.11.0 → plopp-26.2.0}/tests/core/node_test.py +6 -6
  41. {plopp-25.11.0 → plopp-26.2.0}/tests/graphics/artists_test.py +1 -1
  42. {plopp-25.11.0 → plopp-26.2.0}/tests/graphics/canvas_test.py +7 -3
  43. {plopp-25.11.0 → plopp-26.2.0}/tests/graphics/colormapper_test.py +6 -2
  44. {plopp-25.11.0 → plopp-26.2.0}/tests/graphics/figures_test.py +3 -1
  45. plopp-26.2.0/tests/plotting/inspector_test.py +326 -0
  46. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/plot_1d_test.py +27 -0
  47. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/scatter_test.py +32 -1
  48. {plopp-25.11.0 → plopp-26.2.0}/tests/widgets/clip3d_test.py +93 -15
  49. {plopp-25.11.0 → plopp-26.2.0}/tox.ini +2 -2
  50. plopp-25.11.0/.github/dependabot.yml +0 -13
  51. plopp-25.11.0/tests/plotting/inspector_test.py +0 -92
  52. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/ci.yml +0 -0
  53. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/nightly_at_main.yml +0 -0
  54. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/nightly_at_release.yml +0 -0
  55. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/python-version-ci +0 -0
  56. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/release.yml +0 -0
  57. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/test.yml +0 -0
  58. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/unpinned.yml +0 -0
  59. {plopp-25.11.0 → plopp-26.2.0}/.github/workflows/weekly_windows_macos.yml +0 -0
  60. {plopp-25.11.0 → plopp-26.2.0}/.python-version +0 -0
  61. {plopp-25.11.0 → plopp-26.2.0}/CODE_OF_CONDUCT.md +0 -0
  62. {plopp-25.11.0 → plopp-26.2.0}/CONTRIBUTING.md +0 -0
  63. {plopp-25.11.0 → plopp-26.2.0}/LICENSE +0 -0
  64. {plopp-25.11.0 → plopp-26.2.0}/MANIFEST.in +0 -0
  65. {plopp-25.11.0 → plopp-26.2.0}/README.md +0 -0
  66. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/anaconda-icon.js +0 -0
  67. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/circle-exclamation.svg +0 -0
  68. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/custom.css +0 -0
  69. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/customization/custom-interfaces.png +0 -0
  70. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/customization/graph-node-tips.png +0 -0
  71. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/customization/subplots.png +0 -0
  72. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/customization/tweaking-figures.png +0 -0
  73. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/favicon.ico +0 -0
  74. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/gallery/README.txt +0 -0
  75. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/gallery/peeling-layers-thumbnail.png +0 -0
  76. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/gallery/scatter3d-with-slider-thumbnail.png +0 -0
  77. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/gallery/scatter3d-with-threshold-thumbnail.png +0 -0
  78. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/logo-dark.svg +0 -0
  79. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/logo-large-dark.svg +0 -0
  80. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/logo-large.svg +0 -0
  81. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/logo.svg +0 -0
  82. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/image-plot.png +0 -0
  83. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/inspector-plot.png +0 -0
  84. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/line-plot.png +0 -0
  85. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/mesh3d-plot.png +0 -0
  86. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/scatter-plot.png +0 -0
  87. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/scatter3d-plot.png +0 -0
  88. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/slicer-plot.png +0 -0
  89. {plopp-25.11.0 → plopp-26.2.0}/docs/_static/plotting/super-plot.png +0 -0
  90. {plopp-25.11.0 → plopp-26.2.0}/docs/_templates/class-template.rst +0 -0
  91. {plopp-25.11.0 → plopp-26.2.0}/docs/_templates/doc_version.html +0 -0
  92. {plopp-25.11.0 → plopp-26.2.0}/docs/_templates/module-template.rst +0 -0
  93. {plopp-25.11.0 → plopp-26.2.0}/docs/_templates/scipp-class-template.rst +0 -0
  94. {plopp-25.11.0 → plopp-26.2.0}/docs/_templates/scipp-module-template.rst +0 -0
  95. {plopp-25.11.0 → plopp-26.2.0}/docs/about/index.md +0 -0
  96. {plopp-25.11.0 → plopp-26.2.0}/docs/api-reference/matplotlib.md +0 -0
  97. {plopp-25.11.0 → plopp-26.2.0}/docs/api-reference/plotly.md +0 -0
  98. {plopp-25.11.0 → plopp-26.2.0}/docs/api-reference/pythreejs.md +0 -0
  99. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/animations.ipynb +0 -0
  100. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/custom-interfaces.ipynb +0 -0
  101. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/graph-node-tips.ipynb +0 -0
  102. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/index.md +0 -0
  103. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/subplots.ipynb +0 -0
  104. {plopp-25.11.0 → plopp-26.2.0}/docs/customization/tweaking-figures.ipynb +0 -0
  105. {plopp-25.11.0 → plopp-26.2.0}/docs/developer/coding-conventions.md +0 -0
  106. {plopp-25.11.0 → plopp-26.2.0}/docs/developer/dependency-management.md +0 -0
  107. {plopp-25.11.0 → plopp-26.2.0}/docs/developer/getting-started.md +0 -0
  108. {plopp-25.11.0 → plopp-26.2.0}/docs/developer/index.md +0 -0
  109. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/index.ipynb +0 -0
  110. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/interactive-masking.ipynb +0 -0
  111. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/masking-a-range.ipynb +0 -0
  112. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/nyc-taxi.ipynb +0 -0
  113. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/peeling-layers.ipynb +0 -0
  114. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/polar-plots.ipynb +0 -0
  115. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/rectangle-selection.ipynb +0 -0
  116. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/scatter3d-with-slider.ipynb +0 -0
  117. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/scatter3d-with-threshold.ipynb +0 -0
  118. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/streaming-plot.ipynb +0 -0
  119. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/tiled-random-samples.ipynb +0 -0
  120. {plopp-25.11.0 → plopp-26.2.0}/docs/gallery/updating-scatter.ipynb +0 -0
  121. {plopp-25.11.0 → plopp-26.2.0}/docs/getting-started/index.md +0 -0
  122. {plopp-25.11.0 → plopp-26.2.0}/docs/getting-started/installation.md +0 -0
  123. {plopp-25.11.0 → plopp-26.2.0}/docs/getting-started/overview.ipynb +0 -0
  124. {plopp-25.11.0 → plopp-26.2.0}/docs/getting-started/saving-figures.ipynb +0 -0
  125. {plopp-25.11.0 → plopp-26.2.0}/docs/index.md +0 -0
  126. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/image-plot.ipynb +0 -0
  127. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/index.md +0 -0
  128. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/line-plot.ipynb +0 -0
  129. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/mesh3d-plot.ipynb +0 -0
  130. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/scatter-plot.ipynb +0 -0
  131. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/scatter3d-plot.ipynb +0 -0
  132. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/slicer-plot.ipynb +0 -0
  133. {plopp-25.11.0 → plopp-26.2.0}/docs/plotting/super-plot.ipynb +0 -0
  134. {plopp-25.11.0 → plopp-26.2.0}/requirements/base.in +0 -0
  135. {plopp-25.11.0 → plopp-26.2.0}/requirements/basetest.in +0 -0
  136. {plopp-25.11.0 → plopp-26.2.0}/requirements/ci.in +0 -0
  137. {plopp-25.11.0 → plopp-26.2.0}/requirements/ci.txt +0 -0
  138. {plopp-25.11.0 → plopp-26.2.0}/requirements/dev.in +0 -0
  139. {plopp-25.11.0 → plopp-26.2.0}/requirements/dev.txt +0 -0
  140. {plopp-25.11.0 → plopp-26.2.0}/requirements/docs.in +0 -0
  141. {plopp-25.11.0 → plopp-26.2.0}/requirements/docs.txt +0 -0
  142. {plopp-25.11.0 → plopp-26.2.0}/requirements/make_base.py +0 -0
  143. {plopp-25.11.0 → plopp-26.2.0}/requirements/mini.in +0 -0
  144. {plopp-25.11.0 → plopp-26.2.0}/requirements/mini.txt +0 -0
  145. {plopp-25.11.0 → plopp-26.2.0}/requirements/mypy.in +0 -0
  146. {plopp-25.11.0 → plopp-26.2.0}/requirements/mypy.txt +0 -0
  147. {plopp-25.11.0 → plopp-26.2.0}/requirements/nightly.in +0 -0
  148. {plopp-25.11.0 → plopp-26.2.0}/requirements/noplotly.in +0 -0
  149. {plopp-25.11.0 → plopp-26.2.0}/requirements/noplotly.txt +0 -0
  150. {plopp-25.11.0 → plopp-26.2.0}/requirements/static.in +0 -0
  151. {plopp-25.11.0 → plopp-26.2.0}/requirements/static.txt +0 -0
  152. {plopp-25.11.0 → plopp-26.2.0}/requirements/test.in +0 -0
  153. {plopp-25.11.0 → plopp-26.2.0}/requirements/test.txt +0 -0
  154. {plopp-25.11.0 → plopp-26.2.0}/requirements/wheels.in +0 -0
  155. {plopp-25.11.0 → plopp-26.2.0}/requirements/wheels.txt +0 -0
  156. {plopp-25.11.0 → plopp-26.2.0}/resources/logo-plopp-2022.svg +0 -0
  157. {plopp-25.11.0 → plopp-26.2.0}/setup.cfg +0 -0
  158. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/__init__.py +0 -0
  159. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/common.py +0 -0
  160. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/__init__.py +0 -0
  161. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/fast_image.py +0 -0
  162. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/figure.py +0 -0
  163. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/image.py +0 -0
  164. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/line.py +0 -0
  165. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/mesh_image.py +0 -0
  166. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/scatter.py +0 -0
  167. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/tiled.py +0 -0
  168. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/matplotlib/utils.py +0 -0
  169. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/plotly/__init__.py +0 -0
  170. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/plotly/figure.py +0 -0
  171. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/plotly/line.py +0 -0
  172. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/__init__.py +0 -0
  173. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/canvas.py +0 -0
  174. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/figure.py +0 -0
  175. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/mesh3d.py +0 -0
  176. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/outline.py +0 -0
  177. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/backends/pythreejs/scatter3d.py +0 -0
  178. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/__init__.py +0 -0
  179. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/__init__.pyi +0 -0
  180. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/graph.py +0 -0
  181. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/helpers.py +0 -0
  182. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/limits.py +0 -0
  183. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/node_class.py +0 -0
  184. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/typing.py +0 -0
  185. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/utils.py +0 -0
  186. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/core/view.py +0 -0
  187. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/data/__init__.py +0 -0
  188. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/data/examples.py +0 -0
  189. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/data/factory.py +0 -0
  190. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/data/testing.py +0 -0
  191. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/__init__.py +0 -0
  192. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/__init__.pyi +0 -0
  193. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/basefig.py +0 -0
  194. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/bbox.py +0 -0
  195. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/camera.py +0 -0
  196. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/figures.py +0 -0
  197. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/graphics/tiled.py +0 -0
  198. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/__init__.py +0 -0
  199. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/plotting/__init__.pyi +0 -0
  200. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/py.typed +0 -0
  201. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/utils/__init__.py +0 -0
  202. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/utils/__init__.pyi +0 -0
  203. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/utils/arg_parse.py +0 -0
  204. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/utils/deprecation.py +0 -0
  205. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/__init__.py +0 -0
  206. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/box.py +0 -0
  207. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/checkboxes.py +0 -0
  208. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/debounce.py +0 -0
  209. {plopp-25.11.0 → plopp-26.2.0}/src/plopp/widgets/toolbar.py +0 -0
  210. {plopp-25.11.0 → plopp-26.2.0}/src/plopp.egg-info/dependency_links.txt +0 -0
  211. {plopp-25.11.0 → plopp-26.2.0}/src/plopp.egg-info/top_level.txt +0 -0
  212. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/matplotlib/mpl_image_test.py +0 -0
  213. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/matplotlib/mpl_line_test.py +0 -0
  214. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/matplotlib/mpl_plot_test.py +0 -0
  215. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/matplotlib/mpl_scatter_test.py +0 -0
  216. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/matplotlib/mpl_tiled_test.py +0 -0
  217. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/plotly/conftest.py +0 -0
  218. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/plotly/plotly_line_test.py +0 -0
  219. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/pythreejs/pythreejs_canvas_test.py +0 -0
  220. {plopp-25.11.0 → plopp-26.2.0}/tests/backends/pythreejs/pythreejs_scatter3d_test.py +0 -0
  221. {plopp-25.11.0 → plopp-26.2.0}/tests/conftest.py +0 -0
  222. {plopp-25.11.0 → plopp-26.2.0}/tests/core/graph_test.py +0 -0
  223. {plopp-25.11.0 → plopp-26.2.0}/tests/core/limits_test.py +0 -0
  224. {plopp-25.11.0 → plopp-26.2.0}/tests/core/utils_test.py +0 -0
  225. {plopp-25.11.0 → plopp-26.2.0}/tests/high_level_test.py +0 -0
  226. {plopp-25.11.0 → plopp-26.2.0}/tests/minimal_plot_test.py +0 -0
  227. {plopp-25.11.0 → plopp-26.2.0}/tests/package_test.py +0 -0
  228. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/common_test.py +0 -0
  229. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/mesh3d_test.py +0 -0
  230. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/plot_2d_test.py +0 -0
  231. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/scatter3d_test.py +0 -0
  232. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/slicer_test.py +0 -0
  233. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/superplot_test.py +0 -0
  234. {plopp-25.11.0 → plopp-26.2.0}/tests/plotting/xyplot_test.py +0 -0
  235. {plopp-25.11.0 → plopp-26.2.0}/tests/widgets/box_test.py +0 -0
  236. {plopp-25.11.0 → plopp-26.2.0}/tests/widgets/checkboxes_test.py +0 -0
  237. {plopp-25.11.0 → plopp-26.2.0}/tests/widgets/slice_test.py +0 -0
@@ -1,5 +1,5 @@
1
1
  # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
2
- _commit: c3214e6
2
+ _commit: b87e087
3
3
  _src_path: https://github.com/scipp/copier_template.git
4
4
  description: Visualization library for Scipp
5
5
  max_python: '3.13'
@@ -71,7 +71,7 @@ jobs:
71
71
  path: html/
72
72
  - run: echo "::notice::https://remote-unzip.deno.dev/${{ github.repository }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }}"
73
73
 
74
- - uses: JamesIves/github-pages-deploy-action@v4.7.3
74
+ - uses: JamesIves/github-pages-deploy-action@v4.8.0
75
75
  if: ${{ inputs.publish }}
76
76
  with:
77
77
  branch: gh-pages
@@ -31,7 +31,7 @@ jobs:
31
31
  ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }}
32
32
  steps:
33
33
  - uses: actions/checkout@v4
34
- - uses: astral-sh/setup-uv@v6
34
+ - uses: astral-sh/setup-uv@v7
35
35
  with:
36
36
  python-version: ${{ matrix.python.version }}
37
37
  - run: uv run --extra=test --resolution=lowest-direct pytest
@@ -51,3 +51,4 @@ docs/generated/
51
51
  *.zip
52
52
  *.sqw
53
53
  *.nxspe
54
+ *.mtz
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v5.0.0
3
+ rev: v6.0.0
4
4
  hooks:
5
5
  - id: check-added-large-files
6
6
  - id: check-case-conflict
@@ -15,14 +15,14 @@ repos:
15
15
  args: [ --markdown-linebreak-ext=md ]
16
16
  exclude: '\.svg'
17
17
  - repo: https://github.com/kynan/nbstripout
18
- rev: 0.7.1
18
+ rev: 0.8.2
19
19
  hooks:
20
20
  - id: nbstripout
21
21
  types: [ "jupyter" ]
22
22
  args: [ "--drop-empty-cells",
23
23
  "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ]
24
24
  - repo: https://github.com/astral-sh/ruff-pre-commit
25
- rev: v0.8.0
25
+ rev: v0.14.6
26
26
  hooks:
27
27
  - id: ruff
28
28
  args: [ --fix ]
@@ -30,7 +30,7 @@ repos:
30
30
  - id: ruff-format
31
31
  types_or: [ python, pyi ]
32
32
  - repo: https://github.com/codespell-project/codespell
33
- rev: v2.3.0
33
+ rev: v2.4.1
34
34
  hooks:
35
35
  - id: codespell
36
36
  additional_dependencies:
@@ -48,7 +48,7 @@ repos:
48
48
  - id: rst-inline-touching-normal
49
49
  - id: text-unicode-replacement-char
50
50
  - repo: https://github.com/rhysd/actionlint
51
- rev: v1.7.3
51
+ rev: v1.7.9
52
52
  hooks:
53
53
  - id: actionlint
54
54
  # Disable because of false-positive SC2046
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plopp
3
- Version: 25.11.0
3
+ Version: 26.2.0
4
4
  Summary: Visualization library for Scipp
5
5
  Author: Scipp contributors
6
6
  License-Expression: BSD-3-Clause
@@ -36,13 +36,13 @@ Requires-Dist: graphviz>=0.20.3; extra == "test"
36
36
  Requires-Dist: h5py>=3.12; extra == "test"
37
37
  Requires-Dist: ipympl>=0.8.4; extra == "test"
38
38
  Requires-Dist: ipywidgets>=8.1.0; extra == "test"
39
- Requires-Dist: ipykernel<7; extra == "test"
39
+ Requires-Dist: ipykernel<7,>=6.26; extra == "test"
40
40
  Requires-Dist: mpltoolbox>=24.6.0; extra == "test"
41
41
  Requires-Dist: pandas>=2.2.2; extra == "test"
42
42
  Requires-Dist: plotly>=5.15.0; extra == "test"
43
43
  Requires-Dist: pooch>=1.5; extra == "test"
44
44
  Requires-Dist: pyarrow>=13.0.0; extra == "test"
45
- Requires-Dist: pytest>=7.0; extra == "test"
45
+ Requires-Dist: pytest>=8.0; extra == "test"
46
46
  Requires-Dist: pythreejs>=2.4.1; extra == "test"
47
47
  Requires-Dist: scipp>=25.5.0; extra == "test"
48
48
  Requires-Dist: scipy>=1.10.0; extra == "test"
Binary file
@@ -79,7 +79,8 @@
79
79
  widgets.drawing.PointsTool
80
80
 
81
81
  widgets.clip3d.Clip3dTool
82
- widgets.clip3d.ClippingPlanes
82
+ widgets.clip3d.ClipValueTool
83
+ widgets.clip3d.ClippingManager
83
84
  ```
84
85
 
85
86
  ## Backends
@@ -251,7 +251,8 @@ linkcheck_ignore = [
251
251
  r'https?://github\.com/.*?/blob/[a-f0-9]+/.+?#',
252
252
  # Linkcheck seems to be denied access by some DOI resolvers.
253
253
  # Since DOIs are supposed to be permanent, we don't need to check them.'
254
- r'https://doi\.org/',
254
+ r'https?://doi\.org/',
255
+ r'https?://dx\.doi\.org/',
255
256
  ]
256
257
 
257
258
  # -- Options for nbsphinx gallery------------------------------------------
@@ -223,8 +223,7 @@
223
223
  "id": "16",
224
224
  "metadata": {},
225
225
  "source": [
226
- "Or the `inspector` plot that allows you to pick points on the 2d map and display a time cut in a second plot below using the the inspector tool\n",
227
- "<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Font_Awesome_5_solid_crosshairs.svg/32px-Font_Awesome_5_solid_crosshairs.svg.png' width=\"20\"/>:"
226
+ "Or the `inspector` plot that allows you to pick points on the 2d map and display a time cut in a second plot below using the the inspector tool <img src='../_static/crosshairs.png' width=\"20\"/>:"
228
227
  ]
229
228
  },
230
229
  {
@@ -10,9 +10,7 @@
10
10
  "The `inspector` plot takes in a three-dimensional input and applies a reduction operation (`sum` by default) along one of the dimensions specified by `dim`.\n",
11
11
  "It displays the result as a two-dimensional image.\n",
12
12
  "\n",
13
- "In addition, the inspector tool\n",
14
- "<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Font_Awesome_5_solid_crosshairs.svg/32px-Font_Awesome_5_solid_crosshairs.svg.png' width=\"20\"/>\n",
15
- "in the toolbar allows to add markers on the image,\n",
13
+ "In addition, the inspector tool <img src='../_static/crosshairs.png' width=\"20\"/> in the toolbar allows to add markers on the image,\n",
16
14
  "which generate one-dimensional slices (retaining only `dim`) that are displayed in a second figure.\n",
17
15
  "\n",
18
16
  "The points can be dragged/moved, as well as deleted (via a middle click).\n",
@@ -44,13 +44,13 @@ test = [
44
44
  "h5py>=3.12",
45
45
  "ipympl>=0.8.4",
46
46
  "ipywidgets>=8.1.0",
47
- "ipykernel<7", # Concurrency bug, see https://github.com/scipp/plopp/issues/499.
47
+ "ipykernel>=6.26,<7", # Concurrency bug, see https://github.com/scipp/plopp/issues/499.
48
48
  "mpltoolbox>=24.6.0",
49
49
  "pandas>=2.2.2",
50
50
  "plotly>=5.15.0",
51
51
  "pooch>=1.5",
52
52
  "pyarrow>=13.0.0",
53
- "pytest>=7.0",
53
+ "pytest>=8.0",
54
54
  "pythreejs>=2.4.1",
55
55
  "scipp>=25.5.0",
56
56
  "scipy>=1.10.0",
@@ -86,6 +86,11 @@ filterwarnings = [
86
86
  'ignore:Parsing dates involving a day of month without a year:DeprecationWarning',
87
87
  # Should be removed once we lower pin a matplotlib version that respects the deprecation
88
88
  'ignore:.*parameter is deprecated and will be removed in Pillow 13.*:DeprecationWarning',
89
+ # Warnings related to pyparsing deprecations: this is fixed in mpl==3.10.8 onwards
90
+ "ignore:'parseString' deprecated:DeprecationWarning",
91
+ "ignore:'resetCache' deprecated:DeprecationWarning",
92
+ "ignore:'enablePackrat' deprecated:DeprecationWarning",
93
+ "ignore:'parseAll' argument is deprecated:DeprecationWarning",
89
94
  ]
90
95
 
91
96
  [tool.ruff]
@@ -32,7 +32,7 @@ pyparsing==3.2.5
32
32
  # via matplotlib
33
33
  python-dateutil==2.9.0.post0
34
34
  # via matplotlib
35
- scipp==25.11.0
35
+ scipp==26.1.1
36
36
  # via -r base.in
37
37
  six==1.17.0
38
38
  # via python-dateutil
@@ -161,7 +161,7 @@ pyzmq==27.1.0
161
161
  # jupyter-client
162
162
  requests==2.32.5
163
163
  # via pooch
164
- scipp==25.11.0
164
+ scipp==26.1.1
165
165
  # via -r basetest.in
166
166
  scipy==1.16.3
167
167
  # via -r basetest.in
@@ -168,7 +168,7 @@ pyzmq==27.1.0
168
168
  # jupyter-client
169
169
  requests==2.32.5
170
170
  # via pooch
171
- scipp==100.0.0.dev0
171
+ scipp==26.1.1
172
172
  # via -r nightly.in
173
173
  scipy==1.16.3
174
174
  # via -r nightly.in
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: BSD-3-Clause
2
2
  # Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
3
- # ruff: noqa: E402, F401, I
3
+ # ruff: noqa: RUF100, E402, F401, I
4
4
 
5
5
  import importlib.metadata
6
6
 
@@ -112,7 +112,7 @@ class Canvas:
112
112
  grid: bool = False,
113
113
  user_vmin: sc.Variable | float | None = None,
114
114
  user_vmax: sc.Variable | float | None = None,
115
- aspect: Literal['auto', 'equal', None] = None,
115
+ aspect: Literal['auto', 'equal'] | None = None,
116
116
  cbar: bool = False,
117
117
  legend: bool | tuple[float, float] = True,
118
118
  xmin: sc.Variable | float | None = None,
@@ -123,7 +123,7 @@ class Canvas:
123
123
  logy: bool = False,
124
124
  xlabel: str | None = None,
125
125
  ylabel: str | None = None,
126
- norm: Literal['linear', 'log', None] = None,
126
+ norm: Literal['linear', 'log'] | None = None,
127
127
  **ignored,
128
128
  ):
129
129
  # Note on the `**ignored`` keyword arguments: the figure which owns the canvas
@@ -515,7 +515,7 @@ class Canvas:
515
515
  """
516
516
  self.fig.canvas.toolbar.pan()
517
517
 
518
- def panzoom(self, value: Literal['pan', 'zoom', None]):
518
+ def panzoom(self, value: Literal['pan', 'zoom'] | None):
519
519
  """
520
520
  Activate or deactivate the pan or zoom tool, depending on the input value.
521
521
  """
@@ -46,7 +46,7 @@ class Canvas:
46
46
  logy: bool | None = None,
47
47
  xlabel: str | None = None,
48
48
  ylabel: str | None = None,
49
- norm: Literal['linear', 'log', None] = None,
49
+ norm: Literal['linear', 'log'] | None = None,
50
50
  **ignored,
51
51
  ):
52
52
  # Note on the `**ignored`` keyword arguments: the figure which owns the canvas
@@ -326,7 +326,7 @@ class Canvas:
326
326
  """
327
327
  self.fig.update_layout(dragmode='pan')
328
328
 
329
- def panzoom(self, value: Literal['pan', 'zoom', None]):
329
+ def panzoom(self, value: Literal['pan', 'zoom'] | None):
330
330
  """
331
331
  Activate or deactivate the pan or zoom tool, depending on the input value.
332
332
  """
@@ -55,7 +55,12 @@ def _get_cmap(colormap: str | Colormap, nan_color: str | None = None) -> Colorma
55
55
  else:
56
56
  cmap = mpl.cm.get_cmap(colormap)
57
57
  except (KeyError, ValueError):
58
+ # Case where we have just a single color
58
59
  cmap = LinearSegmentedColormap.from_list('tmp', [colormap, colormap])
60
+ cmap.set_over(colormap)
61
+ cmap.set_under(colormap)
62
+ cmap.set_bad(colormap)
63
+ return cmap
59
64
 
60
65
  # Add under and over values to the cmap
61
66
  delta = 0.15
@@ -141,7 +146,7 @@ class ColorMapper:
141
146
  clabel: str | None = None,
142
147
  nan_color: str | None = None,
143
148
  figsize: tuple[float, float] | None = None,
144
- norm: Literal['linear', 'log', None] = None,
149
+ norm: Literal['linear', 'log'] | None = None,
145
150
  vmin: sc.Variable | float | None = None,
146
151
  vmax: sc.Variable | float | None = None,
147
152
  ):
@@ -152,9 +157,14 @@ class ColorMapper:
152
157
  self._canvas = canvas
153
158
  self.cax = self._canvas.cax if hasattr(self._canvas, 'cax') else None
154
159
  self.cmap = _get_cmap(cmap, nan_color=nan_color)
155
- self.mask_cmap = _get_cmap(
156
- mask_cmap if mask_color is None else mask_color, nan_color=nan_color
157
- )
160
+ self.mask_cmap = _get_cmap(mask_cmap if mask_color is None else mask_color)
161
+ if mask_color is None:
162
+ # If no single color was used for masks, it means a colormap was used
163
+ # instead. However, `nan_color` was not passed to get_cmap for the masks
164
+ # (it only applied to non-masked data), so we still need to set the 'bad'
165
+ # color here. We choose to set it to the 'over' color for a lack of a
166
+ # better idea.
167
+ self.mask_cmap.set_bad(self.mask_cmap.get_over())
158
168
 
159
169
  # Inside the autoscale, we need to distinguish between a min value that was set
160
170
  # by the user and one that was found by looping over all the data.
@@ -51,11 +51,11 @@ class GraphicalView(View):
51
51
  mask_cmap: str = 'gray',
52
52
  mask_color: str | None = None,
53
53
  cbar: bool = False,
54
- norm: Literal['linear', 'log', None] = None,
54
+ norm: Literal['linear', 'log'] | None = None,
55
55
  vmin: sc.Variable | float | None = None,
56
56
  vmax: sc.Variable | float | None = None,
57
57
  scale: dict[str, str] | None = None,
58
- aspect: Literal['auto', 'equal', None] = None,
58
+ aspect: Literal['auto', 'equal'] | None = None,
59
59
  grid: bool = False,
60
60
  title: str | None = None,
61
61
  figsize: tuple[float, float] | None = None,
@@ -312,5 +312,6 @@ class GraphicalView(View):
312
312
  self.artists[key].remove()
313
313
  del self.artists[key]
314
314
  self.canvas.update_legend()
315
- self.fit_to_data()
316
- self.canvas.draw()
315
+ if self._autoscale:
316
+ self.fit_to_data()
317
+ self.canvas.draw()
@@ -319,7 +319,7 @@ def input_to_nodes(obj: PlottableMulti, processor: Callable) -> list[Node]:
319
319
  to_nodes = obj.items()
320
320
  else:
321
321
  to_nodes = [(getattr(obj, "name", None), obj)]
322
- nodes = [Node(processor, inp, name=name) for name, inp in to_nodes]
322
+ nodes = [Node(processor, inp, name=str(name)) for name, inp in to_nodes]
323
323
  for node in nodes:
324
324
  if hasattr(processor, 'func'):
325
325
  node.pretty_name = processor.func.__name__
@@ -347,7 +347,7 @@ def raise_multiple_inputs_for_2d_plot_error(origin):
347
347
 
348
348
 
349
349
  def categorize_args(
350
- aspect: Literal['auto', 'equal', None] = None,
350
+ aspect: Literal['auto', 'equal'] | None = None,
351
351
  autoscale: bool = True,
352
352
  cbar: bool = True,
353
353
  clabel: str | None = None,
@@ -364,7 +364,7 @@ def categorize_args(
364
364
  mask_cmap: str = 'gray',
365
365
  mask_color: str = 'black',
366
366
  nan_color: str | None = None,
367
- norm: Literal['linear', 'log', None] = None,
367
+ norm: Literal['linear', 'log'] | None = None,
368
368
  scale: dict[str, str] | None = None,
369
369
  title: str | None = None,
370
370
  vmax: sc.Variable | float | None = None,
@@ -3,6 +3,7 @@
3
3
 
4
4
  from typing import Literal
5
5
 
6
+ import numpy as np
6
7
  import scipp as sc
7
8
 
8
9
  from ..core import Node
@@ -34,11 +35,40 @@ def _slice_xy(da: sc.DataArray, xy: dict[str, dict[str, int]]) -> sc.DataArray:
34
35
  return da[y['dim'], y['value']][x['dim'], x['value']]
35
36
 
36
37
 
38
+ def _coord_to_centers(da: sc.DataArray, dim: str) -> sc.Variable:
39
+ coord = da.coords[dim]
40
+ if da.coords.is_edges(dim, dim=dim):
41
+ return sc.midpoints(coord, dim=dim)
42
+ return coord
43
+
44
+
45
+ def _mask_outside_polygon(
46
+ da: sc.DataArray, poly: dict[str, dict[str, sc.Variable]]
47
+ ) -> sc.DataArray:
48
+ from matplotlib.path import Path
49
+
50
+ xdim = poly['x']['dim']
51
+ ydim = poly['y']['dim']
52
+ x = _coord_to_centers(da, xdim)
53
+ y = _coord_to_centers(da, ydim)
54
+ vx = poly['x']['value'].to(unit=x.unit).values
55
+ vy = poly['y']['value'].to(unit=y.unit).values
56
+ verts = np.column_stack([vx, vy])
57
+ path = Path(verts)
58
+ xx = sc.broadcast(x, sizes={**x.sizes, **y.sizes})
59
+ yy = sc.broadcast(y, sizes={**x.sizes, **y.sizes})
60
+ points = np.column_stack([xx.values.ravel(), yy.values.ravel()])
61
+ inside = sc.array(
62
+ dims=yy.dims, values=path.contains_points(points).reshape(yy.shape)
63
+ )
64
+ return da.assign_masks(__inside_polygon=~inside).sum({*x.dims, *y.dims})
65
+
66
+
37
67
  def inspector(
38
68
  obj: Plottable,
39
69
  dim: str | None = None,
40
70
  *,
41
- aspect: Literal['auto', 'equal', None] = None,
71
+ aspect: Literal['auto', 'equal'] | None = None,
42
72
  autoscale: bool = True,
43
73
  cbar: bool = True,
44
74
  clabel: str | None = None,
@@ -49,17 +79,19 @@ def inspector(
49
79
  grid: bool = False,
50
80
  legend: bool | tuple[float, float] = True,
51
81
  logc: bool | None = None,
52
- logy: bool | None = None,
53
82
  mask_cmap: str = 'gray',
54
83
  mask_color: str = 'black',
84
+ mode: Literal['point', 'polygon'] = 'point',
55
85
  nan_color: str | None = None,
56
- norm: Literal['linear', 'log', None] = None,
86
+ norm: Literal['linear', 'log'] | None = None,
57
87
  operation: Literal['sum', 'mean', 'min', 'max'] = 'sum',
58
88
  orientation: Literal['horizontal', 'vertical'] = 'horizontal',
59
89
  title: str | None = None,
60
90
  vmax: sc.Variable | float | None = None,
61
91
  vmin: sc.Variable | float | None = None,
62
92
  xlabel: str | None = None,
93
+ xmax: sc.Variable | float | None = None,
94
+ xmin: sc.Variable | float | None = None,
63
95
  ylabel: str | None = None,
64
96
  ymax: sc.Variable | float | None = None,
65
97
  ymin: sc.Variable | float | None = None,
@@ -69,16 +101,29 @@ def inspector(
69
101
  Inspector takes in a three-dimensional input and applies a reduction operation
70
102
  (``'sum'`` by default) along one of the dimensions specified by ``dim``.
71
103
  It displays the result as a two-dimensional image.
72
- In addition, an 'inspection' tool is available in the toolbar which allows to place
73
- markers on the image which perform slicing at that position to retain only the third
74
- dimension and displays the resulting one-dimensional slice on the right hand side
75
- figure.
76
-
77
- Controls:
78
- - Click to make new point
79
- - Drag existing point to move it
104
+ In addition, an 'inspection' tool is available in the toolbar. In ``mode='point'``
105
+ it allows placing point markers on the image to slice at that position, retaining
106
+ only the third dimension and displaying the resulting one-dimensional slice in the
107
+ right-hand side figure. In ``mode='polygon'`` it allows drawing a polygon to compute
108
+ the total intensity inside the polygon as a function of the third dimension.
109
+
110
+ Controls (point mode):
111
+ - Left-click to make new points
112
+ - Left-click and hold on point to move point
80
113
  - Middle-click to delete point
81
114
 
115
+ Controls (polygon mode):
116
+ - Left-click to make new polygons
117
+ - Left-click and hold on polygon vertex to move vertex
118
+ - Right-click and hold to drag/move the entire polygon
119
+ - Middle-click to delete polygon
120
+
121
+ Notes
122
+ -----
123
+
124
+ Almost all the arguments for plot customization apply to the two-dimensional image
125
+ (unless specified).
126
+
82
127
  Parameters
83
128
  ----------
84
129
  obj:
@@ -93,13 +138,13 @@ def inspector(
93
138
  autoscale:
94
139
  Automatically scale the axes/colormap on updates if ``True``.
95
140
  cbar:
96
- Show colorbar if ``True`` (2d figure).
141
+ Show colorbar if ``True``.
97
142
  clabel:
98
- Label for colorscale (2d figure).
143
+ Label for colorscale.
99
144
  cmax:
100
- Upper limit for colorscale (2d figure).
145
+ Upper limit for colorscale.
101
146
  cmin:
102
- Lower limit for colorscale (2d figure).
147
+ Lower limit for colorscale.
103
148
  errorbars:
104
149
  Show errorbars if ``True`` (1d figure).
105
150
  figsize:
@@ -111,18 +156,18 @@ def inspector(
111
156
  ``(x, y)`` coordinates of the legend's anchor point in axes coordinates
112
157
  (1d figure).
113
158
  logc:
114
- If ``True``, use logarithmic scale for colorscale (2d figure).
115
- logy:
116
- If ``True``, use logarithmic scale for y-axis (1d figure).
159
+ If ``True``, use logarithmic scale for colorscale.
117
160
  mask_cmap:
118
- Colormap to use for masks in 2d figure.
161
+ Colormap to use for masks.
119
162
  mask_color:
120
163
  Color of masks (overrides ``mask_cmap``).
164
+ mode:
165
+ Select ``'point'`` for point inspection or ``'polygon'`` for polygon selection
166
+ with total intensity inside the polygon plotted as a function of ``dim``.
121
167
  nan_color:
122
- Color to use for NaN values in 2d figure.
168
+ Color to use for NaN values.
123
169
  norm:
124
- Set to ``'log'`` for a logarithmic y-axis (1d figure) or logarithmic colorscale
125
- (2d figure). Legacy, prefer ``logy`` and ``logc`` instead.
170
+ Set to ``'log'`` for a logarithmic colorscale. Legacy, prefer ``logc`` instead.
126
171
  operation:
127
172
  The operation to apply along the third (undisplayed) dimension specified by
128
173
  ``dim``.
@@ -132,15 +177,19 @@ def inspector(
132
177
  title:
133
178
  The figure title.
134
179
  vmax:
135
- Upper limit for data to be displayed (y-axis for 1d figure, colorscale for
136
- 2d figure). Legacy, prefer ``ymax`` and ``cmax`` instead.
180
+ Upper limit for data colorscale to be displayed.
181
+ Legacy, prefer ``cmax`` instead.
137
182
  vmin:
138
- Lower limit for data to be displayed (y-axis for 1d figure, colorscale for
139
- 2d figure). Legacy, prefer ``ymin`` and ``cmin`` instead.
183
+ Lower limit for data colorscale to be displayed.
184
+ Legacy, prefer ``cmin`` instead.
140
185
  xlabel:
141
- Label for x-axis (2d figure).
186
+ Label for x-axis.
187
+ xmax:
188
+ Upper limit for x-axis (1d figure)
189
+ xmin:
190
+ Lower limit for x-axis (1d figure)
142
191
  ylabel:
143
- Label for y-axis (2d figure).
192
+ Label for y-axis.
144
193
  ymax:
145
194
  Upper limit for y-axis (1d figure).
146
195
  ymin:
@@ -159,11 +208,9 @@ def inspector(
159
208
  errorbars=errorbars,
160
209
  grid=grid,
161
210
  legend=legend,
162
- logy=logy,
163
211
  mask_color=mask_color,
164
- norm=norm,
165
- vmax=vmax,
166
- vmin=vmin,
212
+ xmax=xmax,
213
+ xmin=xmin,
167
214
  ymax=ymax,
168
215
  ymin=ymin,
169
216
  )
@@ -190,6 +237,7 @@ def inspector(
190
237
  figsize=figsize,
191
238
  grid=grid,
192
239
  logc=logc,
240
+ mask_cmap=mask_cmap,
193
241
  mask_color=mask_color,
194
242
  nan_color=nan_color,
195
243
  norm=norm,
@@ -198,21 +246,30 @@ def inspector(
198
246
  vmin=vmin,
199
247
  xlabel=xlabel,
200
248
  ylabel=ylabel,
201
- ymax=ymax,
202
- ymin=ymin,
203
249
  **kwargs,
204
250
  )
251
+ from ..widgets import Box, PointsTool, PolygonTool
205
252
 
206
- from ..widgets import Box, PointsTool
253
+ if mode == 'point':
254
+ tool = PointsTool(
255
+ figure=f2d,
256
+ input_node=bin_edges_node,
257
+ func=_slice_xy,
258
+ destination=f1d,
259
+ tooltip="Activate inspector tool",
260
+ )
261
+ elif mode == 'polygon':
262
+ tool = PolygonTool(
263
+ figure=f2d,
264
+ input_node=bin_edges_node,
265
+ func=_mask_outside_polygon,
266
+ destination=f1d,
267
+ tooltip="Activate polygon inspector tool",
268
+ )
269
+ else:
270
+ raise ValueError(f'Mode "{mode}" is unknown.')
207
271
 
208
- pts = PointsTool(
209
- figure=f2d,
210
- input_node=bin_edges_node,
211
- func=_slice_xy,
212
- destination=f1d,
213
- tooltip="Activate inspector tool",
214
- )
215
- f2d.toolbar['inspect'] = pts
272
+ f2d.toolbar['inspect'] = tool
216
273
  out = [f2d, f1d]
217
274
  if orientation == 'horizontal':
218
275
  out = [out]
@@ -53,7 +53,7 @@ def mesh3d(
53
53
  figsize: tuple[int, int] = (600, 400),
54
54
  logc: bool | None = None,
55
55
  nan_color: str | None = None,
56
- norm: Literal['linear', 'log', None] = None,
56
+ norm: Literal['linear', 'log'] | None = None,
57
57
  title: str | None = None,
58
58
  vmax: sc.Variable | float = None,
59
59
  vmin: sc.Variable | float = None,
@@ -19,7 +19,7 @@ from .common import (
19
19
  def plot(
20
20
  obj: PlottableMulti,
21
21
  *,
22
- aspect: Literal['auto', 'equal', None] = None,
22
+ aspect: Literal['auto', 'equal'] | None = None,
23
23
  autoscale: bool = True,
24
24
  cbar: bool = True,
25
25
  clabel: str | None = None,
@@ -38,7 +38,7 @@ def plot(
38
38
  mask_cmap: str = 'gray',
39
39
  mask_color: str | None = None,
40
40
  nan_color: str | None = None,
41
- norm: Literal['linear', 'log', None] = None,
41
+ norm: Literal['linear', 'log'] | None = None,
42
42
  scale: dict[str, str] | None = None,
43
43
  title: str | None = None,
44
44
  vmax: sc.Variable | float | None = None,
@@ -46,9 +46,9 @@ def scatter(
46
46
  x: str = 'x',
47
47
  y: str = 'y',
48
48
  pos: str | None = None,
49
- aspect: Literal['auto', 'equal', None] = None,
49
+ aspect: Literal['auto', 'equal'] | None = None,
50
50
  autoscale: bool = True,
51
- cbar: bool = True,
51
+ cbar: bool = False,
52
52
  clabel: str | None = None,
53
53
  cmap: str = 'viridis',
54
54
  cmax: sc.Variable | float | None = None,
@@ -62,7 +62,7 @@ def scatter(
62
62
  logy: bool | None = None,
63
63
  mask_color: str = 'black',
64
64
  nan_color: str | None = None,
65
- norm: Literal['linear', 'log', None] = None,
65
+ norm: Literal['linear', 'log'] | None = None,
66
66
  scale: dict[str, str] | None = None,
67
67
  size: str | float | None = None,
68
68
  title: str | None = None,