PlotPy 2.9.0__tar.gz → 2.10.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 (552) hide show
  1. {plotpy-2.9.0 → plotpy-2.10.0}/PKG-INFO +2 -2
  2. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/PKG-INFO +2 -2
  3. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/SOURCES.txt +4 -0
  4. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/requires.txt +1 -1
  5. plotpy-2.10.0/doc/release_notes/release_2.10.md +34 -0
  6. {plotpy-2.9.0 → plotpy-2.10.0}/doc/requirements.rst +22 -16
  7. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/__init__.py +1 -1
  8. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/__init__.py +1 -0
  9. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/__init__.py +1 -0
  10. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/base.py +49 -0
  11. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/misc.py +89 -6
  12. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/standard.py +5 -28
  13. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/transform.py +5 -1
  14. plotpy-2.10.0/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
  15. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/plot/base.py +56 -0
  16. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/axes.py +24 -0
  17. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/base.py +5 -1
  18. plotpy-2.10.0/plotpy/tests/unit/test_autoscale_strategy.py +116 -0
  19. plotpy-2.10.0/plotpy/tests/unit/test_image_log_set_data.py +70 -0
  20. plotpy-2.10.0/plotpy/tests/unit/test_snapshot_original_size.py +169 -0
  21. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/curve.py +9 -9
  22. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/image.py +2 -3
  23. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/misc.py +34 -3
  24. {plotpy-2.9.0 → plotpy-2.10.0}/pyproject.toml +1 -1
  25. {plotpy-2.9.0 → plotpy-2.10.0}/requirements.txt +3 -2
  26. {plotpy-2.9.0 → plotpy-2.10.0}/src/histogram2d.c +249 -253
  27. {plotpy-2.9.0 → plotpy-2.10.0}/src/mandelbrot.c +248 -252
  28. plotpy-2.9.0/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
  29. {plotpy-2.9.0 → plotpy-2.10.0}/LICENSE +0 -0
  30. {plotpy-2.9.0 → plotpy-2.10.0}/MANIFEST.in +0 -0
  31. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/dependency_links.txt +0 -0
  32. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/entry_points.txt +0 -0
  33. {plotpy-2.9.0 → plotpy-2.10.0}/PlotPy.egg-info/top_level.txt +0 -0
  34. {plotpy-2.9.0 → plotpy-2.10.0}/README.md +0 -0
  35. {plotpy-2.9.0 → plotpy-2.10.0}/colormaps/README.md +0 -0
  36. {plotpy-2.9.0 → plotpy-2.10.0}/colormaps/_cm.py +0 -0
  37. {plotpy-2.9.0 → plotpy-2.10.0}/colormaps/colormap.py +0 -0
  38. {plotpy-2.9.0 → plotpy-2.10.0}/colormaps/matplotlib_cmaps.py +0 -0
  39. {plotpy-2.9.0 → plotpy-2.10.0}/doc/_static/favicon.ico +0 -0
  40. {plotpy-2.9.0 → plotpy-2.10.0}/doc/conf.py +0 -0
  41. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/build.rst +0 -0
  42. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/contribute.rst +0 -0
  43. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/gitworkflow.rst +0 -0
  44. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/guiqwt_to_plotpy.csv +0 -0
  45. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/guiqwt_to_plotpy.rst +0 -0
  46. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/index.rst +0 -0
  47. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/platforms.rst +0 -0
  48. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/v1_to_guidata_v3.csv +0 -0
  49. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/v1_to_v2.csv +0 -0
  50. {plotpy-2.9.0 → plotpy-2.10.0}/doc/dev/v1_to_v2.rst +0 -0
  51. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/colormapmanager.rst +0 -0
  52. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/events.rst +0 -0
  53. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/fit.rst +0 -0
  54. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/fliprotate.rst +0 -0
  55. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/imagefile.rst +0 -0
  56. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/index.rst +0 -0
  57. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/io.rst +0 -0
  58. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/items/builder.rst +0 -0
  59. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/items/examples.rst +0 -0
  60. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/items/index.rst +0 -0
  61. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/items/overview.rst +0 -0
  62. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/items/reference.rst +0 -0
  63. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/mathutils/colormaps.rst +0 -0
  64. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/mathutils/geometry.rst +0 -0
  65. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/mathutils/index.rst +0 -0
  66. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/mathutils/scaler.rst +0 -0
  67. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/panels/index.rst +0 -0
  68. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/panels/overview.rst +0 -0
  69. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/panels/reference.rst +0 -0
  70. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/plot/examples.rst +0 -0
  71. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/plot/index.rst +0 -0
  72. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/plot/overview.rst +0 -0
  73. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/plot/reference.rst +0 -0
  74. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/pyplot.rst +0 -0
  75. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/resizedialog.rst +0 -0
  76. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/rotatecrop.rst +0 -0
  77. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/selectdialog.rst +0 -0
  78. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/signals.rst +0 -0
  79. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/styles/index.rst +0 -0
  80. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/styles/overview.rst +0 -0
  81. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/styles/reference.rst +0 -0
  82. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/tools/examples.rst +0 -0
  83. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/tools/index.rst +0 -0
  84. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/tools/overview.rst +0 -0
  85. {plotpy-2.9.0 → plotpy-2.10.0}/doc/features/tools/reference.rst +0 -0
  86. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/my_plot_manager.png +0 -0
  87. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/my_plot_manager.svg +0 -0
  88. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/panorama-vertical.png +0 -0
  89. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/panorama-vertical.svg +0 -0
  90. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/panorama.png +0 -0
  91. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/panorama.svg +0 -0
  92. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/plot_widgets.png +0 -0
  93. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/plot_widgets.svg +0 -0
  94. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/plotpy-banner.png +0 -0
  95. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/plotpy-vertical.png +0 -0
  96. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/__init__.png +0 -0
  97. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/computations.png +0 -0
  98. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/contrast.png +0 -0
  99. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/cross_section.png +0 -0
  100. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/cross_section2.png +0 -0
  101. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/dotarraydemo.png +0 -0
  102. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/filtertest1.png +0 -0
  103. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/filtertest2.png +0 -0
  104. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/fit.png +0 -0
  105. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/get_point.png +0 -0
  106. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/hist2d.png +0 -0
  107. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/image_plot_tools.png +0 -0
  108. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/imagefilter.png +0 -0
  109. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/imagesuperp.png +0 -0
  110. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/imagexy.png +0 -0
  111. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/manager.png +0 -0
  112. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/mandelbrot.png +0 -0
  113. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/pcolor.png +0 -0
  114. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/plot.png +0 -0
  115. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/simple_dialog.png +0 -0
  116. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/simple_window.png +0 -0
  117. {plotpy-2.9.0 → plotpy-2.10.0}/doc/images/screenshots/transform.png +0 -0
  118. {plotpy-2.9.0 → plotpy-2.10.0}/doc/index.rst +0 -0
  119. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/examples.rst +0 -0
  120. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/index.rst +0 -0
  121. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/installation.rst +0 -0
  122. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/licenses.rst +0 -0
  123. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/motivation.rst +0 -0
  124. {plotpy-2.9.0 → plotpy-2.10.0}/doc/intro/overview.rst +0 -0
  125. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/index.rst +0 -0
  126. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.00.md +0 -0
  127. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.01.md +0 -0
  128. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.02.md +0 -0
  129. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.03.md +0 -0
  130. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.04.md +0 -0
  131. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.05.md +0 -0
  132. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.06.md +0 -0
  133. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.07.md +0 -0
  134. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.08.md +0 -0
  135. {plotpy-2.9.0 → plotpy-2.10.0}/doc/release_notes/release_2.09.md +0 -0
  136. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/__init__.py +0 -0
  137. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/annotation.py +0 -0
  138. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/curvemarker.py +0 -0
  139. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/image.py +0 -0
  140. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/label.py +0 -0
  141. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/plot.py +0 -0
  142. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/builder/shape.py +0 -0
  143. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/config.py +0 -0
  144. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/constants.py +0 -0
  145. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/coords.py +0 -0
  146. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/colormaps_default.json +0 -0
  147. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/apply.png +0 -0
  148. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/arredit.png +0 -0
  149. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/arrow_down.png +0 -0
  150. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/arrow_up.png +0 -0
  151. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/autorefresh.png +0 -0
  152. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/autoscale.png +0 -0
  153. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/axes.png +0 -0
  154. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/busy.png +0 -0
  155. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/cell_edit.png +0 -0
  156. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/center.png +0 -0
  157. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/cmap_edit.png +0 -0
  158. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/contrast.png +0 -0
  159. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/copy.png +0 -0
  160. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/copytoclipboard.png +0 -0
  161. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csapplylut.png +0 -0
  162. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csautoscale.png +0 -0
  163. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csection.png +0 -0
  164. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csection_a.png +0 -0
  165. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csection_line.png +0 -0
  166. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csection_oblique.png +0 -0
  167. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/csperimage.png +0 -0
  168. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curve_downsample.png +0 -0
  169. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvestyles/dots.png +0 -0
  170. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvestyles/lines.png +0 -0
  171. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvestyles/steps.png +0 -0
  172. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvestyles/sticks.png +0 -0
  173. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvetypes/xfy.png +0 -0
  174. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/curvetypes/yfx.png +0 -0
  175. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/delete.png +0 -0
  176. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/edit.png +0 -0
  177. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/edit_point_selection.png +0 -0
  178. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/edit.png +0 -0
  179. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/edit_add.png +0 -0
  180. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/editcopy.png +0 -0
  181. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/editdelete.png +0 -0
  182. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/editpaste.png +0 -0
  183. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/fileimport.png +0 -0
  184. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/filesave.png +0 -0
  185. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/imshow.png +0 -0
  186. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/insert.png +0 -0
  187. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/plot.png +0 -0
  188. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/editors/rename.png +0 -0
  189. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/eliminate_outliers.png +0 -0
  190. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/eraser.png +0 -0
  191. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/exit.png +0 -0
  192. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/expander_down.png +0 -0
  193. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/expander_right.png +0 -0
  194. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/export.png +0 -0
  195. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/file.png +0 -0
  196. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/fileclose.png +0 -0
  197. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/fileimport.png +0 -0
  198. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filenew.png +0 -0
  199. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/fileopen.png +0 -0
  200. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filesave.png +0 -0
  201. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filesaveas.png +0 -0
  202. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/doc.png +0 -0
  203. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/gif.png +0 -0
  204. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/html.png +0 -0
  205. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/jpg.png +0 -0
  206. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/pdf.png +0 -0
  207. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/png.png +0 -0
  208. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/pps.png +0 -0
  209. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/ps.png +0 -0
  210. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/tar.png +0 -0
  211. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/tgz.png +0 -0
  212. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/tif.png +0 -0
  213. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/txt.png +0 -0
  214. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/xls.png +0 -0
  215. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/filetypes/zip.png +0 -0
  216. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/font.png +0 -0
  217. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/full_range.png +0 -0
  218. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/funct.png +0 -0
  219. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/hcursor.png +0 -0
  220. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/hflip.png +0 -0
  221. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/imagestats.png +0 -0
  222. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/item_list.png +0 -0
  223. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/annotation.png +0 -0
  224. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/curve.png +0 -0
  225. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/errorbar.png +0 -0
  226. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/grid.png +0 -0
  227. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/histogram.png +0 -0
  228. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/histogram2d.png +0 -0
  229. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/image.png +0 -0
  230. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/label.png +0 -0
  231. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/legend.png +0 -0
  232. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/polygonmap.png +0 -0
  233. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/items/quiver.png +0 -0
  234. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/magnifier.png +0 -0
  235. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/cross.png +0 -0
  236. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/diamond.png +0 -0
  237. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/ellipse.png +0 -0
  238. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/hexagon.png +0 -0
  239. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/point.png +0 -0
  240. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/square.png +0 -0
  241. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/star.png +0 -0
  242. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/triangle_d.png +0 -0
  243. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/triangle_l.png +0 -0
  244. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/triangle_r.png +0 -0
  245. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/triangle_u.png +0 -0
  246. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markers/xcross.png +0 -0
  247. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markerstyles/cross_marker.png +0 -0
  248. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markerstyles/horiz_marker.png +0 -0
  249. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/markerstyles/vert_marker.png +0 -0
  250. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/mask/mask_circle.png +0 -0
  251. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/mask/mask_circle_outside.png +0 -0
  252. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/mask/mask_rectangle.png +0 -0
  253. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/mask/mask_rectangle_outside.png +0 -0
  254. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/mask/mask_tool.png +0 -0
  255. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/max.png +0 -0
  256. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/min.png +0 -0
  257. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/move.png +0 -0
  258. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/multipoint_selection.png +0 -0
  259. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/none.png +0 -0
  260. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/not_found.png +0 -0
  261. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/on_curve.png +0 -0
  262. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/bdiagpattern.png +0 -0
  263. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/crosspattern.png +0 -0
  264. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense1pattern.png +0 -0
  265. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense2pattern.png +0 -0
  266. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense3pattern.png +0 -0
  267. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense4pattern.png +0 -0
  268. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense5pattern.png +0 -0
  269. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense6pattern.png +0 -0
  270. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/dense7pattern.png +0 -0
  271. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/diagcrosspattern.png +0 -0
  272. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/fdiagpattern.png +0 -0
  273. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/horpattern.png +0 -0
  274. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/nobrush.png +0 -0
  275. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/solidpattern.png +0 -0
  276. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/patterns/verpattern.png +0 -0
  277. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/plotpy-banner.svg +0 -0
  278. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/plotpy-vertical.svg +0 -0
  279. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/plotpy.svg +0 -0
  280. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/point_selection.png +0 -0
  281. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/print.png +0 -0
  282. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/python.png +0 -0
  283. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/quickview.png +0 -0
  284. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/refresh.png +0 -0
  285. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/save_all.png +0 -0
  286. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/scales/lin_lin.png +0 -0
  287. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/scales/lin_log.png +0 -0
  288. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/scales/log_lin.png +0 -0
  289. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/scales/log_log.png +0 -0
  290. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/select.svg +0 -0
  291. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/select_area.svg +0 -0
  292. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/settings.png +0 -0
  293. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shape.png +0 -0
  294. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/circle.png +0 -0
  295. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/contour.png +0 -0
  296. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/ellipse_shape.png +0 -0
  297. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/gtaxes.png +0 -0
  298. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/marker.png +0 -0
  299. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/oblique_rectangle.png +0 -0
  300. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/point_shape.png +0 -0
  301. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/polygon.png +0 -0
  302. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/polyline.png +0 -0
  303. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/rectangle.png +0 -0
  304. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/segment.png +0 -0
  305. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/xrange.png +0 -0
  306. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/shapes/yrange.png +0 -0
  307. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/snapshot.png +0 -0
  308. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/styles/dash.png +0 -0
  309. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/styles/dashdot.png +0 -0
  310. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/styles/dashdotdot.png +0 -0
  311. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/styles/dot.png +0 -0
  312. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/styles/solid.png +0 -0
  313. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/trash.png +0 -0
  314. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/trimage_lock.png +0 -0
  315. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/trimage_unlock.png +0 -0
  316. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/vcursor.png +0 -0
  317. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/vflip.png +0 -0
  318. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/xcursor.png +0 -0
  319. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/xmax.png +0 -0
  320. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/xmin.png +0 -0
  321. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/data/icons/zlog.svg +0 -0
  322. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/events.py +0 -0
  323. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/__init__.py +0 -0
  324. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/__init__.py +0 -0
  325. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_generic_range_slider.py +0 -0
  326. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_generic_slider.py +0 -0
  327. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_labeled.py +0 -0
  328. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_misc.py +0 -0
  329. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_range_style.py +0 -0
  330. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/external/sliders/_sliders.py +0 -0
  331. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/interfaces/__init__.py +0 -0
  332. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/interfaces/items.py +0 -0
  333. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/interfaces/panel.py +0 -0
  334. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/interfaces/plotmanager.py +0 -0
  335. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/io.py +0 -0
  336. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/annotation.py +0 -0
  337. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/contour.py +0 -0
  338. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/curve/__init__.py +0 -0
  339. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/curve/base.py +0 -0
  340. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/curve/errorbar.py +0 -0
  341. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/grid.py +0 -0
  342. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/histogram.py +0 -0
  343. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/filter.py +0 -0
  344. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/image/masked.py +0 -0
  345. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/label.py +0 -0
  346. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/polygonmap.py +0 -0
  347. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/quiver.py +0 -0
  348. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/__init__.py +0 -0
  349. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/axis.py +0 -0
  350. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/base.py +0 -0
  351. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/ellipse.py +0 -0
  352. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/marker.py +0 -0
  353. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/point.py +0 -0
  354. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/polygon.py +0 -0
  355. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/range.py +0 -0
  356. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/rectangle.py +0 -0
  357. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/segment.py +0 -0
  358. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/items/shape/svg.py +0 -0
  359. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/lutrange.py +0 -0
  360. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/mathutils/__init__.py +0 -0
  361. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/mathutils/arrayfuncs.py +0 -0
  362. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/mathutils/colormap.py +0 -0
  363. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/mathutils/geometry.py +0 -0
  364. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/mathutils/scaler.py +0 -0
  365. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/__init__.py +0 -0
  366. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/base.py +0 -0
  367. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/contrastadjustment.py +0 -0
  368. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/csection/__init__.py +0 -0
  369. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/csection/csitem.py +0 -0
  370. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/csection/csplot.py +0 -0
  371. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/csection/cswidget.py +0 -0
  372. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/panels/itemlist.py +0 -0
  373. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/plot/__init__.py +0 -0
  374. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/plot/interactive.py +0 -0
  375. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/plot/manager.py +0 -0
  376. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/plot/plotwidget.py +0 -0
  377. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/pyplot.py +0 -0
  378. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/__init__.py +0 -0
  379. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/curve.py +0 -0
  380. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/errorbar.py +0 -0
  381. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/histogram.py +0 -0
  382. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/image.py +0 -0
  383. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/label.py +0 -0
  384. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/polygonmap.py +0 -0
  385. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/styles/shape.py +0 -0
  386. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/__init__.py +0 -0
  387. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/__init__.py +0 -0
  388. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/test_benchmarks.py +0 -0
  389. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/test_bigcurves.py +0 -0
  390. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/test_bigimages.py +0 -0
  391. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/test_large_number_of_annotations.py +0 -0
  392. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/benchmarks/test_loadtest.py +0 -0
  393. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/conftest.py +0 -0
  394. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/brain.png +0 -0
  395. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/brain_cylinder.png +0 -0
  396. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/datetime.txt +0 -0
  397. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/mr-brain.dcm +0 -0
  398. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/svg_target.svg +0 -0
  399. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data/svg_tool.svg +0 -0
  400. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/data.py +0 -0
  401. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/__init__.py +0 -0
  402. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_auto_curve_image.py +0 -0
  403. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_autoscale_shapes.py +0 -0
  404. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_builder.py +0 -0
  405. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_colormap_editor.py +0 -0
  406. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_colormap_manager.py +0 -0
  407. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_computations.py +0 -0
  408. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_contrast.py +0 -0
  409. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_cursors.py +0 -0
  410. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_data_update_curve.py +0 -0
  411. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_data_update_image.py +0 -0
  412. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_dicom_image.py +0 -0
  413. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_fit.py +0 -0
  414. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_fit_locked_params.py +0 -0
  415. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_image_coords.py +0 -0
  416. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_image_filter.py +0 -0
  417. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_image_superp.py +0 -0
  418. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_loadsaveitems_hdf5.py +0 -0
  419. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_loadsaveitems_json.py +0 -0
  420. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_loadsaveitems_pickle.py +0 -0
  421. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_manager.py +0 -0
  422. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_no_auto_tools.py +0 -0
  423. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_plot_log.py +0 -0
  424. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_plot_time.py +0 -0
  425. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_plot_types.py +0 -0
  426. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_plot_yreverse.py +0 -0
  427. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_pyplot.py +0 -0
  428. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_quiver.py +0 -0
  429. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/features/test_resize.py +0 -0
  430. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/__init__.py +0 -0
  431. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_annotated_range.py +0 -0
  432. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_annotations.py +0 -0
  433. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_curves.py +0 -0
  434. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_curves_highdpi.py +0 -0
  435. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_hist2d.py +0 -0
  436. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_histogram.py +0 -0
  437. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image.py +0 -0
  438. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_aspect_ratio.py +0 -0
  439. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_contour.py +0 -0
  440. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_masked.py +0 -0
  441. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_masked_xy.py +0 -0
  442. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_rgb.py +0 -0
  443. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_image_xy.py +0 -0
  444. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_mandelbrot.py +0 -0
  445. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_pcolor.py +0 -0
  446. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_polygons.py +0 -0
  447. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_svgshapes.py +0 -0
  448. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_to_bins.py +0 -0
  449. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/items/test_transform.py +0 -0
  450. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/__init__.py +0 -0
  451. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_actiontool.py +0 -0
  452. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_cross_section.py +0 -0
  453. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_cross_section_line.py +0 -0
  454. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_cross_section_oblique.py +0 -0
  455. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_customize_shape_tool.py +0 -0
  456. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_cyclic_import.py +0 -0
  457. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_downsample_curve.py +0 -0
  458. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_edit_point.py +0 -0
  459. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_get_point.py +0 -0
  460. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_get_points.py +0 -0
  461. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_get_rectangle.py +0 -0
  462. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_get_rectangle_with_svg.py +0 -0
  463. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_get_segment.py +0 -0
  464. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_image_plot_tools.py +0 -0
  465. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_stats_tools.py +0 -0
  466. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/tools/test_zaxislog.py +0 -0
  467. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/__init__.py +0 -0
  468. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_annotation_tools.py +0 -0
  469. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_arrayfuncs.py +0 -0
  470. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_aspect_ratio_tool.py +0 -0
  471. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_baseplot.py +0 -0
  472. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_builder_annotation.py +0 -0
  473. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_builder_curve.py +0 -0
  474. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_builder_image.py +0 -0
  475. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_builder_shape.py +0 -0
  476. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_contour.py +0 -0
  477. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_cursor_tools.py +0 -0
  478. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_curve_tools.py +0 -0
  479. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_datetime_axis.py +0 -0
  480. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_display_coords_tool.py +0 -0
  481. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_events.py +0 -0
  482. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_fontparam.py +0 -0
  483. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_geometry.py +0 -0
  484. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_io.py +0 -0
  485. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_line.py +0 -0
  486. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_line_cross_section_tool.py +0 -0
  487. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_manipulate_selection.py +0 -0
  488. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_mask_tool.py +0 -0
  489. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_masked_dtype_change.py +0 -0
  490. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_multiline_tools.py +0 -0
  491. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_oblique_cross_section_tool.py +0 -0
  492. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_plot_curve.py +0 -0
  493. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_plot_image.py +0 -0
  494. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_rect_zoom.py +0 -0
  495. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_seg_dist.py +0 -0
  496. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_styles.py +0 -0
  497. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/test_tools_export.py +0 -0
  498. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/unit/utils.py +0 -0
  499. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/vistools.py +0 -0
  500. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/__init__.py +0 -0
  501. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_dotarraydemo.py +0 -0
  502. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_filtertest1.py +0 -0
  503. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_filtertest2.py +0 -0
  504. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_fliprotate.py +0 -0
  505. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_plot_timecurve.py +0 -0
  506. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_qtdesigner.py +0 -0
  507. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_qtdesigner.ui +0 -0
  508. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_resize_dialog.py +0 -0
  509. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_rotatecrop.py +0 -0
  510. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_simple_dialog.py +0 -0
  511. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_simple_window.py +0 -0
  512. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_syncplot.py +0 -0
  513. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tests/widgets/test_theme.py +0 -0
  514. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/__init__.py +0 -0
  515. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/annotation.py +0 -0
  516. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/axes.py +0 -0
  517. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/base.py +0 -0
  518. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/cross_section.py +0 -0
  519. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/cursor.py +0 -0
  520. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/item.py +0 -0
  521. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/label.py +0 -0
  522. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/plot.py +0 -0
  523. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/selection.py +0 -0
  524. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/tools/shape.py +0 -0
  525. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/__init__.py +0 -0
  526. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/about.py +0 -0
  527. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/basetransform.py +0 -0
  528. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/colormap/__init__.py +0 -0
  529. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/colormap/_slider.py +0 -0
  530. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/colormap/editor.py +0 -0
  531. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/colormap/manager.py +0 -0
  532. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/colormap/widget.py +0 -0
  533. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/fit.py +0 -0
  534. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/fliprotate.py +0 -0
  535. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/imagefile.py +0 -0
  536. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/qtdesigner.py +0 -0
  537. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/resizedialog.py +0 -0
  538. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/rotatecrop.py +0 -0
  539. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy/widgets/selectdialog.py +0 -0
  540. {plotpy-2.9.0 → plotpy-2.10.0}/plotpy-tests.desktop +0 -0
  541. {plotpy-2.9.0 → plotpy-2.10.0}/qtdesigner/plotplugin.py +0 -0
  542. {plotpy-2.9.0 → plotpy-2.10.0}/setup.cfg +0 -0
  543. {plotpy-2.9.0 → plotpy-2.10.0}/setup.py +0 -0
  544. {plotpy-2.9.0 → plotpy-2.10.0}/src/arrays.hpp +0 -0
  545. {plotpy-2.9.0 → plotpy-2.10.0}/src/debug.hpp +0 -0
  546. {plotpy-2.9.0 → plotpy-2.10.0}/src/histogram2d.pyx +0 -0
  547. {plotpy-2.9.0 → plotpy-2.10.0}/src/mandelbrot.pyx +0 -0
  548. {plotpy-2.9.0 → plotpy-2.10.0}/src/pcolor.cpp +0 -0
  549. {plotpy-2.9.0 → plotpy-2.10.0}/src/points.hpp +0 -0
  550. {plotpy-2.9.0 → plotpy-2.10.0}/src/scaler.cpp +0 -0
  551. {plotpy-2.9.0 → plotpy-2.10.0}/src/scaler.hpp +0 -0
  552. {plotpy-2.9.0 → plotpy-2.10.0}/src/traits.hpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PlotPy
3
- Version: 2.9.0
3
+ Version: 2.10.0
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License: BSD 3-Clause License
@@ -63,7 +63,7 @@ Requires-Python: <4,>=3.9
63
63
  Description-Content-Type: text/markdown
64
64
  License-File: LICENSE
65
65
  Requires-Dist: guidata>=3.14.1
66
- Requires-Dist: PythonQwt>=0.15
66
+ Requires-Dist: PythonQwt>=0.16
67
67
  Requires-Dist: numpy>=1.22
68
68
  Requires-Dist: SciPy>=1.7.3
69
69
  Requires-Dist: scikit-image>=0.19
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PlotPy
3
- Version: 2.9.0
3
+ Version: 2.10.0
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License: BSD 3-Clause License
@@ -63,7 +63,7 @@ Requires-Python: <4,>=3.9
63
63
  Description-Content-Type: text/markdown
64
64
  License-File: LICENSE
65
65
  Requires-Dist: guidata>=3.14.1
66
- Requires-Dist: PythonQwt>=0.15
66
+ Requires-Dist: PythonQwt>=0.16
67
67
  Requires-Dist: numpy>=1.22
68
68
  Requires-Dist: SciPy>=1.7.3
69
69
  Requires-Dist: scikit-image>=0.19
@@ -117,6 +117,7 @@ doc/release_notes/release_2.06.md
117
117
  doc/release_notes/release_2.07.md
118
118
  doc/release_notes/release_2.08.md
119
119
  doc/release_notes/release_2.09.md
120
+ doc/release_notes/release_2.10.md
120
121
  plotpy/__init__.py
121
122
  plotpy/config.py
122
123
  plotpy/constants.py
@@ -464,6 +465,7 @@ plotpy/tests/unit/__init__.py
464
465
  plotpy/tests/unit/test_annotation_tools.py
465
466
  plotpy/tests/unit/test_arrayfuncs.py
466
467
  plotpy/tests/unit/test_aspect_ratio_tool.py
468
+ plotpy/tests/unit/test_autoscale_strategy.py
467
469
  plotpy/tests/unit/test_baseplot.py
468
470
  plotpy/tests/unit/test_builder_annotation.py
469
471
  plotpy/tests/unit/test_builder_curve.py
@@ -477,6 +479,7 @@ plotpy/tests/unit/test_display_coords_tool.py
477
479
  plotpy/tests/unit/test_events.py
478
480
  plotpy/tests/unit/test_fontparam.py
479
481
  plotpy/tests/unit/test_geometry.py
482
+ plotpy/tests/unit/test_image_log_set_data.py
480
483
  plotpy/tests/unit/test_io.py
481
484
  plotpy/tests/unit/test_line.py
482
485
  plotpy/tests/unit/test_line_cross_section_tool.py
@@ -489,6 +492,7 @@ plotpy/tests/unit/test_plot_curve.py
489
492
  plotpy/tests/unit/test_plot_image.py
490
493
  plotpy/tests/unit/test_rect_zoom.py
491
494
  plotpy/tests/unit/test_seg_dist.py
495
+ plotpy/tests/unit/test_snapshot_original_size.py
492
496
  plotpy/tests/unit/test_styles.py
493
497
  plotpy/tests/unit/test_tools_export.py
494
498
  plotpy/tests/unit/utils.py
@@ -1,5 +1,5 @@
1
1
  guidata>=3.14.1
2
- PythonQwt>=0.15
2
+ PythonQwt>=0.16
3
3
  numpy>=1.22
4
4
  SciPy>=1.7.3
5
5
  scikit-image>=0.19
@@ -0,0 +1,34 @@
1
+ # Version 2.10 #
2
+
3
+ ## PlotPy Version 2.10.0 ##
4
+
5
+ ✨ New features:
6
+
7
+ * **Per-axis autoscale strategy**: Added configurable autoscale behavior for each axis via the axis parameters dialog. Three strategies are available: *Auto* (default — compute bounds from items), *Fixed range* (apply user-defined Min/Max values) and *Disabled* (leave the axis untouched on autoscale). New API: `BasePlot.set_axis_autoscale_strategy()` / `BasePlot.get_axis_autoscale_strategy()` (closes [Issue #63](https://github.com/PlotPyStack/PlotPy/issues/63), partial)
8
+ * **Symbol border width**: Added an `edgewidth` parameter to `SymbolParam` for customizable marker border thickness — previously the border was always 1 pixel wide
9
+
10
+ 🛠️ Bug fixes:
11
+
12
+ * **Rectangular snapshot tool** — Fixed the "Original size" computation (closes [Issue #57](https://github.com/PlotPyStack/PlotPy/issues/57)):
13
+ * The preview no longer displays negative dimensions when the X or Y axis is
14
+ reversed
15
+ * The "Original size" is now computed from pixel coordinates instead of axis
16
+ units, so it is correct for `XYImageItem` (and any item with non-uniform
17
+ axis scaling) regardless of axis orientation
18
+ * The `ValueError` raised by the resize dialog when the selection produced
19
+ negative dimensions on a reversed axis is gone
20
+ * Selecting a region larger than the plotted image now reports the same
21
+ native pixel resolution for both `ImageItem` and `XYImageItem`
22
+ (previously `XYImageItem` reported ``shape - 1`` while `ImageItem`
23
+ reported the full oversized resolution): exporting at "Original size"
24
+ now consistently preserves the source pixel density and avoids
25
+ upsampling, regardless of the item type
26
+ * **Snapshot tool cursor** — Fixed the mouse cursor remaining stuck as a cross (`+`) outside the plot canvas (axes, toolbar) after using the snapshot tool. The modal dialogs are now opened after Qt has released the implicit pointer grab, so the cursor is correctly restored (closes [Issue #58](https://github.com/PlotPyStack/PlotPy/issues/58))
27
+ * **Z-axis log tool** — Fixed the `ZAxisLogTool` being always disabled for non-`ImageItem` image types (`XYImageItem`, `MaskedImageItem`, `MaskedXYImageItem`, `TrImageItem`, `RGBImageItem`). The Z-axis log API (`get_zaxis_log_state` / `set_zaxis_log_state`) was moved from `ImageItem` up to `BaseImageItem` so all image item types support it. This notably fixes the tool being permanently greyed out in DataLab's image panel (closes [Issue #59](https://github.com/PlotPyStack/PlotPy/issues/59))
28
+ * **Z-axis log data update** — Fixed image data not being recomputed when calling `set_data()` while Z-axis log scale is active — the log-transformed data is now refreshed and the LUT range preserved in log mode
29
+ * **`YRangeCursorTool`** — Fixed incorrect inequality display and negative ∆y when the Y-range cursors are inverted (dragging the top cursor below the bottom one). Values are now sorted and ∆y is always positive (closes [Issue #55](https://github.com/PlotPyStack/PlotPy/issues/55))
30
+ * **`CurveStatsTool`** — Replaced `min`/`max`/`mean`/`std`/`sum` with their NaN-safe equivalents (`nanmin`, `nanmax`, `nanmean`, `nanstd`, `nansum`) so that signal statistics are computed correctly when the data contains NaN values
31
+
32
+ ⚙️ Dependencies:
33
+
34
+ * Bumped minimum PythonQwt version from 0.15 to **0.16** to benefit from the Qt6 performance optimizations (closes [Issue #22](https://github.com/PlotPyStack/PlotPy/issues/22) — see [PythonQwt#93](https://github.com/PlotPyStack/PythonQwt/issues/93) for the full optimization log)
@@ -14,7 +14,7 @@ The `PlotPy` package requires the following Python modules:
14
14
  - >= 3.14.1
15
15
  - Automatic GUI generation for easy dataset editing and display
16
16
  * - PythonQwt
17
- - >= 0.15
17
+ - >= 0.16
18
18
  - Qt plotting widgets for Python
19
19
  * - numpy
20
20
  - >= 1.22
@@ -26,10 +26,10 @@ The `PlotPy` package requires the following Python modules:
26
26
  - >= 0.19
27
27
  - Image processing in Python
28
28
  * - Pillow
29
- -
29
+ -
30
30
  - Python Imaging Library (fork)
31
31
  * - tifffile
32
- -
32
+ -
33
33
  - Read and write TIFF files
34
34
 
35
35
  Optional modules for GUI support (Qt):
@@ -55,26 +55,32 @@ Optional modules for development:
55
55
  - Version
56
56
  - Summary
57
57
  * - build
58
- -
58
+ -
59
59
  - A simple, correct Python build frontend
60
60
  * - babel
61
- -
61
+ -
62
62
  - Internationalization utilities
63
63
  * - Coverage
64
- -
64
+ -
65
65
  - Code coverage measurement for Python
66
66
  * - Cython
67
67
  - >=3.0
68
68
  - The Cython compiler for writing C extensions in the Python language.
69
69
  * - pylint
70
- -
70
+ -
71
71
  - python code static checker
72
72
  * - ruff
73
- -
73
+ -
74
74
  - An extremely fast Python linter and code formatter, written in Rust.
75
75
  * - pre-commit
76
- -
76
+ -
77
77
  - A framework for managing and maintaining multi-language pre-commit hooks.
78
+ * - setuptools
79
+ -
80
+ - Most extensible Python build backend with support for C/C++ extension modules
81
+ * - wheel
82
+ -
83
+ - Command line tool for manipulating wheel files
78
84
 
79
85
  Optional modules for building the documentation:
80
86
 
@@ -86,19 +92,19 @@ Optional modules for building the documentation:
86
92
  - Version
87
93
  - Summary
88
94
  * - sphinx
89
- -
95
+ -
90
96
  - Python documentation generator
91
97
  * - myst_parser
92
- -
98
+ -
93
99
  - An extended [CommonMark](https://spec.commonmark.org/) compliant parser,
94
100
  * - sphinx-copybutton
95
- -
101
+ -
96
102
  - Add a copy button to each of your code cells.
97
103
  * - sphinx_qt_documentation
98
- -
104
+ -
99
105
  - Plugin for proper resolve intersphinx references for Qt elements
100
106
  * - python-docs-theme
101
- -
107
+ -
102
108
  - The Sphinx theme for the CPython docs and related projects
103
109
 
104
110
  Optional modules for running test suite:
@@ -111,8 +117,8 @@ Optional modules for running test suite:
111
117
  - Version
112
118
  - Summary
113
119
  * - pytest
114
- -
120
+ -
115
121
  - pytest: simple powerful testing with Python
116
122
  * - pytest-xvfb
117
- -
123
+ -
118
124
  - A pytest plugin to run Xvfb (or Xephyr/Xvnc) for tests.
@@ -20,7 +20,7 @@ External resources:
20
20
  .. _GitHub: https://github.com/PierreRaybaut/plotpy
21
21
  """
22
22
 
23
- __version__ = "2.9.0"
23
+ __version__ = "2.10.0"
24
24
  __VERSION__ = tuple([int(number) for number in __version__.split(".")])
25
25
 
26
26
  # --- Important note: DATAPATH and LOCALEPATH are used by guidata.configtools
@@ -33,6 +33,7 @@ from .image import (
33
33
  XYImageFilterItem,
34
34
  XYImageItem,
35
35
  assemble_imageitems,
36
+ compute_image_items_original_size,
36
37
  compute_trimageitems_original_size,
37
38
  get_image_from_plot,
38
39
  get_image_from_qrect,
@@ -11,6 +11,7 @@ from .misc import (
11
11
  Histogram2DItem,
12
12
  QuadGridItem,
13
13
  assemble_imageitems,
14
+ compute_image_items_original_size,
14
15
  compute_trimageitems_original_size,
15
16
  get_image_from_plot,
16
17
  get_image_from_qrect,
@@ -132,6 +132,12 @@ class BaseImageItem(QwtPlotItem):
132
132
  self._filename = None # The file this image comes from
133
133
 
134
134
  self.histogram_cache = None
135
+
136
+ # Z-axis logarithmic scale support
137
+ self._log_data: np.ndarray | None = None
138
+ self._lin_lut_range: tuple[float, float] | None = None
139
+ self._is_zaxis_log = False
140
+
135
141
  if data is not None:
136
142
  self.set_data(data)
137
143
  self.param.update_item(self)
@@ -334,6 +340,15 @@ class BaseImageItem(QwtPlotItem):
334
340
  """
335
341
  return self.get_x_values(i0, i1)
336
342
 
343
+ def _recompute_log_data(self) -> None:
344
+ """Refresh the cached log10 data from the current ``self.data``.
345
+
346
+ Used both when toggling the Z-axis log scale on and when the underlying
347
+ data is replaced (e.g. via :meth:`set_data`) while the log scale is
348
+ already active.
349
+ """
350
+ self._log_data = np.array(np.log10(self.data.clip(1)), dtype=np.float64)
351
+
337
352
  def set_data(
338
353
  self, data: np.ndarray, lut_range: tuple[float, float] | None = None
339
354
  ) -> None:
@@ -347,9 +362,15 @@ class BaseImageItem(QwtPlotItem):
347
362
  self.histogram_cache = None
348
363
  self.update_bounds()
349
364
  self.update_border()
365
+ # Refresh the cached log10 data when log scale is active, otherwise the
366
+ # display would keep using the previous (now stale) log data.
367
+ if self.get_zaxis_log_state():
368
+ self._recompute_log_data()
350
369
  if not self.param.keep_lut_range:
351
370
  if lut_range is not None:
352
371
  _min, _max = lut_range
372
+ elif self.get_zaxis_log_state():
373
+ _min, _max = get_nan_range(self._log_data)
353
374
  else:
354
375
  _min, _max = get_nan_range(data)
355
376
  self.set_lut_range((_min, _max))
@@ -552,6 +573,34 @@ class BaseImageItem(QwtPlotItem):
552
573
  """
553
574
  return get_nan_range(self.data)
554
575
 
576
+ # ---- Z-axis logarithmic scale --------------------------------------------
577
+ def get_zaxis_log_state(self) -> bool:
578
+ """Return True if Z-axis is in logarithmic scale"""
579
+ return self._is_zaxis_log
580
+
581
+ def set_zaxis_log_state(self, state: bool) -> None:
582
+ """Set Z-axis logarithmic scale state
583
+
584
+ Args:
585
+ state: True to enable logarithmic scale, False otherwise
586
+ """
587
+ self._is_zaxis_log = state
588
+ plot = self.plot()
589
+ if state:
590
+ self._lin_lut_range = self.get_lut_range()
591
+ if self._log_data is None:
592
+ self._recompute_log_data()
593
+ self.set_lut_range(get_nan_range(self._log_data))
594
+ dtype = self._log_data.dtype
595
+ else:
596
+ self._log_data = None
597
+ self.set_lut_range(self._lin_lut_range)
598
+ dtype = self.data.dtype
599
+ if self.interpolate[0] == INTERP_AA:
600
+ self.interpolate = (INTERP_AA, self.interpolate[1].astype(dtype))
601
+ if plot is not None:
602
+ plot.update_colormap_axis(self)
603
+
555
604
  def get_lut_range_max(self) -> tuple[float, float]:
556
605
  """Get maximum range for this dataset
557
606
 
@@ -577,19 +577,27 @@ def get_items_in_rectangle(
577
577
 
578
578
  def compute_trimageitems_original_size(
579
579
  items: list[TrImageItem],
580
- src_w: list[float, float, float, float],
581
- src_h: list[float, float, float, float],
580
+ src_w: float,
581
+ src_h: float,
582
582
  ) -> tuple[float, float]:
583
583
  """Compute `TrImageItem` original size from max dx and dy
584
584
 
585
585
  Args:
586
586
  items: List of image items
587
- src_w: Source width
588
- src_h: Source height
587
+ src_w: Source width (in plot axis units)
588
+ src_h: Source height (in plot axis units)
589
589
 
590
590
  Returns:
591
591
  Tuple of original size
592
+
593
+ .. note::
594
+
595
+ The returned size is always positive: when the source rectangle is
596
+ defined on a reversed axis, ``src_w`` and/or ``src_h`` may be
597
+ negative. The original (pixel) size is intrinsically positive,
598
+ independent of axis orientation.
592
599
  """
600
+ src_w, src_h = abs(src_w), abs(src_h)
593
601
  trparams = [item.get_transform() for item in items if isinstance(item, TrImageItem)]
594
602
  if trparams:
595
603
  dx_max = max([dx for _x, _y, _angle, dx, _dy, _hf, _vf in trparams])
@@ -598,6 +606,81 @@ def compute_trimageitems_original_size(
598
606
  return src_w, src_h
599
607
 
600
608
 
609
+ def compute_image_items_original_size(
610
+ items: list[BaseImageItem],
611
+ plot: qwt.plot.QwtPlot,
612
+ p0: QPointF,
613
+ p1: QPointF,
614
+ ) -> tuple[float, float]:
615
+ """Compute the **native pixel resolution** of a rectangular selection
616
+ across the given image items.
617
+
618
+ The "Original size" semantics is *original resolution*: the returned
619
+ size is the number of source pixels that span the selection at the
620
+ item's native resolution, *independent of axis orientation or scaling*.
621
+ When the selection is larger than the plotted image, the returned size
622
+ is consequently larger than the image (the missing area will be padded
623
+ by the export step). When the selection is smaller, it is smaller in
624
+ pixels — there is **no** clipping to the image bounding rectangle, so
625
+ that exporting at "Original size" always preserves the source pixel
626
+ density.
627
+
628
+ Args:
629
+ plot: Plot
630
+ items: List of image items in the selection
631
+ p0: First canvas point (top-left, in canvas coordinates)
632
+ p1: Second canvas point (bottom-right, in canvas coordinates)
633
+
634
+ Returns:
635
+ Tuple ``(width, height)`` in pixels (always positive). When no
636
+ compatible item is found, falls back to the absolute axis-units
637
+ size of the selection.
638
+ """
639
+ p0x = plot.invTransform(X_BOTTOM, p0.x())
640
+ p0y = plot.invTransform(Y_LEFT, p0.y())
641
+ p1x = plot.invTransform(X_BOTTOM, p1.x() + 1)
642
+ p1y = plot.invTransform(Y_LEFT, p1.y() + 1)
643
+ sel_x0, sel_x1 = sorted([p0x, p1x])
644
+ sel_y0, sel_y1 = sorted([p0y, p1y])
645
+ sel_w = sel_x1 - sel_x0
646
+ sel_h = sel_y1 - sel_y0
647
+ widths: list[float] = []
648
+ heights: list[float] = []
649
+ for item in items:
650
+ data = getattr(item, "data", None)
651
+ if data is None:
652
+ continue
653
+ if isinstance(item, TrImageItem):
654
+ # Use the item's affine transform (handles rotation and shear)
655
+ get_pix = item.get_pixel_coordinates
656
+ try:
657
+ x0p, y0p = get_pix(sel_x0, sel_y0)
658
+ x1p, y1p = get_pix(sel_x1, sel_y1)
659
+ except (ValueError, TypeError, IndexError):
660
+ continue
661
+ widths.append(abs(x1p - x0p))
662
+ heights.append(abs(y1p - y0p))
663
+ else:
664
+ # For ImageItem / XYImageItem: convert the (possibly oversized)
665
+ # selection to pixels via the item's own pixel density. This
666
+ # avoids ``XYImageItem.get_pixel_coordinates`` clamping to
667
+ # integer indices and yields oversized values when the
668
+ # selection extends beyond the image — consistently with the
669
+ # historical behavior of ``ImageItem``.
670
+ brect = item.boundingRect()
671
+ bw = abs(brect.width())
672
+ bh = abs(brect.height())
673
+ if bw <= 0 or bh <= 0:
674
+ continue
675
+ widths.append(sel_w / bw * data.shape[1])
676
+ heights.append(sel_h / bh * data.shape[0])
677
+ if widths:
678
+ return max(widths), max(heights)
679
+ # Fallback: axis-units size (always positive)
680
+ _src_x, _src_y, src_w, src_h = get_plot_qrect(plot, p0, p1).getRect()
681
+ return abs(src_w), abs(src_h)
682
+
683
+
601
684
  def get_image_from_qrect(
602
685
  plot: BasePlot,
603
686
  p0: QPointF,
@@ -636,12 +719,12 @@ def get_image_from_qrect(
636
719
  if not items:
637
720
  raise TypeError(_("There is no supported image item in current plot."))
638
721
  if src_size is None:
639
- _src_x, _src_y, src_w, src_h = get_plot_qrect(plot, p0, p1).getRect()
722
+ destw, desth = compute_image_items_original_size(items, plot, p0, p1)
640
723
  else:
641
724
  # The only benefit to pass the src_size list is to avoid any
642
725
  # rounding error in the transformation computed in `get_plot_qrect`
643
726
  src_w, src_h = src_size
644
- destw, desth = compute_trimageitems_original_size(items, src_w, src_h)
727
+ destw, desth = compute_trimageitems_original_size(items, src_w, src_h)
645
728
  data = get_image_from_plot(
646
729
  plot,
647
730
  p0,
@@ -11,7 +11,6 @@ from guidata.utils.misc import assert_interfaces_valid
11
11
  from qtpy import QtCore as QC
12
12
 
13
13
  from plotpy import io
14
- from plotpy._scaler import INTERP_AA
15
14
  from plotpy.config import _
16
15
  from plotpy.constants import LUTAlpha
17
16
  from plotpy.coords import canvas_to_axes, pixelround
@@ -29,7 +28,6 @@ from plotpy.interfaces import (
29
28
  )
30
29
  from plotpy.items.image.base import RawImageItem
31
30
  from plotpy.items.image.filter import XYImageFilterItem, to_bins
32
- from plotpy.mathutils.arrayfuncs import get_nan_range
33
31
  from plotpy.styles.image import ImageParam, RGBImageParam, XYImageParam
34
32
 
35
33
  if TYPE_CHECKING:
@@ -84,9 +82,6 @@ class ImageItem(RawImageItem):
84
82
  self.xmax = None
85
83
  self.ymin = None
86
84
  self.ymax = None
87
- self._log_data = None
88
- self._lin_lut_range = None
89
- self._is_zaxis_log = False
90
85
  super().__init__(data=data, param=param)
91
86
 
92
87
  # ---- BaseImageItem API ---------------------------------------------------
@@ -228,28 +223,6 @@ class ImageItem(RawImageItem):
228
223
  (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata()
229
224
  self.bounds = QC.QRectF(QC.QPointF(xmin, ymin), QC.QPointF(xmax, ymax))
230
225
 
231
- def get_zaxis_log_state(self):
232
- """Reimplement image.ImageItem method"""
233
- return self._is_zaxis_log
234
-
235
- def set_zaxis_log_state(self, state):
236
- """Reimplement image.ImageItem method"""
237
- self._is_zaxis_log = state
238
- plot = self.plot()
239
- if state:
240
- self._lin_lut_range = self.get_lut_range()
241
- if self._log_data is None:
242
- self._log_data = np.array(np.log10(self.data.clip(1)), dtype=np.float64)
243
- self.set_lut_range(get_nan_range(self._log_data))
244
- dtype = self._log_data.dtype
245
- else:
246
- self._log_data = None
247
- self.set_lut_range(self._lin_lut_range)
248
- dtype = self.data.dtype
249
- if self.interpolate[0] == INTERP_AA:
250
- self.interpolate = (INTERP_AA, self.interpolate[1].astype(dtype))
251
- plot.update_colormap_axis(self)
252
-
253
226
  # ---- BaseImageItem API ---------------------------------------------------
254
227
  def get_pixel_coordinates(self, xplot: float, yplot: float) -> tuple[float, float]:
255
228
  """Get pixel coordinates from plot coordinates
@@ -684,8 +657,12 @@ class XYImageItem(RawImageItem):
684
657
  return
685
658
  xytr = self.x, self.y, src_rect
686
659
  dst_rect = tuple([int(i) for i in dst_rect])
660
+ if self.get_zaxis_log_state():
661
+ data = self._log_data
662
+ else:
663
+ data = self.data
687
664
  dest = _scale_xy(
688
- self.data, xytr, self._offscreen, dst_rect, self.lut, self.interpolate
665
+ data, xytr, self._offscreen, dst_rect, self.lut, self.interpolate
689
666
  )
690
667
  qrect = QC.QRectF(QC.QPointF(dest[0], dest[1]), QC.QPointF(dest[2], dest[3]))
691
668
  painter.drawImage(qrect, self._image, qrect)
@@ -274,8 +274,12 @@ class TrImageItem(RawImageItem):
274
274
  mat = self.tr @ tr
275
275
 
276
276
  dst_rect = tuple([int(i) for i in dst_rect])
277
+ if self.get_zaxis_log_state():
278
+ data = self._log_data
279
+ else:
280
+ data = self.data
277
281
  dest = _scale_tr(
278
- self.data, mat, self._offscreen, dst_rect, self.lut, self.interpolate
282
+ data, mat, self._offscreen, dst_rect, self.lut, self.interpolate
279
283
  )
280
284
  qrect = QC.QRectF(QC.QPointF(dest[0], dest[1]), QC.QPointF(dest[2], dest[3]))
281
285
  painter.drawImage(qrect, self._image, qrect)
@@ -325,6 +325,9 @@ class BasePlot(qwt.QwtPlot):
325
325
 
326
326
  self.__autoscale_excluded_items: list[itf.IBasePlotItem] = []
327
327
  self.autoscale_margin_percent = options.autoscale_margin_percent
328
+ self._axis_autoscale_strategy: dict[
329
+ int, tuple[str, float | None, float | None]
330
+ ] = {axis_id: ("auto", None, None) for axis_id in self.AXIS_IDS}
328
331
  self.lock_aspect_ratio = options.lock_aspect_ratio
329
332
  self.__autoLockAspectRatio = False
330
333
  if self.lock_aspect_ratio is None:
@@ -2177,9 +2180,54 @@ class BasePlot(qwt.QwtPlot):
2177
2180
  ]
2178
2181
  return [item_ref() for item_ref in self.__autoscale_excluded_items]
2179
2182
 
2183
+ def get_axis_autoscale_strategy(
2184
+ self, axis_id: int
2185
+ ) -> tuple[str, float | None, float | None]:
2186
+ """Return the autoscale strategy configured for a given axis.
2187
+
2188
+ Args:
2189
+ axis_id: the axis ID
2190
+
2191
+ Returns:
2192
+ A 3-tuple ``(strategy, vmin, vmax)`` where ``strategy`` is one of
2193
+ ``"auto"``, ``"fixed"`` or ``"none"``. ``vmin``/``vmax`` are the
2194
+ user-defined bounds applied when ``strategy == "fixed"``
2195
+ (``None`` otherwise).
2196
+ """
2197
+ return self._axis_autoscale_strategy.get(axis_id, ("auto", None, None))
2198
+
2199
+ def set_axis_autoscale_strategy(
2200
+ self,
2201
+ axis_id: int,
2202
+ strategy: str,
2203
+ vmin: float | None = None,
2204
+ vmax: float | None = None,
2205
+ ) -> None:
2206
+ """Set the autoscale strategy for a given axis.
2207
+
2208
+ Args:
2209
+ axis_id: the axis ID
2210
+ strategy: one of ``"auto"`` (compute bounds from items, current
2211
+ behavior), ``"fixed"`` (apply ``vmin``/``vmax``) or ``"none"``
2212
+ (leave the axis untouched on autoscale)
2213
+ vmin: lower bound applied when ``strategy == "fixed"``
2214
+ vmax: upper bound applied when ``strategy == "fixed"``
2215
+ """
2216
+ if strategy not in ("auto", "fixed", "none"):
2217
+ raise ValueError(
2218
+ f"Invalid autoscale strategy {strategy!r}: "
2219
+ "expected one of 'auto', 'fixed', 'none'"
2220
+ )
2221
+ self._axis_autoscale_strategy[axis_id] = (strategy, vmin, vmax)
2222
+
2180
2223
  def do_autoscale(self, replot: bool = True, axis_id: int | None = None) -> None:
2181
2224
  """Do autoscale on all axes
2182
2225
 
2226
+ The behavior of each axis depends on its autoscale strategy
2227
+ (see :py:meth:`set_axis_autoscale_strategy`): ``"auto"`` computes
2228
+ bounds from items (default), ``"fixed"`` applies the configured
2229
+ ``vmin``/``vmax`` and ``"none"`` leaves the axis untouched.
2230
+
2183
2231
  Args:
2184
2232
  replot (bool): replot the widget (optional, default=True)
2185
2233
  axis_id (int | None): the axis ID (optional, default=None)
@@ -2191,6 +2239,14 @@ class BasePlot(qwt.QwtPlot):
2191
2239
  vmin, vmax = None, None
2192
2240
  if not self.axisEnabled(axis_id):
2193
2241
  continue
2242
+ strategy, fixed_vmin, fixed_vmax = self.get_axis_autoscale_strategy(axis_id)
2243
+ if strategy == "none":
2244
+ continue
2245
+ if strategy == "fixed":
2246
+ if fixed_vmin is None or fixed_vmax is None:
2247
+ continue
2248
+ self.set_axis_limits(axis_id, fixed_vmin, fixed_vmax)
2249
+ continue
2194
2250
  for item in self.get_items():
2195
2251
  if (
2196
2252
  isinstance(item, self.AUTOSCALE_TYPES)
@@ -47,6 +47,20 @@ class AxisParam(DataSet):
47
47
  [("lin", _("linear")), ("log", _("logarithmic")), ("datetime", _("date/time"))],
48
48
  default="lin",
49
49
  )
50
+ autoscale = ChoiceItem(
51
+ _("Autoscale strategy"),
52
+ [
53
+ ("auto", _("Auto")),
54
+ ("fixed", _("Fixed range")),
55
+ ("none", _("Disabled")),
56
+ ],
57
+ default="auto",
58
+ help=_(
59
+ "Strategy used by the AutoScale action for this axis: "
60
+ "'Auto' computes bounds from items, 'Fixed range' applies the "
61
+ "Min/Max values defined above, 'Disabled' leaves the axis untouched."
62
+ ),
63
+ )
50
64
  vmin = FloatItem("Min", help=_("Lower axis limit"), default=0.0)
51
65
  vmax = FloatItem("Max", help=_("Upper axis limit"), default=1.0)
52
66
 
@@ -62,6 +76,13 @@ class AxisParam(DataSet):
62
76
  axis: QwtScaleDiv = plot.axisScaleDiv(axis_id)
63
77
  self.vmin = axis.lowerBound()
64
78
  self.vmax = axis.upperBound()
79
+ strategy, fixed_vmin, fixed_vmax = plot.get_axis_autoscale_strategy(axis_id)
80
+ self.autoscale = strategy
81
+ if strategy == "fixed":
82
+ if fixed_vmin is not None:
83
+ self.vmin = fixed_vmin
84
+ if fixed_vmax is not None:
85
+ self.vmax = fixed_vmax
65
86
 
66
87
  def update_axis(self, plot: BasePlot, axis_id: int) -> None:
67
88
  """
@@ -74,6 +95,9 @@ class AxisParam(DataSet):
74
95
  plot.enableAxis(axis_id, True)
75
96
  plot.set_axis_scale(axis_id, self.scale, autoscale=False)
76
97
  plot.setAxisScale(axis_id, self.vmin, self.vmax)
98
+ plot.set_axis_autoscale_strategy(
99
+ axis_id, self.autoscale, vmin=self.vmin, vmax=self.vmax
100
+ )
77
101
  plot.disable_unused_axes()
78
102
  plot.SIG_AXIS_PARAMETERS_CHANGED.emit(axis_id)
79
103