plopp 25.6.0__tar.gz → 25.6.1__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 (231) hide show
  1. {plopp-25.6.0 → plopp-25.6.1}/PKG-INFO +1 -1
  2. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/graphicalview.py +1 -1
  3. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/common.py +113 -74
  4. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/xyplot.py +11 -4
  5. {plopp-25.6.0 → plopp-25.6.1}/src/plopp.egg-info/PKG-INFO +1 -1
  6. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/plot_2d_test.py +35 -3
  7. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/xyplot_test.py +13 -5
  8. {plopp-25.6.0 → plopp-25.6.1}/.copier-answers.yml +0 -0
  9. {plopp-25.6.0 → plopp-25.6.1}/.github/dependabot.yml +0 -0
  10. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/ci.yml +0 -0
  11. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/docs.yml +0 -0
  12. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/nightly_at_main.yml +0 -0
  13. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/nightly_at_release.yml +0 -0
  14. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/python-version-ci +0 -0
  15. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/release.yml +0 -0
  16. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/test.yml +0 -0
  17. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/unpinned.yml +0 -0
  18. {plopp-25.6.0 → plopp-25.6.1}/.github/workflows/weekly_windows_macos.yml +0 -0
  19. {plopp-25.6.0 → plopp-25.6.1}/.gitignore +0 -0
  20. {plopp-25.6.0 → plopp-25.6.1}/.pre-commit-config.yaml +0 -0
  21. {plopp-25.6.0 → plopp-25.6.1}/.python-version +0 -0
  22. {plopp-25.6.0 → plopp-25.6.1}/CODE_OF_CONDUCT.md +0 -0
  23. {plopp-25.6.0 → plopp-25.6.1}/CONTRIBUTING.md +0 -0
  24. {plopp-25.6.0 → plopp-25.6.1}/LICENSE +0 -0
  25. {plopp-25.6.0 → plopp-25.6.1}/MANIFEST.in +0 -0
  26. {plopp-25.6.0 → plopp-25.6.1}/README.md +0 -0
  27. {plopp-25.6.0 → plopp-25.6.1}/conda/meta.yaml +0 -0
  28. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/anaconda-icon.js +0 -0
  29. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/circle-exclamation.svg +0 -0
  30. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/custom.css +0 -0
  31. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/customization/custom-interfaces.png +0 -0
  32. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/customization/graph-node-tips.png +0 -0
  33. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/customization/subplots.png +0 -0
  34. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/customization/tweaking-figures.png +0 -0
  35. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/favicon.ico +0 -0
  36. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/gallery/README.txt +0 -0
  37. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/gallery/peeling-layers-thumbnail.png +0 -0
  38. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/gallery/scatter3d-with-slider-thumbnail.png +0 -0
  39. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/gallery/scatter3d-with-threshold-thumbnail.png +0 -0
  40. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/logo-dark.svg +0 -0
  41. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/logo-large-dark.svg +0 -0
  42. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/logo-large.svg +0 -0
  43. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/logo.svg +0 -0
  44. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/image-plot.png +0 -0
  45. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/inspector-plot.png +0 -0
  46. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/line-plot.png +0 -0
  47. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/mesh3d-plot.png +0 -0
  48. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/scatter-plot.png +0 -0
  49. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/scatter3d-plot.png +0 -0
  50. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/slicer-plot.png +0 -0
  51. {plopp-25.6.0 → plopp-25.6.1}/docs/_static/plotting/super-plot.png +0 -0
  52. {plopp-25.6.0 → plopp-25.6.1}/docs/_templates/class-template.rst +0 -0
  53. {plopp-25.6.0 → plopp-25.6.1}/docs/_templates/doc_version.html +0 -0
  54. {plopp-25.6.0 → plopp-25.6.1}/docs/_templates/module-template.rst +0 -0
  55. {plopp-25.6.0 → plopp-25.6.1}/docs/_templates/scipp-class-template.rst +0 -0
  56. {plopp-25.6.0 → plopp-25.6.1}/docs/_templates/scipp-module-template.rst +0 -0
  57. {plopp-25.6.0 → plopp-25.6.1}/docs/about/index.md +0 -0
  58. {plopp-25.6.0 → plopp-25.6.1}/docs/api-reference/index.md +0 -0
  59. {plopp-25.6.0 → plopp-25.6.1}/docs/api-reference/matplotlib.md +0 -0
  60. {plopp-25.6.0 → plopp-25.6.1}/docs/api-reference/plotly.md +0 -0
  61. {plopp-25.6.0 → plopp-25.6.1}/docs/api-reference/pythreejs.md +0 -0
  62. {plopp-25.6.0 → plopp-25.6.1}/docs/conf.py +0 -0
  63. {plopp-25.6.0 → plopp-25.6.1}/docs/customization/custom-interfaces.ipynb +0 -0
  64. {plopp-25.6.0 → plopp-25.6.1}/docs/customization/graph-node-tips.ipynb +0 -0
  65. {plopp-25.6.0 → plopp-25.6.1}/docs/customization/index.md +0 -0
  66. {plopp-25.6.0 → plopp-25.6.1}/docs/customization/subplots.ipynb +0 -0
  67. {plopp-25.6.0 → plopp-25.6.1}/docs/customization/tweaking-figures.ipynb +0 -0
  68. {plopp-25.6.0 → plopp-25.6.1}/docs/developer/coding-conventions.md +0 -0
  69. {plopp-25.6.0 → plopp-25.6.1}/docs/developer/dependency-management.md +0 -0
  70. {plopp-25.6.0 → plopp-25.6.1}/docs/developer/getting-started.md +0 -0
  71. {plopp-25.6.0 → plopp-25.6.1}/docs/developer/index.md +0 -0
  72. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/index.ipynb +0 -0
  73. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/interactive-masking.ipynb +0 -0
  74. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/masking-a-range.ipynb +0 -0
  75. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/nyc-taxi.ipynb +0 -0
  76. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/peeling-layers.ipynb +0 -0
  77. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/polar-plots.ipynb +0 -0
  78. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/rectangle-selection.ipynb +0 -0
  79. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/scatter3d-with-slider.ipynb +0 -0
  80. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/scatter3d-with-threshold.ipynb +0 -0
  81. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/streaming-plot.ipynb +0 -0
  82. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/tiled-random-samples.ipynb +0 -0
  83. {plopp-25.6.0 → plopp-25.6.1}/docs/gallery/updating-scatter.ipynb +0 -0
  84. {plopp-25.6.0 → plopp-25.6.1}/docs/getting-started/index.md +0 -0
  85. {plopp-25.6.0 → plopp-25.6.1}/docs/getting-started/installation.md +0 -0
  86. {plopp-25.6.0 → plopp-25.6.1}/docs/getting-started/numpy-pandas-xarray.ipynb +0 -0
  87. {plopp-25.6.0 → plopp-25.6.1}/docs/getting-started/overview.ipynb +0 -0
  88. {plopp-25.6.0 → plopp-25.6.1}/docs/getting-started/saving-figures.ipynb +0 -0
  89. {plopp-25.6.0 → plopp-25.6.1}/docs/index.md +0 -0
  90. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/image-plot.ipynb +0 -0
  91. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/index.md +0 -0
  92. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/inspector-plot.ipynb +0 -0
  93. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/line-plot.ipynb +0 -0
  94. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/mesh3d-plot.ipynb +0 -0
  95. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/scatter-plot.ipynb +0 -0
  96. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/scatter3d-plot.ipynb +0 -0
  97. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/slicer-plot.ipynb +0 -0
  98. {plopp-25.6.0 → plopp-25.6.1}/docs/plotting/super-plot.ipynb +0 -0
  99. {plopp-25.6.0 → plopp-25.6.1}/pyproject.toml +0 -0
  100. {plopp-25.6.0 → plopp-25.6.1}/requirements/base.in +0 -0
  101. {plopp-25.6.0 → plopp-25.6.1}/requirements/base.txt +0 -0
  102. {plopp-25.6.0 → plopp-25.6.1}/requirements/basetest.in +0 -0
  103. {plopp-25.6.0 → plopp-25.6.1}/requirements/basetest.txt +0 -0
  104. {plopp-25.6.0 → plopp-25.6.1}/requirements/ci.in +0 -0
  105. {plopp-25.6.0 → plopp-25.6.1}/requirements/ci.txt +0 -0
  106. {plopp-25.6.0 → plopp-25.6.1}/requirements/dev.in +0 -0
  107. {plopp-25.6.0 → plopp-25.6.1}/requirements/dev.txt +0 -0
  108. {plopp-25.6.0 → plopp-25.6.1}/requirements/docs.in +0 -0
  109. {plopp-25.6.0 → plopp-25.6.1}/requirements/docs.txt +0 -0
  110. {plopp-25.6.0 → plopp-25.6.1}/requirements/make_base.py +0 -0
  111. {plopp-25.6.0 → plopp-25.6.1}/requirements/mini.in +0 -0
  112. {plopp-25.6.0 → plopp-25.6.1}/requirements/mini.txt +0 -0
  113. {plopp-25.6.0 → plopp-25.6.1}/requirements/mypy.in +0 -0
  114. {plopp-25.6.0 → plopp-25.6.1}/requirements/mypy.txt +0 -0
  115. {plopp-25.6.0 → plopp-25.6.1}/requirements/nightly.in +0 -0
  116. {plopp-25.6.0 → plopp-25.6.1}/requirements/nightly.txt +0 -0
  117. {plopp-25.6.0 → plopp-25.6.1}/requirements/noplotly.in +0 -0
  118. {plopp-25.6.0 → plopp-25.6.1}/requirements/noplotly.txt +0 -0
  119. {plopp-25.6.0 → plopp-25.6.1}/requirements/static.in +0 -0
  120. {plopp-25.6.0 → plopp-25.6.1}/requirements/static.txt +0 -0
  121. {plopp-25.6.0 → plopp-25.6.1}/requirements/test.in +0 -0
  122. {plopp-25.6.0 → plopp-25.6.1}/requirements/test.txt +0 -0
  123. {plopp-25.6.0 → plopp-25.6.1}/requirements/wheels.in +0 -0
  124. {plopp-25.6.0 → plopp-25.6.1}/requirements/wheels.txt +0 -0
  125. {plopp-25.6.0 → plopp-25.6.1}/resources/logo-plopp-2022.svg +0 -0
  126. {plopp-25.6.0 → plopp-25.6.1}/setup.cfg +0 -0
  127. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/__init__.py +0 -0
  128. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/__init__.py +0 -0
  129. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/common.py +0 -0
  130. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/__init__.py +0 -0
  131. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/canvas.py +0 -0
  132. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/fast_image.py +0 -0
  133. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/figure.py +0 -0
  134. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/image.py +0 -0
  135. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/line.py +0 -0
  136. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/mesh_image.py +0 -0
  137. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/scatter.py +0 -0
  138. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/tiled.py +0 -0
  139. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/matplotlib/utils.py +0 -0
  140. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/plotly/__init__.py +0 -0
  141. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/plotly/canvas.py +0 -0
  142. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/plotly/figure.py +0 -0
  143. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/plotly/line.py +0 -0
  144. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/__init__.py +0 -0
  145. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/canvas.py +0 -0
  146. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/figure.py +0 -0
  147. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/mesh3d.py +0 -0
  148. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/outline.py +0 -0
  149. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/backends/pythreejs/scatter3d.py +0 -0
  150. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/__init__.py +0 -0
  151. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/__init__.pyi +0 -0
  152. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/graph.py +0 -0
  153. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/helpers.py +0 -0
  154. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/limits.py +0 -0
  155. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/node_class.py +0 -0
  156. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/typing.py +0 -0
  157. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/utils.py +0 -0
  158. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/core/view.py +0 -0
  159. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/data/__init__.py +0 -0
  160. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/data/examples.py +0 -0
  161. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/data/factory.py +0 -0
  162. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/data/testing.py +0 -0
  163. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/__init__.py +0 -0
  164. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/__init__.pyi +0 -0
  165. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/basefig.py +0 -0
  166. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/bbox.py +0 -0
  167. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/camera.py +0 -0
  168. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/colormapper.py +0 -0
  169. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/figures.py +0 -0
  170. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/graphics/tiled.py +0 -0
  171. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/__init__.py +0 -0
  172. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/__init__.pyi +0 -0
  173. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/inspector.py +0 -0
  174. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/mesh3d.py +0 -0
  175. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/plot.py +0 -0
  176. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/scatter.py +0 -0
  177. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/scatter3d.py +0 -0
  178. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/slicer.py +0 -0
  179. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/plotting/superplot.py +0 -0
  180. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/py.typed +0 -0
  181. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/utils.py +0 -0
  182. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/__init__.py +0 -0
  183. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/__init__.pyi +0 -0
  184. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/box.py +0 -0
  185. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/checkboxes.py +0 -0
  186. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/clip3d.py +0 -0
  187. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/debounce.py +0 -0
  188. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/drawing.py +0 -0
  189. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/linesave.py +0 -0
  190. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/slice.py +0 -0
  191. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/style.py +0 -0
  192. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/toolbar.py +0 -0
  193. {plopp-25.6.0 → plopp-25.6.1}/src/plopp/widgets/tools.py +0 -0
  194. {plopp-25.6.0 → plopp-25.6.1}/src/plopp.egg-info/SOURCES.txt +0 -0
  195. {plopp-25.6.0 → plopp-25.6.1}/src/plopp.egg-info/dependency_links.txt +0 -0
  196. {plopp-25.6.0 → plopp-25.6.1}/src/plopp.egg-info/requires.txt +0 -0
  197. {plopp-25.6.0 → plopp-25.6.1}/src/plopp.egg-info/top_level.txt +0 -0
  198. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/matplotlib/mpl_image_test.py +0 -0
  199. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/matplotlib/mpl_line_test.py +0 -0
  200. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/matplotlib/mpl_plot_test.py +0 -0
  201. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/matplotlib/mpl_scatter_test.py +0 -0
  202. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/matplotlib/mpl_tiled_test.py +0 -0
  203. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/plotly/conftest.py +0 -0
  204. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/plotly/plotly_line_test.py +0 -0
  205. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/pythreejs/pythreejs_canvas_test.py +0 -0
  206. {plopp-25.6.0 → plopp-25.6.1}/tests/backends/pythreejs/pythreejs_scatter3d_test.py +0 -0
  207. {plopp-25.6.0 → plopp-25.6.1}/tests/conftest.py +0 -0
  208. {plopp-25.6.0 → plopp-25.6.1}/tests/core/graph_test.py +0 -0
  209. {plopp-25.6.0 → plopp-25.6.1}/tests/core/limits_test.py +0 -0
  210. {plopp-25.6.0 → plopp-25.6.1}/tests/core/node_test.py +0 -0
  211. {plopp-25.6.0 → plopp-25.6.1}/tests/core/utils_test.py +0 -0
  212. {plopp-25.6.0 → plopp-25.6.1}/tests/graphics/artists_test.py +0 -0
  213. {plopp-25.6.0 → plopp-25.6.1}/tests/graphics/canvas_test.py +0 -0
  214. {plopp-25.6.0 → plopp-25.6.1}/tests/graphics/colormapper_test.py +0 -0
  215. {plopp-25.6.0 → plopp-25.6.1}/tests/graphics/figures_test.py +0 -0
  216. {plopp-25.6.0 → plopp-25.6.1}/tests/high_level_test.py +0 -0
  217. {plopp-25.6.0 → plopp-25.6.1}/tests/minimal_plot_test.py +0 -0
  218. {plopp-25.6.0 → plopp-25.6.1}/tests/package_test.py +0 -0
  219. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/common_test.py +0 -0
  220. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/inspector_test.py +0 -0
  221. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/mesh3d_test.py +0 -0
  222. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/plot_1d_test.py +0 -0
  223. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/scatter3d_test.py +0 -0
  224. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/scatter_test.py +0 -0
  225. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/slicer_test.py +0 -0
  226. {plopp-25.6.0 → plopp-25.6.1}/tests/plotting/superplot_test.py +0 -0
  227. {plopp-25.6.0 → plopp-25.6.1}/tests/widgets/box_test.py +0 -0
  228. {plopp-25.6.0 → plopp-25.6.1}/tests/widgets/checkboxes_test.py +0 -0
  229. {plopp-25.6.0 → plopp-25.6.1}/tests/widgets/clip3d_test.py +0 -0
  230. {plopp-25.6.0 → plopp-25.6.1}/tests/widgets/slice_test.py +0 -0
  231. {plopp-25.6.0 → plopp-25.6.1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plopp
3
- Version: 25.6.0
3
+ Version: 25.6.1
4
4
  Summary: Visualization library for Scipp
5
5
  Author: Scipp contributors
6
6
  License: BSD 3-Clause License
@@ -59,7 +59,7 @@ class GraphicalView(View):
59
59
  title: str | None = None,
60
60
  figsize: tuple[float, float] | None = None,
61
61
  format: Literal['svg', 'png'] | None = None,
62
- legend: bool | tuple[float, float] = False,
62
+ legend: bool | tuple[float, float] = True,
63
63
  camera: Camera | None = None,
64
64
  autoscale: bool = True,
65
65
  ax: Any = None,
@@ -76,64 +76,28 @@ def to_variable(obj) -> sc.Variable:
76
76
  return out
77
77
 
78
78
 
79
- def _ensure_data_array_coords(
80
- da: sc.DataArray, coords: list[str] | None
81
- ) -> sc.DataArray:
82
- if coords is None:
83
- coords = list(da.dims)
84
- elif missing := set(coords) - set(da.coords.keys()):
85
- raise ValueError(f"Specified coords do not exist: {missing}")
86
-
87
- # Remove unused coords
88
- da = da.drop_coords(list(set(da.coords) - set(coords)))
89
- # Assign dim coords where missing. The above checks ensure that all missing
90
- # coords are dim coords, i.e., that `name in out.dims`.
91
- da = da.assign_coords(
92
- {
93
- name: sc.arange(name, da.sizes[name], unit=None)
94
- for name in set(coords) - set(da.coords)
95
- }
96
- )
97
- return da
98
-
99
-
100
- def to_data_array(
101
- obj: Plottable | list,
102
- coords: list[str] | None = None,
103
- ) -> sc.DataArray:
79
+ def to_data_array(obj: Plottable | list) -> sc.DataArray:
104
80
  """
105
- Convert an input to a DataArray, potentially adding fake coordinates if they are
106
- missing.
81
+ Convert an input to a DataArray.
82
+ Returns a shallow copy of the input if it is already a DataArray.
107
83
 
108
84
  Parameters
109
85
  ----------
110
86
  obj:
111
87
  The input object to be converted.
112
- coords:
113
- If supplied, use these coords instead of the input's dimension coordinates.
114
88
  """
89
+ if isinstance(obj, sc.DataArray):
90
+ return obj.copy(deep=False)
115
91
  out = _maybe_to_variable(obj)
116
92
  if isinstance(out, sc.Variable):
117
93
  out = sc.DataArray(data=out)
118
94
  out = from_compatible_lib(out)
119
95
  if not isinstance(out, sc.DataArray):
120
96
  raise TypeError(f"Cannot convert input of type {type(obj)} to a DataArray.")
121
- out = _ensure_data_array_coords(out, coords)
122
- for name, coord in out.coords.items():
123
- if not coord.dims:
124
- raise ValueError(
125
- "Input data cannot be plotted: it has a scalar coordinate along "
126
- f"dimension {name}. Consider dropping this coordinate before plotting. "
127
- f"Use ``data.drop_coords('{name}').plot()``."
128
- )
129
- for name in out.coords:
130
- other_dims = [dim for dim in out.coords[name].dims if dim not in out.dims]
131
- for dim in other_dims:
132
- out.coords[name] = out.coords[name].mean(dim)
133
97
  return out
134
98
 
135
99
 
136
- def _check_size(da: sc.DataArray):
100
+ def _check_size(da: sc.DataArray) -> None:
137
101
  """
138
102
  Prevent slow figure rendering by raising an error if the data array exceeds a
139
103
  default size.
@@ -149,7 +113,7 @@ def _check_size(da: sc.DataArray):
149
113
  )
150
114
 
151
115
 
152
- def check_not_binned(da: sc.DataArray):
116
+ def check_not_binned(da: sc.DataArray) -> None:
153
117
  """
154
118
  Plopp cannot plot binned data.
155
119
  This function will raise an error if the input data is binned.
@@ -169,7 +133,7 @@ def check_not_binned(da: sc.DataArray):
169
133
  )
170
134
 
171
135
 
172
- def check_allowed_dtypes(da: sc.DataArray):
136
+ def check_allowed_dtypes(da: sc.DataArray) -> None:
173
137
  """
174
138
  Currently, Plopp cannot plot data that contains vector and matrix dtypes.
175
139
  This function will raise an error if the input data type is not supported.
@@ -185,10 +149,108 @@ def check_allowed_dtypes(da: sc.DataArray):
185
149
  )
186
150
 
187
151
 
188
- def _all_dims_sorted(var, order='ascending'):
152
+ def _all_dims_sorted(var, order='ascending') -> bool:
153
+ """
154
+ Check if all dimensions of a variable are sorted in the specified order.
155
+ This is used to ensure that the coordinates are sorted before plotting.
156
+ """
189
157
  return all(sc.allsorted(var, dim, order=order) for dim in var.dims)
190
158
 
191
159
 
160
+ def _rename_dims_from_coords(da: sc.DataArray, coords: Iterable[str]) -> sc.DataArray:
161
+ """
162
+ If coordinates are provided, rename the dimensions of the data array to match the
163
+ names of the coordinates, so that they effectively become the dimension coordinates.
164
+ """
165
+ renamed_dims = {}
166
+ underlying_dims = set()
167
+ for dim in coords:
168
+ underlying = da.coords[dim].dims[-1]
169
+ if underlying in underlying_dims:
170
+ raise ValueError(
171
+ "coords: Cannot use more than one coordinate associated with "
172
+ f"the same underlying dimension ({underlying})."
173
+ )
174
+ renamed_dims[underlying] = dim
175
+ underlying_dims.add(underlying)
176
+ return da.rename_dims(**renamed_dims)
177
+
178
+
179
+ def _add_missing_dimension_coords(da: sc.DataArray) -> sc.DataArray:
180
+ """
181
+ Add missing dimension coordinates to the data array.
182
+ If a dimension does not have a coordinate, it will be added with a range of values.
183
+ """
184
+ return da.assign_coords(
185
+ {
186
+ dim: sc.arange(dim, da.sizes[dim], unit=None)
187
+ for dim in da.dims
188
+ if dim not in da.coords
189
+ }
190
+ )
191
+
192
+
193
+ def _drop_non_dimension_coords(da: sc.DataArray) -> sc.DataArray:
194
+ """
195
+ Drop all coordinates that are not dimension coordinates.
196
+ This is useful to ensure that only the coordinates that are actually used for
197
+ plotting are kept.
198
+ """
199
+ return da.drop_coords([name for name in da.coords if name not in da.dims])
200
+
201
+
202
+ def _handle_coords_with_left_over_dimensions(da: sc.DataArray) -> sc.DataArray:
203
+ """
204
+ In some rare cases, the coordinate may have dimensions that are not present in the
205
+ data array. This can happen for example when a 2d coord with bin edges is sliced
206
+ along one dimension, leaving a coordinate with the other dimension, and a dimension
207
+ of length 2 (because of the bin edges) in th sliced dimension.
208
+
209
+ This function will handle such cases by averaging the coordinate over the left-over
210
+ dimensions, effectively reducing the coordinate to a single value for each
211
+ dimension that is not present in the data array.
212
+ """
213
+ return da.assign_coords(
214
+ {
215
+ name: da.coords[name].mean(
216
+ [dim for dim in da.coords[name].dims if dim not in da.dims]
217
+ )
218
+ for name in da.coords
219
+ }
220
+ )
221
+
222
+
223
+ def _check_coord_sanity(da: sc.DataArray) -> None:
224
+ """
225
+ Warn if any coordinate is not sorted. This can lead to unpredictable results
226
+ when plotting.
227
+ Also, raise an error if any coordinate is scalar.
228
+ """
229
+ for name, coord in da.coords.items():
230
+ try:
231
+ if not (
232
+ _all_dims_sorted(coord, order='ascending')
233
+ or _all_dims_sorted(coord, order='descending')
234
+ ):
235
+ warnings.warn(
236
+ 'The input contains a coordinate with unsorted values '
237
+ f'({name}). The results may be unpredictable. '
238
+ 'Coordinates can be sorted using '
239
+ '`scipp.sort(data, dim="to_be_sorted", order="ascending")`.',
240
+ RuntimeWarning,
241
+ stacklevel=2,
242
+ )
243
+ except sc.DTypeError:
244
+ pass
245
+
246
+ if not coord.dims:
247
+ raise ValueError(
248
+ "Input data cannot be plotted: it has a scalar coordinate along "
249
+ f"dimension {name}. Consider dropping this coordinate before plotting. "
250
+ f"Use ``data.drop_coords('{name}').plot()``."
251
+ )
252
+
253
+
192
254
  def preprocess(
193
255
  obj: Plottable | list,
194
256
  name: str | None = None,
@@ -219,7 +281,7 @@ def preprocess(
219
281
  elif coords is not None:
220
282
  coords = list(coords)
221
283
 
222
- out = to_data_array(obj, coords)
284
+ out = to_data_array(obj)
223
285
  check_not_binned(out)
224
286
  check_allowed_dtypes(out)
225
287
  if name is not None:
@@ -227,34 +289,11 @@ def preprocess(
227
289
  if not ignore_size:
228
290
  _check_size(out)
229
291
  if coords is not None:
230
- renamed_dims = {}
231
- for dim in coords:
232
- underlying = out.coords[dim].dims[-1]
233
- if underlying in renamed_dims:
234
- raise ValueError(
235
- "coords: Cannot use more than one coordinate associated with "
236
- f"the same underlying dimension ({underlying})."
237
- )
238
- renamed_dims[underlying] = dim
239
- out = out.rename_dims(**renamed_dims)
240
- for n, coord in out.coords.items():
241
- if (coord.ndim == 0) or (n not in out.dims):
242
- continue
243
- try:
244
- if not (
245
- _all_dims_sorted(coord, order='ascending')
246
- or _all_dims_sorted(coord, order='descending')
247
- ):
248
- warnings.warn(
249
- 'The input contains a coordinate with unsorted values '
250
- f'({n}). The results may be unpredictable. '
251
- 'Coordinates can be sorted using '
252
- '`scipp.sort(data, dim="to_be_sorted", order="ascending")`.',
253
- RuntimeWarning,
254
- stacklevel=2,
255
- )
256
- except sc.DTypeError:
257
- pass
292
+ out = _rename_dims_from_coords(out, coords)
293
+ out = _add_missing_dimension_coords(out)
294
+ out = _drop_non_dimension_coords(out)
295
+ out = _handle_coords_with_left_over_dimensions(out)
296
+ _check_coord_sanity(out)
258
297
  return out
259
298
 
260
299
 
@@ -23,7 +23,17 @@ def _make_data_array(x: sc.Variable, y: sc.Variable) -> sc.DataArray:
23
23
  y:
24
24
  The variable to use as the data.
25
25
  """
26
- return sc.DataArray(data=y, coords={x.dim: x})
26
+ if x.ndim != 1 or y.ndim != 1:
27
+ raise sc.DimensionError(
28
+ f'Expected 1 dimension, got {x.ndim} for x and {y.ndim} for y.'
29
+ )
30
+ dim = x.dim
31
+ return sc.DataArray(
32
+ data=sc.array(dims=[dim], values=y.values, variances=y.variances, unit=y.unit)
33
+ if y.dim != dim
34
+ else y,
35
+ coords={dim: x},
36
+ )
27
37
 
28
38
 
29
39
  def xyplot(
@@ -48,7 +58,4 @@ def xyplot(
48
58
  """
49
59
  x = Node(to_variable, x)
50
60
  y = Node(to_variable, y)
51
- dim = x().dim
52
- if dim != y().dim:
53
- raise sc.DimensionError("Dimensions of x and y must match")
54
61
  return linefigure(Node(_make_data_array, x=x, y=y), **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plopp
3
- Version: 25.6.0
3
+ Version: 25.6.1
4
4
  Summary: Visualization library for Scipp
5
5
  Author: Scipp contributors
6
6
  License: BSD 3-Clause License
@@ -99,14 +99,46 @@ def test_use_non_dimension_coords(linspace):
99
99
  assert p.canvas.ymax == 3.3 * da.coords['yy'].max().value
100
100
 
101
101
 
102
- def test_use_two_coords_for_same_underlying_dimension_raises():
103
- da = data_array(ndim=2)
102
+ @pytest.mark.parametrize('linspace', [True, False])
103
+ def test_single_use_non_dimension_coords(linspace):
104
+ da = data_array(ndim=2, linspace=linspace)
105
+ da.coords['xx2'] = da.coords['xx'] ** 2
106
+ da.coords['yy2'] = da.coords['yy'] ** 2
107
+ p = pp.plot(da, coords=['xx2'])
108
+ assert p.canvas.dims['x'] == 'xx2'
109
+ assert p.canvas.dims['y'] == 'yy'
110
+
111
+
112
+ @pytest.mark.parametrize('linspace', [True, False])
113
+ def test_use_two_coords_for_same_underlying_dimension_raises(linspace):
114
+ da = data_array(ndim=2, linspace=linspace)
104
115
  da.coords['a'] = da.coords['xx'] * 2
116
+ da.coords['b'] = da.coords['xx'] * 2.5
105
117
  msg = "coords: Cannot use more than one coordinate"
106
118
  with pytest.raises(ValueError, match=msg):
107
- pp.plot(da, coords=['xx', 'a'])
119
+ pp.plot(da, coords=['a', 'b'])
120
+ with pytest.raises(ValueError, match=msg):
121
+ pp.plot(da, coords=['b', 'a'])
122
+
123
+
124
+ @pytest.mark.parametrize('linspace', [True, False])
125
+ def test_use_dimension_coord_in_coords_arg(linspace):
126
+ da = data_array(ndim=2, linspace=linspace)
127
+ p = pp.plot(da, coords=['xx'])
128
+ assert p.canvas.dims['x'] == 'xx'
129
+
130
+
131
+ @pytest.mark.parametrize('linspace', [True, False])
132
+ def test_use_dimension_coord_and_other_coord_for_same_underlying_dimension_raises(
133
+ linspace,
134
+ ):
135
+ da = data_array(ndim=2, linspace=linspace)
136
+ da.coords['a'] = da.coords['xx'] * 2
137
+ msg = "coords: Cannot use more than one coordinate"
108
138
  with pytest.raises(ValueError, match=msg):
109
139
  pp.plot(da, coords=['a', 'xx'])
140
+ with pytest.raises(ValueError, match=msg):
141
+ pp.plot(da, coords=['xx', 'a'])
110
142
 
111
143
 
112
144
  @pytest.mark.parametrize('ext', ['jpg', 'png', 'pdf', 'svg'])
@@ -18,6 +18,15 @@ def test_xyplot_variable():
18
18
  assert fig.canvas.ylabel == '[K]'
19
19
 
20
20
 
21
+ def test_xyplot_woth_variances():
22
+ x = sc.arange('time', 20.0, unit='s')
23
+ y = sc.arange('time', 100.0, 120.0, unit='K')
24
+ y.variances = y.values
25
+ fig = pp.xyplot(x, y)
26
+ [line] = fig.artists.values()
27
+ assert line._error is not None
28
+
29
+
21
30
  def test_xyplot_ndarray():
22
31
  N = 50
23
32
  x = np.arange(float(N))
@@ -31,11 +40,10 @@ def test_xyplot_list():
31
40
  pp.xyplot(x, y)
32
41
 
33
42
 
34
- def test_xyplot_different_dims_raises():
43
+ def test_xyplot_different_dims():
35
44
  x = sc.arange('x', 20.0, unit='s')
36
45
  y = sc.arange('y', 100.0, 120.0, unit='K')
37
- with pytest.raises(sc.DimensionError, match='Dimensions of x and y must match'):
38
- pp.xyplot(x, y)
46
+ pp.xyplot(x, y)
39
47
 
40
48
 
41
49
  def test_xyplot_data_array_raises():
@@ -50,9 +58,9 @@ def test_xyplot_data_array_raises():
50
58
  def test_xyplot_2d_variable_raises():
51
59
  x = sc.arange('x', 50.0, unit='s')
52
60
  y = pp.data.data2d().data
53
- with pytest.raises(sc.DimensionError, match='Expected 1 dimensions, got 2'):
61
+ with pytest.raises(sc.DimensionError, match='Expected 1 dimension'):
54
62
  pp.xyplot(x, y)
55
- with pytest.raises(sc.DimensionError, match='Expected 1 dimensions, got 2'):
63
+ with pytest.raises(sc.DimensionError, match='Expected 1 dimension'):
56
64
  pp.xyplot(y, x)
57
65
 
58
66
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes