PlotPy 2.6.0__tar.gz → 2.6.2__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 (523) hide show
  1. {plotpy-2.6.0 → plotpy-2.6.2}/CHANGELOG.md +452 -438
  2. {plotpy-2.6.0 → plotpy-2.6.2}/LICENSE +29 -29
  3. {plotpy-2.6.0/PlotPy.egg-info → plotpy-2.6.2}/PKG-INFO +163 -163
  4. {plotpy-2.6.0 → plotpy-2.6.2/PlotPy.egg-info}/PKG-INFO +163 -163
  5. {plotpy-2.6.0 → plotpy-2.6.2}/PlotPy.egg-info/SOURCES.txt +1 -1
  6. {plotpy-2.6.0 → plotpy-2.6.2}/PlotPy.egg-info/requires.txt +1 -1
  7. {plotpy-2.6.0 → plotpy-2.6.2}/README.md +76 -76
  8. {plotpy-2.6.0 → plotpy-2.6.2}/colormaps/README.md +1 -1
  9. {plotpy-2.6.0 → plotpy-2.6.2}/colormaps/_cm.py +7101 -7101
  10. {plotpy-2.6.0 → plotpy-2.6.2}/colormaps/colormap.py +109 -109
  11. {plotpy-2.6.0 → plotpy-2.6.2}/colormaps/matplotlib_cmaps.py +332 -332
  12. {plotpy-2.6.0 → plotpy-2.6.2}/doc/changelog.rst +4 -4
  13. {plotpy-2.6.0 → plotpy-2.6.2}/doc/conf.py +74 -74
  14. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/build.rst +46 -46
  15. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/contribute.rst +107 -107
  16. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/guiqwt_to_plotpy.csv +51 -51
  17. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/guiqwt_to_plotpy.rst +237 -237
  18. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/index.rst +12 -12
  19. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/platforms.rst +162 -162
  20. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/v1_to_guidata_v3.csv +10 -10
  21. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/v1_to_v2.csv +43 -43
  22. {plotpy-2.6.0 → plotpy-2.6.2}/doc/dev/v1_to_v2.rst +87 -87
  23. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/colormapmanager.rst +1 -1
  24. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/events.rst +1 -1
  25. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/fit.rst +1 -1
  26. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/fliprotate.rst +1 -1
  27. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/imagefile.rst +1 -1
  28. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/index.rst +24 -24
  29. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/items/builder.rst +15 -15
  30. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/items/examples.rst +146 -146
  31. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/items/index.rst +13 -13
  32. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/items/overview.rst +89 -89
  33. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/items/reference.rst +144 -144
  34. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/mathutils/index.rst +10 -10
  35. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/panels/index.rst +11 -11
  36. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/panels/overview.rst +28 -28
  37. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/panels/reference.rst +12 -12
  38. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/plot/examples.rst +28 -28
  39. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/plot/index.rst +48 -48
  40. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/plot/overview.rst +42 -42
  41. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/plot/reference.rst +30 -30
  42. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/pyplot.rst +2 -2
  43. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/resizedialog.rst +1 -1
  44. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/rotatecrop.rst +1 -1
  45. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/selectdialog.rst +1 -1
  46. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/signals.rst +43 -43
  47. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/styles/index.rst +11 -11
  48. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/styles/overview.rst +19 -19
  49. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/styles/reference.rst +86 -86
  50. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/tools/examples.rst +10 -10
  51. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/tools/index.rst +12 -12
  52. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/tools/overview.rst +28 -28
  53. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/tools/reference.rst +168 -168
  54. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/my_plot_manager.svg +718 -718
  55. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/panorama-vertical.svg +494 -494
  56. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/panorama.svg +493 -493
  57. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/plot_widgets.svg +711 -711
  58. {plotpy-2.6.0 → plotpy-2.6.2}/doc/index.rst +55 -55
  59. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/examples.rst +146 -146
  60. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/index.rst +12 -12
  61. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/installation.rst +29 -29
  62. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/licenses.rst +1978 -1978
  63. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/motivation.rst +50 -50
  64. {plotpy-2.6.0 → plotpy-2.6.2}/doc/intro/overview.rst +127 -127
  65. {plotpy-2.6.0 → plotpy-2.6.2}/doc/requirements.rst +98 -98
  66. {plotpy-2.6.0 → plotpy-2.6.2}/doc/update_requirements.py +19 -19
  67. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/__init__.py +1 -1
  68. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/__init__.py +46 -46
  69. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/annotation.py +393 -393
  70. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/curvemarker.py +906 -906
  71. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/image.py +906 -906
  72. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/label.py +304 -304
  73. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/plot.py +411 -411
  74. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/builder/shape.py +192 -192
  75. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/config.py +38 -18
  76. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/constants.py +155 -155
  77. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/coords.py +93 -93
  78. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/colormaps_default.json +17069 -17069
  79. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/plotpy-banner.svg +529 -529
  80. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/plotpy-vertical.svg +529 -529
  81. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/plotpy.svg +412 -412
  82. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/zlog.svg +144 -144
  83. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/events.py +1797 -1797
  84. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/__init__.py +19 -19
  85. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/__init__.py +49 -49
  86. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_generic_range_slider.py +361 -361
  87. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_generic_slider.py +529 -529
  88. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_labeled.py +670 -670
  89. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_misc.py +32 -32
  90. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_range_style.py +340 -340
  91. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/external/sliders/_sliders.py +47 -47
  92. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/interfaces/__init__.py +23 -23
  93. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/interfaces/items.py +483 -483
  94. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/interfaces/panel.py +18 -18
  95. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/interfaces/plotmanager.py +38 -38
  96. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/io.py +768 -768
  97. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/__init__.py +67 -67
  98. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/annotation.py +881 -881
  99. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/contour.py +159 -159
  100. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/curve/__init__.py +7 -7
  101. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/curve/base.py +586 -586
  102. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/curve/errorbar.py +377 -377
  103. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/grid.py +255 -255
  104. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/histogram.py +239 -239
  105. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/__init__.py +21 -21
  106. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/base.py +1249 -1249
  107. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/filter.py +346 -346
  108. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/image_items.py +878 -878
  109. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/masked.py +731 -731
  110. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/misc.py +760 -760
  111. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/image/transform.py +628 -628
  112. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/label.py +1059 -1059
  113. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/polygonmap.py +439 -439
  114. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/__init__.py +15 -15
  115. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/axis.py +310 -310
  116. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/base.py +286 -286
  117. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/ellipse.py +345 -345
  118. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/marker.py +503 -503
  119. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/point.py +93 -93
  120. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/polygon.py +441 -441
  121. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/range.py +310 -310
  122. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/rectangle.py +326 -326
  123. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/segment.py +132 -132
  124. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/items/shape/svg.py +142 -142
  125. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/lutrange.py +67 -67
  126. {plotpy-2.6.0/plotpy/widgets → plotpy-2.6.2/plotpy/mathutils}/__init__.py +1 -1
  127. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/mathutils/arrayfuncs.py +74 -74
  128. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/mathutils/colormap.py +302 -302
  129. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/mathutils/geometry.py +260 -260
  130. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/mathutils/scaler.py +61 -61
  131. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/__init__.py +14 -14
  132. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/base.py +76 -76
  133. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/contrastadjustment.py +636 -636
  134. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/csection/__init__.py +25 -25
  135. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/csection/csitem.py +508 -508
  136. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/csection/csplot.py +499 -499
  137. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/csection/cswidget.py +415 -415
  138. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/panels/itemlist.py +281 -281
  139. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/plot/__init__.py +16 -16
  140. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/plot/base.py +2371 -2371
  141. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/plot/interactive.py +837 -837
  142. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/plot/manager.py +797 -797
  143. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/plot/plotwidget.py +1009 -1009
  144. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/pyplot.py +106 -106
  145. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/__init__.py +80 -80
  146. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/axes.py +217 -217
  147. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/base.py +611 -611
  148. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/curve.py +104 -104
  149. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/errorbar.py +63 -63
  150. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/histogram.py +126 -126
  151. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/image.py +695 -695
  152. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/label.py +301 -301
  153. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/polygonmap.py +55 -55
  154. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/styles/shape.py +463 -463
  155. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/__init__.py +35 -35
  156. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/benchmarks/__init__.py +20 -20
  157. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/benchmarks/test_benchmarks.py +189 -189
  158. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/benchmarks/test_bigimages.py +42 -42
  159. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/benchmarks/test_loadtest.py +95 -95
  160. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/conftest.py +32 -32
  161. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data/svg_target.svg +42 -42
  162. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data/svg_tool.svg +55 -55
  163. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data.py +177 -177
  164. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_auto_curve_image.py +34 -34
  165. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_autoscale_shapes.py +93 -93
  166. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_builder.py +50 -50
  167. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_colormap_editor.py +85 -85
  168. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_colormap_manager.py +68 -68
  169. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_computations.py +51 -51
  170. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_contrast.py +77 -77
  171. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_cursors.py +36 -36
  172. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_dicom_image.py +45 -45
  173. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_fit.py +34 -34
  174. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_image_coords.py +45 -45
  175. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_image_data_update.py +130 -130
  176. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_imagefilter.py +60 -60
  177. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_imagesuperp.py +53 -53
  178. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_loadsaveitems_hdf5.py +45 -45
  179. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_loadsaveitems_json.py +59 -59
  180. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_loadsaveitems_pickle.py +210 -210
  181. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_manager.py +100 -100
  182. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_no_auto_tools.py +30 -30
  183. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_plot_log.py +32 -32
  184. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_plot_types.py +41 -41
  185. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_plot_yreverse.py +32 -32
  186. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_pyplot.py +87 -87
  187. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/test_resize.py +28 -28
  188. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_annotations.py +39 -39
  189. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_curves.py +49 -49
  190. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_curves_highdpi.py +50 -50
  191. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_hist2d.py +79 -79
  192. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_histogram.py +32 -32
  193. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image.py +27 -27
  194. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image_contour.py +31 -31
  195. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image_masked.py +49 -49
  196. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image_masked_xy.py +48 -48
  197. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image_rgb.py +27 -27
  198. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_image_xy.py +31 -31
  199. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_mandelbrot.py +91 -91
  200. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_pcolor.py +86 -86
  201. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_polygons.py +90 -90
  202. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_svgshapes.py +29 -29
  203. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/test_transform.py +217 -217
  204. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_actiontool.py +48 -48
  205. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_cross_section.py +45 -45
  206. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_cross_section_line.py +81 -81
  207. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_cross_section_oblique.py +36 -36
  208. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_customize_shape_tool.py +73 -73
  209. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_cyclic_import.py +30 -30
  210. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_downsample_curve.py +64 -64
  211. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_edit_point.py +102 -102
  212. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_get_point.py +71 -71
  213. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_get_points.py +84 -84
  214. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_get_rectangle.py +37 -37
  215. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_get_rectangle_with_svg.py +54 -54
  216. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_get_segment.py +63 -63
  217. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_image_plot_tools.py +88 -88
  218. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_stats_tools.py +157 -157
  219. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/test_zaxislog.py +56 -56
  220. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_annotation_tools.py +131 -131
  221. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_aspect_ratio_tool.py +37 -37
  222. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_baseplot.py +66 -66
  223. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_builder_annotation.py +91 -91
  224. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_builder_image.py +125 -125
  225. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_builder_shape.py +68 -68
  226. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_cursor_tools.py +52 -52
  227. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_curve_tools.py +217 -217
  228. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_display_coords_tool.py +52 -52
  229. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_events.py +167 -167
  230. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_fontparam.py +21 -21
  231. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_geometry.py +89 -89
  232. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_line.py +61 -61
  233. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_line_cross_section_tool.py +26 -26
  234. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_manipulate_selection.py +427 -427
  235. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_mask_tool.py +60 -60
  236. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_multiline_tools.py +91 -91
  237. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_oblique_cross_section_tool.py +27 -27
  238. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_rect_zoom.py +69 -69
  239. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_seg_dist.py +30 -30
  240. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_styles.py +99 -99
  241. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/utils.py +242 -242
  242. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/vistools.py +55 -55
  243. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_dotarraydemo.py +213 -213
  244. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_filtertest1.py +93 -93
  245. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_filtertest2.py +115 -115
  246. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_fliprotate.py +56 -56
  247. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_plot_timecurve.py +419 -419
  248. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_qtdesigner.py +51 -51
  249. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_qtdesigner.ui +33 -33
  250. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_resize_dialog.py +68 -68
  251. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_rotatecrop.py +94 -94
  252. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_simple_dialog.py +115 -115
  253. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_simple_window.py +305 -305
  254. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/test_syncplot.py +92 -92
  255. plotpy-2.6.2/plotpy/tests/widgets/test_theme.py +64 -0
  256. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/__init__.py +98 -98
  257. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/annotation.py +87 -87
  258. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/axes.py +106 -106
  259. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/base.py +646 -646
  260. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/cross_section.py +145 -145
  261. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/cursor.py +140 -140
  262. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/curve.py +1215 -1215
  263. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/image.py +1392 -1392
  264. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/item.py +231 -231
  265. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/label.py +99 -99
  266. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/misc.py +344 -344
  267. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/plot.py +215 -215
  268. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/selection.py +171 -171
  269. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tools/shape.py +329 -329
  270. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/basetransform.py +310 -310
  271. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/colormap/__init__.py +16 -16
  272. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/colormap/_slider.py +65 -65
  273. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/colormap/editor.py +302 -302
  274. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/colormap/manager.py +438 -438
  275. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/colormap/widget.py +675 -675
  276. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/fit.py +1001 -1001
  277. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/imagefile.py +183 -183
  278. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/selectdialog.py +184 -184
  279. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy-tests.desktop +10 -10
  280. {plotpy-2.6.0 → plotpy-2.6.2}/pyproject.toml +113 -109
  281. {plotpy-2.6.0 → plotpy-2.6.2}/requirements.txt +19 -19
  282. {plotpy-2.6.0 → plotpy-2.6.2}/setup.cfg +4 -4
  283. {plotpy-2.6.0 → plotpy-2.6.2}/src/histogram2d.c +95 -95
  284. {plotpy-2.6.0 → plotpy-2.6.2}/src/mandelbrot.c +95 -95
  285. {plotpy-2.6.0 → plotpy-2.6.2}/src/scaler.cpp +923 -923
  286. plotpy-2.6.0/src/contour2d.c +0 -39917
  287. {plotpy-2.6.0 → plotpy-2.6.2}/MANIFEST.in +0 -0
  288. {plotpy-2.6.0 → plotpy-2.6.2}/PlotPy.egg-info/dependency_links.txt +0 -0
  289. {plotpy-2.6.0 → plotpy-2.6.2}/PlotPy.egg-info/entry_points.txt +0 -0
  290. {plotpy-2.6.0 → plotpy-2.6.2}/PlotPy.egg-info/top_level.txt +0 -0
  291. {plotpy-2.6.0 → plotpy-2.6.2}/doc/_static/favicon.ico +0 -0
  292. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/io.rst +0 -0
  293. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/mathutils/colormaps.rst +0 -0
  294. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/mathutils/geometry.rst +0 -0
  295. {plotpy-2.6.0 → plotpy-2.6.2}/doc/features/mathutils/scaler.rst +0 -0
  296. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/my_plot_manager.png +0 -0
  297. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/panorama-vertical.png +0 -0
  298. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/panorama.png +0 -0
  299. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/plot_widgets.png +0 -0
  300. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/plotpy-banner.png +0 -0
  301. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/plotpy-vertical.png +0 -0
  302. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/__init__.png +0 -0
  303. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/computations.png +0 -0
  304. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/contrast.png +0 -0
  305. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/cross_section.png +0 -0
  306. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/cross_section2.png +0 -0
  307. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/dotarraydemo.png +0 -0
  308. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/filtertest1.png +0 -0
  309. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/filtertest2.png +0 -0
  310. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/fit.png +0 -0
  311. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/get_point.png +0 -0
  312. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/hist2d.png +0 -0
  313. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/image_plot_tools.png +0 -0
  314. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/imagefilter.png +0 -0
  315. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/imagesuperp.png +0 -0
  316. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/imagexy.png +0 -0
  317. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/manager.png +0 -0
  318. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/mandelbrot.png +0 -0
  319. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/pcolor.png +0 -0
  320. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/plot.png +0 -0
  321. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/simple_dialog.png +0 -0
  322. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/simple_window.png +0 -0
  323. {plotpy-2.6.0 → plotpy-2.6.2}/doc/images/screenshots/transform.png +0 -0
  324. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/apply.png +0 -0
  325. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/arredit.png +0 -0
  326. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/arrow_down.png +0 -0
  327. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/arrow_up.png +0 -0
  328. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/autorefresh.png +0 -0
  329. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/autoscale.png +0 -0
  330. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/axes.png +0 -0
  331. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/busy.png +0 -0
  332. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/cell_edit.png +0 -0
  333. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/center.png +0 -0
  334. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/cmap_edit.png +0 -0
  335. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/contrast.png +0 -0
  336. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/copy.png +0 -0
  337. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/copytoclipboard.png +0 -0
  338. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csapplylut.png +0 -0
  339. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csautoscale.png +0 -0
  340. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csection.png +0 -0
  341. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csection_a.png +0 -0
  342. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csection_line.png +0 -0
  343. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csection_oblique.png +0 -0
  344. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/csperimage.png +0 -0
  345. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curve_downsample.png +0 -0
  346. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvestyles/dots.png +0 -0
  347. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvestyles/lines.png +0 -0
  348. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvestyles/steps.png +0 -0
  349. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvestyles/sticks.png +0 -0
  350. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvetypes/xfy.png +0 -0
  351. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/curvetypes/yfx.png +0 -0
  352. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/delete.png +0 -0
  353. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/edit.png +0 -0
  354. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/edit_point_selection.png +0 -0
  355. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/edit.png +0 -0
  356. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/edit_add.png +0 -0
  357. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/editcopy.png +0 -0
  358. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/editdelete.png +0 -0
  359. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/editpaste.png +0 -0
  360. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/fileimport.png +0 -0
  361. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/filesave.png +0 -0
  362. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/imshow.png +0 -0
  363. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/insert.png +0 -0
  364. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/plot.png +0 -0
  365. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/editors/rename.png +0 -0
  366. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/eliminate_outliers.png +0 -0
  367. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/eraser.png +0 -0
  368. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/exit.png +0 -0
  369. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/expander_down.png +0 -0
  370. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/expander_right.png +0 -0
  371. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/export.png +0 -0
  372. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/file.png +0 -0
  373. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/fileclose.png +0 -0
  374. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/fileimport.png +0 -0
  375. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filenew.png +0 -0
  376. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/fileopen.png +0 -0
  377. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filesave.png +0 -0
  378. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filesaveas.png +0 -0
  379. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/doc.png +0 -0
  380. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/gif.png +0 -0
  381. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/html.png +0 -0
  382. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/jpg.png +0 -0
  383. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/pdf.png +0 -0
  384. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/png.png +0 -0
  385. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/pps.png +0 -0
  386. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/ps.png +0 -0
  387. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/tar.png +0 -0
  388. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/tgz.png +0 -0
  389. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/tif.png +0 -0
  390. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/txt.png +0 -0
  391. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/xls.png +0 -0
  392. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/filetypes/zip.png +0 -0
  393. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/font.png +0 -0
  394. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/full_range.png +0 -0
  395. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/funct.png +0 -0
  396. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/hcursor.png +0 -0
  397. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/hflip.png +0 -0
  398. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/imagestats.png +0 -0
  399. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/item_list.png +0 -0
  400. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/annotation.png +0 -0
  401. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/curve.png +0 -0
  402. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/errorbar.png +0 -0
  403. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/grid.png +0 -0
  404. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/histogram.png +0 -0
  405. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/histogram2d.png +0 -0
  406. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/image.png +0 -0
  407. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/label.png +0 -0
  408. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/legend.png +0 -0
  409. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/items/polygonmap.png +0 -0
  410. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/magnifier.png +0 -0
  411. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/cross.png +0 -0
  412. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/diamond.png +0 -0
  413. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/ellipse.png +0 -0
  414. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/hexagon.png +0 -0
  415. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/point.png +0 -0
  416. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/square.png +0 -0
  417. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/star.png +0 -0
  418. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/triangle_d.png +0 -0
  419. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/triangle_l.png +0 -0
  420. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/triangle_r.png +0 -0
  421. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/triangle_u.png +0 -0
  422. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markers/xcross.png +0 -0
  423. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markerstyles/cross_marker.png +0 -0
  424. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markerstyles/horiz_marker.png +0 -0
  425. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/markerstyles/vert_marker.png +0 -0
  426. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/mask/mask_circle.png +0 -0
  427. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/mask/mask_circle_outside.png +0 -0
  428. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/mask/mask_rectangle.png +0 -0
  429. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/mask/mask_rectangle_outside.png +0 -0
  430. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/mask/mask_tool.png +0 -0
  431. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/max.png +0 -0
  432. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/min.png +0 -0
  433. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/move.png +0 -0
  434. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/multipoint_selection.png +0 -0
  435. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/none.png +0 -0
  436. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/not_found.png +0 -0
  437. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/on_curve.png +0 -0
  438. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/bdiagpattern.png +0 -0
  439. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/crosspattern.png +0 -0
  440. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense1pattern.png +0 -0
  441. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense2pattern.png +0 -0
  442. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense3pattern.png +0 -0
  443. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense4pattern.png +0 -0
  444. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense5pattern.png +0 -0
  445. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense6pattern.png +0 -0
  446. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/dense7pattern.png +0 -0
  447. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/diagcrosspattern.png +0 -0
  448. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/fdiagpattern.png +0 -0
  449. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/horpattern.png +0 -0
  450. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/nobrush.png +0 -0
  451. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/solidpattern.png +0 -0
  452. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/patterns/verpattern.png +0 -0
  453. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/point_selection.png +0 -0
  454. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/print.png +0 -0
  455. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/python.png +0 -0
  456. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/quickview.png +0 -0
  457. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/rectangular_select.png +0 -0
  458. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/refresh.png +0 -0
  459. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/save_all.png +0 -0
  460. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/scales/lin_lin.png +0 -0
  461. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/scales/lin_log.png +0 -0
  462. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/scales/log_lin.png +0 -0
  463. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/scales/log_log.png +0 -0
  464. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/selection.png +0 -0
  465. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/settings.png +0 -0
  466. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shape.png +0 -0
  467. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/circle.png +0 -0
  468. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/contour.png +0 -0
  469. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/ellipse_shape.png +0 -0
  470. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/freeform.png +0 -0
  471. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/gtaxes.png +0 -0
  472. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/marker.png +0 -0
  473. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/oblique_rectangle.png +0 -0
  474. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/point_shape.png +0 -0
  475. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/polyline.png +0 -0
  476. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/rectangle.png +0 -0
  477. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/shapes/segment.png +0 -0
  478. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/snapshot.png +0 -0
  479. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/styles/dash.png +0 -0
  480. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/styles/dashdot.png +0 -0
  481. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/styles/dashdotdot.png +0 -0
  482. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/styles/dot.png +0 -0
  483. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/styles/solid.png +0 -0
  484. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/trash.png +0 -0
  485. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/trimage_lock.png +0 -0
  486. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/trimage_unlock.png +0 -0
  487. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/vcursor.png +0 -0
  488. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/vflip.png +0 -0
  489. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/xcursor.png +0 -0
  490. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/xmax.png +0 -0
  491. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/xmin.png +0 -0
  492. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/data/icons/xrange.png +0 -0
  493. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
  494. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data/brain.png +0 -0
  495. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data/brain_cylinder.png +0 -0
  496. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/data/mr-brain.dcm +0 -0
  497. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/features/__init__.py +0 -0
  498. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/items/__init__.py +0 -0
  499. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/tools/__init__.py +0 -0
  500. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/__init__.py +0 -0
  501. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_builder_curve.py +0 -0
  502. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_contour.py +0 -0
  503. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_io.py +0 -0
  504. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_plot_curve.py +0 -0
  505. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_plot_image.py +0 -0
  506. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/unit/test_tools_export.py +0 -0
  507. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/tests/widgets/__init__.py +0 -0
  508. {plotpy-2.6.0/plotpy/mathutils → plotpy-2.6.2/plotpy/widgets}/__init__.py +0 -0
  509. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/about.py +0 -0
  510. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/fliprotate.py +0 -0
  511. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/qtdesigner.py +0 -0
  512. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/resizedialog.py +0 -0
  513. {plotpy-2.6.0 → plotpy-2.6.2}/plotpy/widgets/rotatecrop.py +0 -0
  514. {plotpy-2.6.0 → plotpy-2.6.2}/qtdesigner/plotplugin.py +0 -0
  515. {plotpy-2.6.0 → plotpy-2.6.2}/setup.py +0 -0
  516. {plotpy-2.6.0 → plotpy-2.6.2}/src/arrays.hpp +0 -0
  517. {plotpy-2.6.0 → plotpy-2.6.2}/src/debug.hpp +0 -0
  518. {plotpy-2.6.0 → plotpy-2.6.2}/src/histogram2d.pyx +0 -0
  519. {plotpy-2.6.0 → plotpy-2.6.2}/src/mandelbrot.pyx +0 -0
  520. {plotpy-2.6.0 → plotpy-2.6.2}/src/pcolor.cpp +0 -0
  521. {plotpy-2.6.0 → plotpy-2.6.2}/src/points.hpp +0 -0
  522. {plotpy-2.6.0 → plotpy-2.6.2}/src/scaler.hpp +0 -0
  523. {plotpy-2.6.0 → plotpy-2.6.2}/src/traits.hpp +0 -0
@@ -1,438 +1,452 @@
1
- # Changelog #
2
-
3
- ## Version 2.6.0 ##
4
-
5
- 💥 New features / Enhancements:
6
-
7
- * Added support for color theme change at execution (relies on guidata V3.6)
8
- * Changed strategy for default plot widget size:
9
- * No default size is applied to the plot widget anymore (before, the default size was 800x600 pixels)
10
- * Added parameter `size` to `PlotDialog`, `PlotWindow` classes, and `make.dialog`, `make.window` functions to set the initial size of the plot widget
11
-
12
- 🛠️ Bug fixes:
13
-
14
- * Fixed segment line cross section computation for masked images:
15
- * Avoided warning message when encountering masked values in the image data
16
- * Replacing masked values by NaNs when computing the segment line cross section (as before, but explicitely, to avoid the warning message)
17
-
18
- ## Version 2.5.1 ##
19
-
20
- ℹ️ Release V2.5.0 was a fugitive release that was replaced by V2.5.1 due to packaging issues.
21
-
22
- In this release, test coverage is 79%.
23
-
24
- 💥 New features / Enhancements:
25
-
26
- * Alternative dictionary argument for plot options:
27
- * This new feature was introduced in the context of the cyclic import bug fix, to avoid importing the `plotpy.plot` module just to get the `PlotOptions` or `BasePlotOptions` classes
28
- * All classes (and a few functions) that used to take an `options` argument as a `BasePlotOptions` or `PlotOptions` instance now also accept a dictionary argument with the same keys as the `BasePlotOptions` or `PlotOptions` class attributes, and the same values as the corresponding attributes
29
- * This concerns the following classes and functions:
30
- * `plotpy.plot.BasePlot`
31
- * `plotpy.plot.PlotWidget`
32
- * `plotpy.plot.PlotDialog`
33
- * `plotpy.plot.PlotWindow`
34
- * `plotpy.plot.SubPlotWidget`
35
- * `plotpy.plot.SyncPlotWindow`
36
- * `plotpy.tools.RotateCropTool`
37
- * `plotpy.widgets.fit.FitDialog`
38
- * `plotpy.widgets.fliprotate.FlipRotateDialog`
39
- * `plotpy.widgets.rotatecrop.RotateCropDialog`
40
- * `plotpy.widgets.selectdialog.SelectDialog`
41
- * `plotpy.widgets.selectdialog.select_with_shape_tool`
42
-
43
- * Added "Lock LUT range" option for image items:
44
- * This new option is disabled by default, which matches the previous behavior: when updating an image item data, the LUT range is automatically adjusted to the new data range (if not passed as an argument to the `BaseImageItem.set_data` method)
45
- * When enabled, the LUT range is locked and the LUT range is not adjusted when updating the image item data
46
- * The option is available in image parameters dialog
47
- * A new tool `LockLUTRangeTool` has been implemented to toggle the option from the plot context menu: the tool is not registered by default in the plot widget, but can be added by the host application if needed
48
- * See test script `tests.features.test_image_data_update` for an example of usage of the new option and tool
49
-
50
- * Added missing `set_style` method to `XRangeSelection` class: this method is used to set the style of the range selection item from configuration options
51
-
52
- 🛠️ Bug fixes:
53
-
54
- * [Issue #19](https://github.com/PlotPyStack/PlotPy/issues/19) - Fix `distutils` deprecation in setup.py: replaced `distutils.core` by `setuptools` in the setup.py script to avoid the deprecation warning when building the package with Python 3.10 and 3.11, and to ensure compatibility with earlier Python versions (PlotPy is already compatible with the most recent Python versions: this only concerns the build system)
55
- * Fix cyclic import in `plotpy.tools` module:
56
- * Some tools in `plotpy.tools` subpackage were importing the `plotpy.plot` module, which was importing the `plotpy.tools` module, causing a cyclic import issue
57
- * This is now fixed by introducing new constants for axis IDs in the `plotpy.constants` module, and using them everywhere in the code, thus avoiding to import the `plotpy.plot` module just to get the axis IDs
58
- * Fix empty label in X/Y cross section plots:
59
- * This is a regression introduced in V2.1.0
60
- * When showing the X/Y cross section plots (using the plot context menu), an empty label was displayed at the center of each of those plots
61
- * The label now shows "Enable a marker" as previously
62
- * Fix historic unexpected behavior of interactive tools:
63
- * When triggering an interactive tool (e.g. by clicking on the corresponding toolbar button), the tool `activate` method was called twice, which was not expected, but was not causing any issue given the current implementation
64
- * However, when defining custom interactive tools, this behavior could lead to unexpected results (i.e. really executing activation actions twice)
65
- * This is now fixed: the `activate` method is called only once when triggering an interactive tool
66
-
67
- ## Version 2.4.2 ##
68
-
69
- In this release, test coverage is 79%.
70
-
71
- 🛠️ Bug fixes:
72
-
73
- * [Issue #17](https://github.com/PlotPyStack/PlotPy/issues/17):
74
- * Debian's Python team has reported that the contour unit test was failing on `arm64` architecture
75
- * This is the opportunity to replace the `contour2d` Cython extension by scikit-image's `find_contours` function, thus avoiding to reinvent the wheel by relying on a more robust and tested implementation
76
- * The `contour2d` Cython extension is removed from the source code
77
- * The contour related features remain the same, but the implementation is now based on scikit-image's `find_contours` function
78
- * The scikit-image dependency is added to the package requirements
79
-
80
- ## Version 2.4.1 ##
81
-
82
- In this release, test coverage is 79%.
83
-
84
- 🛠️ Bug fixes:
85
-
86
- * Contrast adjustment panel:
87
- * A regression was introduced in V2.0.0: levels histogram was no longer removed from contrast adjustment panel when the associated image was removed from the plot
88
- * This is now fixed: when an image is removed, the histogram is removed as well and the contrast panel is refreshed (which was not the case even before the regression)
89
-
90
- ## Version 2.4.0 ##
91
-
92
- In this release, test coverage is 79%.
93
-
94
- 💥 New features / Enhancements:
95
-
96
- * Contrast adjustment panel:
97
- * New layout: the vertical toolbar (which was constrained in a small area on the right side of the panel) is now a horizontal toolbar at the top of the panel, beside the title
98
- * New "Set range" button: allows the user to set manually the minimum and maximum values of the histogram range
99
- * New Z-axis logarithmic scale feature:
100
- * Added new tool `ZAxisLogTool` to toggle the Z-axis logarithmic scale
101
- * The tool is registered by default in the plot widget, like the `ColormapTool`
102
- * When enabled, the active image item is displayed after applying a base-10 logarithm to its pixel values
103
- * Curve statistics tool `CurveStatsTool` is now customizable:
104
- * When adding the tool: `plot_widget.manager.add_tool(CurveStatsTool, labelfuncs=(...))`
105
- * Or after: `plot_widget.manager.get_tool(CurveStatsTool).set_labelfuncs(...)`
106
- * The `labelfuncs` parameter is a list of tuples `(label, func)` where `label` is the label displayed in the statistics table, and `func` is a function that takes the curve data and returns the corresponding statistic value (see the documentation for more details)
107
- * Image statistics tool `ImageStatsTool` is now customizable:
108
- * When adding the tool: `plot_widget.manager.add_tool(ImageStatsTool, stats_func=...)`
109
- * Or after: `plot_widget.manager.get_tool(ImageStatsTool).set_stats_func(...)`
110
- * The `stats_func` parameter is a function that takes the image item and selected rectangle coordinates, and returns a string with the statistics to display
111
- * New `SIG_AXIS_PARAMETERS_CHANGED` signal emitted by `BasePlot` when the axes parameters are changed (e.g. when the axes are inverted, or the scale is changed)
112
- * New "Reverse X axis" feature:
113
- * Added new tool `ReverseXAxisTool` to toggle the X-axis direction
114
- * The tool is registered by default in the plot widget, like its Y-axis counterpart
115
-
116
- 🛠️ Bug fixes:
117
-
118
- * Contrast adjustment panel:
119
- * Fixed histogram update issues when no image was currently selected (even if the an image was displayed and was selected before)
120
- * Histogram range was not updated when either the minimum or maximum value was set using the "Minimum value" or "Maximum value" buttons (which have been renamed to "Min." and "Max." in this release)
121
- * Histogram range was not updated when the "Set full range" button was clicked
122
- * Image parameters: contrast range was not updated when the image Z axis bounds were changed using the "Parameters" dialog
123
-
124
- 🧹 API cleanup:
125
-
126
- * Deprecated `AnnotationParam.update_annotation` method: use `update_item` instead
127
- * Deprecated `AxesShapeParam.update_axes` method: use `update_item` instead
128
- * Deprecated `AxesParam.update_axes` method: use `update_item` instead
129
- * Deprecated `ImageAxesParam.update_axes` method: use `update_item` instead
130
- * Deprecated `LabelParam.update_label` method: use `update_item` instead
131
- * Deprecated `MarkerParam.update_marker` method: use `update_item` instead
132
- * Deprecated `RangeShapeParam.update_range` method: use `update_item` instead
133
- * Deprecated `ShapeParam.update_shape` method: use `update_item` instead
134
-
135
- ## Version 2.3.5 ##
136
-
137
- This release is mainly intended to fix the Windows binary distribution, which was not supporting NumPy 2.0.
138
-
139
- 🛠️ Bug fixes:
140
-
141
- * Moved back `conftest.py` to the `tests` folder (was in the root folder), so that `pytest` can be executed with proper configuration when running the test suite from the installed package
142
-
143
- * Removed benchmarks from automated test suite (not relevant for the end user): added `plotpy-benchmarks` script to run the benchmarks
144
-
145
- ## Version 2.3.4 ##
146
-
147
- In this release, test coverage is 79%.
148
-
149
- 🛠️ Bug fixes:
150
-
151
- * Add support for NumPy 2.0:
152
- * Updated build system to use NumPy 2.0 on Python > 3.8 and NumPy 1 on Python 3.8
153
- * Use `numpy.asarray` instead of `numpy.array(..., copy=False)`
154
- * Use `numpy.isin` instead of `numpy.in1d`
155
- * Use `scipy.integrate.trapezoid` instead of `numpy.trapz`
156
-
157
- * `ColorMapManager`: fix segmentation fault with PySide6 on Linux
158
-
159
- ## Version 2.3.3 ##
160
-
161
- In this release, test coverage is 79%.
162
-
163
- 🛠️ Bug fixes:
164
-
165
- * Moved up `LineCrossSection` import for consistency with other cross-section panels
166
- * Unexpected behavior regarding `io.load_items` and `io.save_items` functions:
167
- * Those functions were serializing and deserializing most of the parameters of the plot items, but not their visibility state
168
- * This is now fixed: the visibility state of the plot items is now saved and restored as expected
169
-
170
- ℹ️ Other changes:
171
-
172
- * Explicitely exclude NumPy V2 from the dependencies (not compatible yet)
173
-
174
- ## Version 2.3.2 ##
175
-
176
- In this release, test coverage is 79%.
177
-
178
- Version 2.3.2 fixes a blocking issue with the colormap editor unit test introduced in version 2.3.1. The latter is a fugitive release that was not announced.
179
-
180
- 💥 New features / Enhancements:
181
-
182
- * Colormap: added "Apply" button to the colormap manager
183
- * Automated test suite:
184
- * Test coverage has been improved from 75% to 79%
185
- * The following features are now covered by unit tests:
186
- * Panning with the mouse move events
187
- * Zooming with the mouse wheel/move events
188
- * Curve statistics tool
189
- * Image rotation and translations via `SelectTool` (simulating mouse events)
190
- * Masked areas in images and `ImageMaskTool`
191
- * `LockTrImageTool`
192
- * Cursor tools (`HCursorTool`, `VCursorTool`, `XCursorTool` and `HRangeTool`)
193
- * `DisplayCoordsTool`: simulation of 'Alt' and 'Ctrl' keys
194
- * Complete coverage for `MultiLineTool` and `FreeFormTool`
195
- * Selection tools (`RectangularSelectionTool` and `SelectTool`)
196
-
197
- 🛠️ Bug fixes:
198
-
199
- * Image statistics tool: fixed "No available data" message when the tool rectangular region top Y coordinate is above the image top Y coordinate
200
- * Label items (`LabelItem`, `LegendBoxItem`, `DataInfoLabel`, ...) were not emitting the `SIG_ITEM_MOVED` signal when moved interactively (with the mouse) if the item anchor was attached to the canvas
201
- * Colormap: fixed context menu entry update (colormap icon was updated as expected, but the colormap name was not)
202
- * Rotate/crop dialog: added missing toolbar on plot widget
203
- * Flip/rotate dialog: added missing toolbar on plot widget
204
- * Fixed issue with oblique averaged cross section computation (`AttributeError` when clicking on the empty cross section plot)
205
-
206
- ## Version 2.3.0 ##
207
-
208
- In this release, test coverage is 75%.
209
-
210
- 💥 New features:
211
-
212
- * Added support for colormap inversion:
213
- * The user can now invert the colormap of an image item:
214
- * From the image parameters dialog ("Invert colormap" checkbox)
215
- * From the plot context menu (right-click on the image item)
216
- * `BaseImageItem.set_color_map` method takes a new `invert` parameter (which defaults to `None`, meaning that the behavior is unchanged)
217
- * New `ReverseColormapTool`: registered by default in the plot widget, like the `ColormapTool` (add the "Invert colormap" entry in the context menu of the image)
218
-
219
- 🛠️ Bug fixes:
220
-
221
- * `ErrorBarCurveItem`: fixed NumPy deprecation warning ("Conversion of an array with ndim > 0 to a scalar is deprecated [...]")
222
-
223
- ℹ️ Other changes:
224
-
225
- * Image plot items deserialization:
226
- * When an image plot item is deserialized, and needs to be reloaded from a file, the file path is adapted to the current working directory if file is not found (this is the legacy behavior).
227
- * An unnecessary call to `ImageIOHandler.adapt_path` method was removed from the `RawImageItem.deserialize` method: this issue has to be handled by the host application, not by the PlotPy library.
228
- * `ImageIOHandler`: removed `add_change_path` and `adapt_path` methods
229
- * Fix typo in `tests.features.test_colormap_editor` module: renamed function `test_colormap_manager` to `test_colormap_editor`
230
- * Removed unnecessary `BaseImageItem.get_color_map_name` method
231
-
232
- ## Version 2.2.0 ##
233
-
234
- In this release, test coverage is 75%.
235
-
236
- New features:
237
-
238
- * Added `SIG_ITEM_PARAMETERS_CHANGED` signal to `BasePlot` class:
239
- * This signal is emitted when the parameters of an item are changed using the parameters dialog, or a specific tool (e.g. the colormap selection tool, or the lock/unlock tool for image items)
240
- * This signal is emitted with the item as argument
241
- * It is often emitted before the `SIG_ITEMS_CHANGED` signal, which is global to all items, but not necessarily. For example, when the colormap of an image is changed, the `SIG_ITEM_PARAMETERS_CHANGED` signal is emitted for the image item, but the `SIG_ITEMS_CHANGED` signal is not emitted.
242
- * Added new colormap presets:
243
- * `viridis`, `plasma`, `inferno`, `magma`, `cividis`
244
- * `afmhot`
245
- * `coolwarm`, `bwr`, `seismic`
246
- * `gnuplot2`, `CMRmap`, `rainbow`, `turbo`
247
- * Fixed all qualitative colormaps:
248
- * All qualitative colormaps have been re-computed because they are not supposed to be interpolated, which was the case and made them unusable
249
- * The qualitative colormaps are now usable and look like the ones from Matplotlib
250
- * Colormap manager:
251
- * Added a button to remove a custom colormap
252
- * The preset colormaps *and* the currently selected colormap are read-only
253
- * Added automatic unit tests for interactive tools:
254
- * `AnnotatedCircleTool`, `AnnotatedEllipseTool`, `AnnotatedObliqueRectangleTool`, `AnnotatedPointTool`, `AnnotatedRectangleTool`, `AnnotatedSegmentTool`
255
- * `AverageCrossSectionTool`, `CrossSectionTool`, `ObliqueCrossSectionTool`, `LineCrossSectionTool`
256
- * `EditPointTool`, `SelectPointsTool`, `SelectPointTool`
257
- * `AspectRatioTool`, `ImageStatsTool`, `SnapshotTool`
258
- * `DisplayCoordsTool`, `RectZoomTool`
259
- * `CircleTool`, `EllipseTool`, `FreeFormTool`, `MultiLineTool`, `ObliqueRectangleTool`, `PointTool`, `RectangleTool`, `SegmentTool`
260
- * Internal package reorganization: moved icons to `plotpy/data/icons` folder
261
-
262
- ## Version 2.1.2 ##
263
-
264
- New features:
265
-
266
- * Added `Echelon` alpha function to the image parameters:
267
- * The `Echelon` alpha function is a step function, so that the alpha channel is 0 (full transparency) for the lowest value of the Lookup Table (LUT) and opaque (transparency level set by the `Global alpha` parameter) for the other values
268
- * This feature is added to the other existing alpha functions: `Constant`, `Linear`, `Sigmoid`, and `Hyperbolic tangent`
269
-
270
- Bug fixes:
271
-
272
- * Compatibility with PythonQwt 0.12.
273
-
274
- ## Version 2.1.1 ##
275
-
276
- Bug fixes:
277
-
278
- * API breakage (unintentional) in V2.1.0:
279
- * In V2.1.0, `mathutils.colormap` module was renamed to `mathutils.colormaps`
280
- * Original `mathutils.colormap` module naming is restored in this release
281
- * Colormap selection from the toolbar was not triggering the `SIG_ITEMS_CHANGED` signal (every time an item parameter is changed, the `SIG_ITEMS_CHANGED` signal has to be emitted by the `BasePlot` instance to notify the application that the plot has been modified)
282
-
283
- ## Version 2.1.0 ##
284
-
285
- In this release, test coverage is 71%.
286
-
287
- New features:
288
-
289
- * Curve-related features:
290
- * New `tools.SelectPointsTool` to select graphically multiple points on a plot
291
- * New `tools.EditPointTool` to edit graphically the position of a point on a plot
292
- * New downsampling feature:
293
- * The user may enable it to reduce the number of points displayed on a curve (e.g. when the curve is too dense)
294
- * The downsampling factor is adjustable (default to 10, i.e. 1 point out of 10 is displayed)
295
- * The feature is disabled by default
296
- * Image-related features:
297
- * New "Colormap Manager":
298
- * Before this release, the colormap selection was limited to presets (e.g. "gray", "jet", etc.)
299
- * Now, the user can select a preset, edit it, or create a new one from scratch thanks to the new "Colormap Manager" dialog
300
- * New line cross section feature:
301
- * Before this release, the cross section feature was limited to either horizontal or vertical lines, or an average cross section withing a rectangle (aligned with the axes, or oblique)
302
- * Now, the user can draw a line cross section with the new "Line Cross Section" tool: the intensity profile associated to the drawn segment is displayed in a dedicated plot
303
- * Added support for gestures:
304
- * Zooming in/out with the a two-finger pinch gesture
305
- * Panning with a two-finger drag gesture
306
-
307
- Documentation:
308
-
309
- * Reorganized some sections
310
- * Added sections on new features
311
-
312
- Bug fixes:
313
-
314
- * Fixed critical bug in oblique cross section feature (regression introduced in 2.0.0)
315
- * Removed dependency to `pytest-qt` for the test suite (due to Qt6 compatibility issues)
316
-
317
- ## Version 2.0.3 ##
318
-
319
- Bug fixes:
320
-
321
- * [Issue #9](https://github.com/PlotPyStack/PlotPy/issues/9) - MacOS: `error: a space is required between consecutive right angle brackets (use '> >')`
322
-
323
- ## Version 2.0.2 ##
324
-
325
- Bug fixes:
326
-
327
- * [Issue #3](https://github.com/PlotPyStack/PlotPy/issues/3) - `PlotWidget`: `ZeroDivisionError` on resize while ignoring constraints
328
- * [Issue #4](https://github.com/PlotPyStack/PlotPy/issues/4) - Average cross section: `RuntimeWarning: Mean of empty slice.`
329
- * [Issue #5](https://github.com/PlotPyStack/PlotPy/issues/5) - Contrast panel: levels histogram is sometimes not updated
330
- * [Issue #6](https://github.com/PlotPyStack/PlotPy/issues/6) - 1D Histogram items are not properly drawn
331
- * [Issue #7](https://github.com/PlotPyStack/PlotPy/issues/7) - Contrast panel: histogram may contains zeros periodically due to improper bin sizes
332
- * [Issue #8](https://github.com/PlotPyStack/PlotPy/issues/8) - Contrast panel: switch back to default tool after selecting min/max
333
-
334
- ## Version 2.0.1 ##
335
-
336
- Bug fixes:
337
-
338
- * Fixed `plotpy.tools.AnnotatedEllipseTool`: `AttributeError` when finalizing the shape
339
- * `plotpy.widgets.select_with_shape_tool`: added missing `toolbar` and `options` parameters
340
- * `items.XRangeSelection` is now serializable, as expected
341
-
342
- Documentation:
343
-
344
- * `plotpy.plot.SyncPlotWindow`: added missing documentation
345
- * Added more information on PlotPyStack
346
- * New "Motivation" section explaining the reasons behind the creation of PlotPy
347
-
348
- ## Version 2.0.0 ##
349
-
350
- This version is the first release of the 2.0 series, which is distributed under the [BSD 3-Clause License](https://opensource.org/licenses/BSD-3-Clause).
351
-
352
- PlotPy 2.0 is a major release that brings a lot of new features and bug fixes.
353
-
354
- When initiated in 2016, PlotPy 1.0 was the result of the merge of two projects (as well as some other changes, e.g. a redesign of the API):
355
-
356
- * [guidata](https://pypi.org/project/guidata/), a Python library generating graphical user interfaces for easy dataset editing and display
357
- * [guiqwt](https://pypi.org/project/guiqwt/), a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development
358
-
359
- With PlotPy 2.0, the [guidata](https://pypi.org/project/guidata/) code base has been reextracted: PlotPy now relies on [guidata](https://pypi.org/project/guidata/) as a dependency, like before the merge.
360
-
361
- PlotPy 2.0 also integrates all the bug fixes (>30) and new features that were added to [guiqwt](https://pypi.org/project/guiqwt/) since the merge (i.e. between 2016 and 2023).
362
-
363
- Supported versions of Python and Qt bindings have been updated:
364
-
365
- * Python: 3.8, 3.9, and 3.10 (3.11 should work too, but will be officially supported when dropping support for Python 3.8, to keep a 3-year support period)
366
- * Qt bindings: PyQt5 (even if PyQt6 and PySide6 are not officially supported, efforts have been made and will continue to be made to support them)
367
-
368
- PlotPy 2.0 is a major release because it also brings a lot of new features:
369
-
370
- * `plot.PlotWidget`, `plot.PlotDialog`, and `plot.PlotWindow`: API overhaul (simple, more consistent, more flexible, more extensible - see documentation for details)
371
- * `plot.SyncPlotWindow`: new class to show multiple plots in a single window, in a synchronized way (zoom, pan, etc.)
372
- * `widgets.selectdialog.SelectDialog`: a dialog box to select items using a shape tool (segment, rectangle or custom)
373
- * Image lookup table (LUT):
374
- * Initially, the LUT alpha channel was either constant (input parameter `alpha` was a float between 0 and 1) or linearly dependent on the image pixel values (when the `alpha_mask` parameter was enabled)
375
- * Now, the LUT may be either constant (same as before) or dependent on the image pixel values but not only linearly: the LUT alpha channel may follow a linear, a sigmoid or an hyperbolic tangent function (see the new `alpha_function` parameter). The old `alpha_mask` parameter was removed
376
- * Image pixels are now centered on their coordinates:
377
- * This means that the pixel at row `i` and column `j` is centered on the point `(j, i)` (before, the top-left corner of the pixel at row `i` and column `j` was centered on the point `(j, i)`)
378
- * This convention is more consistent with the way images are displayed in other scientific image processing tools
379
- * This is one of the benefits of porting back [guiqwt](https://pypi.org/project/guiqwt/) changes since the merge (i.e. between 2016 and 2023)
380
- * New SVG-based shapes:
381
- * `items.RectangleSVGShape`: rectangle shape based on SVG data or file
382
- * `items.SquareSVGShape`: square shape based on SVG data or file
383
- * `items.CircleSVGShape`: circle shape based on SVG data or file
384
- * `builder.PlotBuilder`:
385
- * Renamed `PlotBuilder` (originally `guiqwt.builder.PlotItemBuilder`)
386
- * Builder instance is still available using `from plotpy.builder import make`
387
- * Plot widget creation is now supported:
388
- * `make.widget()` for `plot.PlotWidget`
389
- * `make.dialog()` for `plot.PlotDialog`
390
- * `make.window()` for `plot.PlotWindow`
391
- * Added support for more plot items:
392
- * `make.contours()` for generating a list of `items.ContourItem` objects
393
- * `make.annotated_point()` for `items.AnnotatedPoint`
394
- * `make.polygon()` for `items.PolygonShape`
395
- * `make.svg()` for `items.RectangleSVGShape`, `items.SquareSVGShape`, and `items.CircleSVGShape`
396
- * Added JSON serialization support for all plot items (curve, image, etc.)
397
-
398
- * Brand new documentation, based on Sphinx with links to other projects API, examples and tutorials (e.g. on development related topics).
399
- * Black code formatting on all Python files
400
- * New automated test suite:
401
- * Automatic execution: `--unattended` command line option (Qt loop is bypassed)
402
- * Test suite based on `pytest`, supporting `pytest-cov` for coverage testing, `pytest-xvfb` for headless testing, and `pytest-qt` for Qt testing
403
- * Added support for Coverage: test coverage improved up to 70%
404
- * Added typing annotations on (almost) all Python files
405
- * Distribution: switched to `pyproject.toml` (still relying on `setuptools` and `setup.py` for building Cython/C++ extensions)
406
- * Added code quality configuration files:
407
- * `.pylintrc`: pylint configuration file
408
- * `.isort.cfg`: isort configuration file
409
- * `.coveragerc`: coverage configuration file
410
- * Added Visual Studio Code configuration files:
411
- * `.vscode/settings.json`: Python interpreter, code formatting, etc.
412
- * `.vscode/tasks.json`: build, test, etc.
413
- * `.vscode/launch.json`: run current file, run tests, etc.
414
-
415
- PlotPy 2.0 also brings a lot of bug fixes and improvements:
416
-
417
- * Handled all Cython/C++ extensions compilation warnings
418
- * Fixed all NumPy deprecation issues (e.g. `numpy.matrix`)
419
- * Fixed (annotated) circle/ellipse item creation/test
420
- * Fixed all documentation build warnings
421
- * Fixed regressions introduced by PlotPy V1 on top of guiqwt:
422
- * Global references for the Debian package management
423
- * Major aspect ratio issues:
424
- * When resizing the plot widget (images were downsized indefinitely)
425
- * When auto-scaling the plot widget (images were not displayed entirely)
426
- * `TrImageItem` rotation algorithm
427
- * Oblique cross-section test
428
- * About dialog, version informations
429
- * Ported all [guiqwt](https://pypi.org/project/guiqwt/) bug fixes since the merge (i.e. between 2016 and 2023):
430
- * Added support for Visual Studio 2015 and earlier
431
- * Speeding-up image alpha channel calculation
432
- * Optimized colormap icon caching
433
- * X-axis direction and auto-scale
434
- * Added load test (with a very large number of plot widgets)
435
- * Coordinates inversion in `EllipseShape`
436
- * ValueError with levels histogram
437
- * Various fixes regarding plot item creation, cross-section features, PyQt5 support, DICOM support, TIFF support, etc.
438
- * Etc.
1
+ # Changelog #
2
+
3
+ ## Version 2.6.2 ##
4
+
5
+ 💥 New features / Enhancements:
6
+
7
+ * Added Wheel packages for all major platforms on PyPI:
8
+ * Windows (32/64bits), MacOS, Linux
9
+ * Python 3.8 to 3.12
10
+
11
+ 🛠️ Bug fixes:
12
+
13
+ * Fixed color theme support (dark/light mode), leveraging the new `guidata` V3.6 feature
14
+
15
+ ## Version 2.6.1 ##
16
+
17
+ ℹ️ Release V2.6.0 was a fugitive release that was replaced by V2.6.1 due to a critical bug in the segment line cross section computation for masked images.
18
+
19
+ 💥 New features / Enhancements:
20
+
21
+ * Added support for color theme change at execution (relies on guidata V3.6)
22
+ * Changed strategy for default plot widget size:
23
+ * No default size is applied to the plot widget anymore (before, the default size was 800x600 pixels)
24
+ * Added parameter `size` to `PlotDialog`, `PlotWindow` classes, and `make.dialog`, `make.window` functions to set the initial size of the plot widget
25
+
26
+ 🛠️ Bug fixes:
27
+
28
+ * Fixed segment line cross section computation for masked images:
29
+ * Avoided warning message when encountering masked values in the image data
30
+ * Replacing masked values by NaNs when computing the segment line cross section (as before, but explicitely, to avoid the warning message)
31
+
32
+ ## Version 2.5.1 ##
33
+
34
+ ℹ️ Release V2.5.0 was a fugitive release that was replaced by V2.5.1 due to packaging issues.
35
+
36
+ In this release, test coverage is 79%.
37
+
38
+ 💥 New features / Enhancements:
39
+
40
+ * Alternative dictionary argument for plot options:
41
+ * This new feature was introduced in the context of the cyclic import bug fix, to avoid importing the `plotpy.plot` module just to get the `PlotOptions` or `BasePlotOptions` classes
42
+ * All classes (and a few functions) that used to take an `options` argument as a `BasePlotOptions` or `PlotOptions` instance now also accept a dictionary argument with the same keys as the `BasePlotOptions` or `PlotOptions` class attributes, and the same values as the corresponding attributes
43
+ * This concerns the following classes and functions:
44
+ * `plotpy.plot.BasePlot`
45
+ * `plotpy.plot.PlotWidget`
46
+ * `plotpy.plot.PlotDialog`
47
+ * `plotpy.plot.PlotWindow`
48
+ * `plotpy.plot.SubPlotWidget`
49
+ * `plotpy.plot.SyncPlotWindow`
50
+ * `plotpy.tools.RotateCropTool`
51
+ * `plotpy.widgets.fit.FitDialog`
52
+ * `plotpy.widgets.fliprotate.FlipRotateDialog`
53
+ * `plotpy.widgets.rotatecrop.RotateCropDialog`
54
+ * `plotpy.widgets.selectdialog.SelectDialog`
55
+ * `plotpy.widgets.selectdialog.select_with_shape_tool`
56
+
57
+ * Added "Lock LUT range" option for image items:
58
+ * This new option is disabled by default, which matches the previous behavior: when updating an image item data, the LUT range is automatically adjusted to the new data range (if not passed as an argument to the `BaseImageItem.set_data` method)
59
+ * When enabled, the LUT range is locked and the LUT range is not adjusted when updating the image item data
60
+ * The option is available in image parameters dialog
61
+ * A new tool `LockLUTRangeTool` has been implemented to toggle the option from the plot context menu: the tool is not registered by default in the plot widget, but can be added by the host application if needed
62
+ * See test script `tests.features.test_image_data_update` for an example of usage of the new option and tool
63
+
64
+ * Added missing `set_style` method to `XRangeSelection` class: this method is used to set the style of the range selection item from configuration options
65
+
66
+ 🛠️ Bug fixes:
67
+
68
+ * [Issue #19](https://github.com/PlotPyStack/PlotPy/issues/19) - Fix `distutils` deprecation in setup.py: replaced `distutils.core` by `setuptools` in the setup.py script to avoid the deprecation warning when building the package with Python 3.10 and 3.11, and to ensure compatibility with earlier Python versions (PlotPy is already compatible with the most recent Python versions: this only concerns the build system)
69
+ * Fix cyclic import in `plotpy.tools` module:
70
+ * Some tools in `plotpy.tools` subpackage were importing the `plotpy.plot` module, which was importing the `plotpy.tools` module, causing a cyclic import issue
71
+ * This is now fixed by introducing new constants for axis IDs in the `plotpy.constants` module, and using them everywhere in the code, thus avoiding to import the `plotpy.plot` module just to get the axis IDs
72
+ * Fix empty label in X/Y cross section plots:
73
+ * This is a regression introduced in V2.1.0
74
+ * When showing the X/Y cross section plots (using the plot context menu), an empty label was displayed at the center of each of those plots
75
+ * The label now shows "Enable a marker" as previously
76
+ * Fix historic unexpected behavior of interactive tools:
77
+ * When triggering an interactive tool (e.g. by clicking on the corresponding toolbar button), the tool `activate` method was called twice, which was not expected, but was not causing any issue given the current implementation
78
+ * However, when defining custom interactive tools, this behavior could lead to unexpected results (i.e. really executing activation actions twice)
79
+ * This is now fixed: the `activate` method is called only once when triggering an interactive tool
80
+
81
+ ## Version 2.4.2 ##
82
+
83
+ In this release, test coverage is 79%.
84
+
85
+ 🛠️ Bug fixes:
86
+
87
+ * [Issue #17](https://github.com/PlotPyStack/PlotPy/issues/17):
88
+ * Debian's Python team has reported that the contour unit test was failing on `arm64` architecture
89
+ * This is the opportunity to replace the `contour2d` Cython extension by scikit-image's `find_contours` function, thus avoiding to reinvent the wheel by relying on a more robust and tested implementation
90
+ * The `contour2d` Cython extension is removed from the source code
91
+ * The contour related features remain the same, but the implementation is now based on scikit-image's `find_contours` function
92
+ * The scikit-image dependency is added to the package requirements
93
+
94
+ ## Version 2.4.1 ##
95
+
96
+ In this release, test coverage is 79%.
97
+
98
+ 🛠️ Bug fixes:
99
+
100
+ * Contrast adjustment panel:
101
+ * A regression was introduced in V2.0.0: levels histogram was no longer removed from contrast adjustment panel when the associated image was removed from the plot
102
+ * This is now fixed: when an image is removed, the histogram is removed as well and the contrast panel is refreshed (which was not the case even before the regression)
103
+
104
+ ## Version 2.4.0 ##
105
+
106
+ In this release, test coverage is 79%.
107
+
108
+ 💥 New features / Enhancements:
109
+
110
+ * Contrast adjustment panel:
111
+ * New layout: the vertical toolbar (which was constrained in a small area on the right side of the panel) is now a horizontal toolbar at the top of the panel, beside the title
112
+ * New "Set range" button: allows the user to set manually the minimum and maximum values of the histogram range
113
+ * New Z-axis logarithmic scale feature:
114
+ * Added new tool `ZAxisLogTool` to toggle the Z-axis logarithmic scale
115
+ * The tool is registered by default in the plot widget, like the `ColormapTool`
116
+ * When enabled, the active image item is displayed after applying a base-10 logarithm to its pixel values
117
+ * Curve statistics tool `CurveStatsTool` is now customizable:
118
+ * When adding the tool: `plot_widget.manager.add_tool(CurveStatsTool, labelfuncs=(...))`
119
+ * Or after: `plot_widget.manager.get_tool(CurveStatsTool).set_labelfuncs(...)`
120
+ * The `labelfuncs` parameter is a list of tuples `(label, func)` where `label` is the label displayed in the statistics table, and `func` is a function that takes the curve data and returns the corresponding statistic value (see the documentation for more details)
121
+ * Image statistics tool `ImageStatsTool` is now customizable:
122
+ * When adding the tool: `plot_widget.manager.add_tool(ImageStatsTool, stats_func=...)`
123
+ * Or after: `plot_widget.manager.get_tool(ImageStatsTool).set_stats_func(...)`
124
+ * The `stats_func` parameter is a function that takes the image item and selected rectangle coordinates, and returns a string with the statistics to display
125
+ * New `SIG_AXIS_PARAMETERS_CHANGED` signal emitted by `BasePlot` when the axes parameters are changed (e.g. when the axes are inverted, or the scale is changed)
126
+ * New "Reverse X axis" feature:
127
+ * Added new tool `ReverseXAxisTool` to toggle the X-axis direction
128
+ * The tool is registered by default in the plot widget, like its Y-axis counterpart
129
+
130
+ 🛠️ Bug fixes:
131
+
132
+ * Contrast adjustment panel:
133
+ * Fixed histogram update issues when no image was currently selected (even if the an image was displayed and was selected before)
134
+ * Histogram range was not updated when either the minimum or maximum value was set using the "Minimum value" or "Maximum value" buttons (which have been renamed to "Min." and "Max." in this release)
135
+ * Histogram range was not updated when the "Set full range" button was clicked
136
+ * Image parameters: contrast range was not updated when the image Z axis bounds were changed using the "Parameters" dialog
137
+
138
+ 🧹 API cleanup:
139
+
140
+ * Deprecated `AnnotationParam.update_annotation` method: use `update_item` instead
141
+ * Deprecated `AxesShapeParam.update_axes` method: use `update_item` instead
142
+ * Deprecated `AxesParam.update_axes` method: use `update_item` instead
143
+ * Deprecated `ImageAxesParam.update_axes` method: use `update_item` instead
144
+ * Deprecated `LabelParam.update_label` method: use `update_item` instead
145
+ * Deprecated `MarkerParam.update_marker` method: use `update_item` instead
146
+ * Deprecated `RangeShapeParam.update_range` method: use `update_item` instead
147
+ * Deprecated `ShapeParam.update_shape` method: use `update_item` instead
148
+
149
+ ## Version 2.3.5 ##
150
+
151
+ This release is mainly intended to fix the Windows binary distribution, which was not supporting NumPy 2.0.
152
+
153
+ 🛠️ Bug fixes:
154
+
155
+ * Moved back `conftest.py` to the `tests` folder (was in the root folder), so that `pytest` can be executed with proper configuration when running the test suite from the installed package
156
+
157
+ * Removed benchmarks from automated test suite (not relevant for the end user): added `plotpy-benchmarks` script to run the benchmarks
158
+
159
+ ## Version 2.3.4 ##
160
+
161
+ In this release, test coverage is 79%.
162
+
163
+ 🛠️ Bug fixes:
164
+
165
+ * Add support for NumPy 2.0:
166
+ * Updated build system to use NumPy 2.0 on Python > 3.8 and NumPy 1 on Python 3.8
167
+ * Use `numpy.asarray` instead of `numpy.array(..., copy=False)`
168
+ * Use `numpy.isin` instead of `numpy.in1d`
169
+ * Use `scipy.integrate.trapezoid` instead of `numpy.trapz`
170
+
171
+ * `ColorMapManager`: fix segmentation fault with PySide6 on Linux
172
+
173
+ ## Version 2.3.3 ##
174
+
175
+ In this release, test coverage is 79%.
176
+
177
+ 🛠️ Bug fixes:
178
+
179
+ * Moved up `LineCrossSection` import for consistency with other cross-section panels
180
+ * Unexpected behavior regarding `io.load_items` and `io.save_items` functions:
181
+ * Those functions were serializing and deserializing most of the parameters of the plot items, but not their visibility state
182
+ * This is now fixed: the visibility state of the plot items is now saved and restored as expected
183
+
184
+ ℹ️ Other changes:
185
+
186
+ * Explicitely exclude NumPy V2 from the dependencies (not compatible yet)
187
+
188
+ ## Version 2.3.2 ##
189
+
190
+ In this release, test coverage is 79%.
191
+
192
+ Version 2.3.2 fixes a blocking issue with the colormap editor unit test introduced in version 2.3.1. The latter is a fugitive release that was not announced.
193
+
194
+ 💥 New features / Enhancements:
195
+
196
+ * Colormap: added "Apply" button to the colormap manager
197
+ * Automated test suite:
198
+ * Test coverage has been improved from 75% to 79%
199
+ * The following features are now covered by unit tests:
200
+ * Panning with the mouse move events
201
+ * Zooming with the mouse wheel/move events
202
+ * Curve statistics tool
203
+ * Image rotation and translations via `SelectTool` (simulating mouse events)
204
+ * Masked areas in images and `ImageMaskTool`
205
+ * `LockTrImageTool`
206
+ * Cursor tools (`HCursorTool`, `VCursorTool`, `XCursorTool` and `HRangeTool`)
207
+ * `DisplayCoordsTool`: simulation of 'Alt' and 'Ctrl' keys
208
+ * Complete coverage for `MultiLineTool` and `FreeFormTool`
209
+ * Selection tools (`RectangularSelectionTool` and `SelectTool`)
210
+
211
+ 🛠️ Bug fixes:
212
+
213
+ * Image statistics tool: fixed "No available data" message when the tool rectangular region top Y coordinate is above the image top Y coordinate
214
+ * Label items (`LabelItem`, `LegendBoxItem`, `DataInfoLabel`, ...) were not emitting the `SIG_ITEM_MOVED` signal when moved interactively (with the mouse) if the item anchor was attached to the canvas
215
+ * Colormap: fixed context menu entry update (colormap icon was updated as expected, but the colormap name was not)
216
+ * Rotate/crop dialog: added missing toolbar on plot widget
217
+ * Flip/rotate dialog: added missing toolbar on plot widget
218
+ * Fixed issue with oblique averaged cross section computation (`AttributeError` when clicking on the empty cross section plot)
219
+
220
+ ## Version 2.3.0 ##
221
+
222
+ In this release, test coverage is 75%.
223
+
224
+ 💥 New features:
225
+
226
+ * Added support for colormap inversion:
227
+ * The user can now invert the colormap of an image item:
228
+ * From the image parameters dialog ("Invert colormap" checkbox)
229
+ * From the plot context menu (right-click on the image item)
230
+ * `BaseImageItem.set_color_map` method takes a new `invert` parameter (which defaults to `None`, meaning that the behavior is unchanged)
231
+ * New `ReverseColormapTool`: registered by default in the plot widget, like the `ColormapTool` (add the "Invert colormap" entry in the context menu of the image)
232
+
233
+ 🛠️ Bug fixes:
234
+
235
+ * `ErrorBarCurveItem`: fixed NumPy deprecation warning ("Conversion of an array with ndim > 0 to a scalar is deprecated [...]")
236
+
237
+ ℹ️ Other changes:
238
+
239
+ * Image plot items deserialization:
240
+ * When an image plot item is deserialized, and needs to be reloaded from a file, the file path is adapted to the current working directory if file is not found (this is the legacy behavior).
241
+ * An unnecessary call to `ImageIOHandler.adapt_path` method was removed from the `RawImageItem.deserialize` method: this issue has to be handled by the host application, not by the PlotPy library.
242
+ * `ImageIOHandler`: removed `add_change_path` and `adapt_path` methods
243
+ * Fix typo in `tests.features.test_colormap_editor` module: renamed function `test_colormap_manager` to `test_colormap_editor`
244
+ * Removed unnecessary `BaseImageItem.get_color_map_name` method
245
+
246
+ ## Version 2.2.0 ##
247
+
248
+ In this release, test coverage is 75%.
249
+
250
+ New features:
251
+
252
+ * Added `SIG_ITEM_PARAMETERS_CHANGED` signal to `BasePlot` class:
253
+ * This signal is emitted when the parameters of an item are changed using the parameters dialog, or a specific tool (e.g. the colormap selection tool, or the lock/unlock tool for image items)
254
+ * This signal is emitted with the item as argument
255
+ * It is often emitted before the `SIG_ITEMS_CHANGED` signal, which is global to all items, but not necessarily. For example, when the colormap of an image is changed, the `SIG_ITEM_PARAMETERS_CHANGED` signal is emitted for the image item, but the `SIG_ITEMS_CHANGED` signal is not emitted.
256
+ * Added new colormap presets:
257
+ * `viridis`, `plasma`, `inferno`, `magma`, `cividis`
258
+ * `afmhot`
259
+ * `coolwarm`, `bwr`, `seismic`
260
+ * `gnuplot2`, `CMRmap`, `rainbow`, `turbo`
261
+ * Fixed all qualitative colormaps:
262
+ * All qualitative colormaps have been re-computed because they are not supposed to be interpolated, which was the case and made them unusable
263
+ * The qualitative colormaps are now usable and look like the ones from Matplotlib
264
+ * Colormap manager:
265
+ * Added a button to remove a custom colormap
266
+ * The preset colormaps *and* the currently selected colormap are read-only
267
+ * Added automatic unit tests for interactive tools:
268
+ * `AnnotatedCircleTool`, `AnnotatedEllipseTool`, `AnnotatedObliqueRectangleTool`, `AnnotatedPointTool`, `AnnotatedRectangleTool`, `AnnotatedSegmentTool`
269
+ * `AverageCrossSectionTool`, `CrossSectionTool`, `ObliqueCrossSectionTool`, `LineCrossSectionTool`
270
+ * `EditPointTool`, `SelectPointsTool`, `SelectPointTool`
271
+ * `AspectRatioTool`, `ImageStatsTool`, `SnapshotTool`
272
+ * `DisplayCoordsTool`, `RectZoomTool`
273
+ * `CircleTool`, `EllipseTool`, `FreeFormTool`, `MultiLineTool`, `ObliqueRectangleTool`, `PointTool`, `RectangleTool`, `SegmentTool`
274
+ * Internal package reorganization: moved icons to `plotpy/data/icons` folder
275
+
276
+ ## Version 2.1.2 ##
277
+
278
+ New features:
279
+
280
+ * Added `Echelon` alpha function to the image parameters:
281
+ * The `Echelon` alpha function is a step function, so that the alpha channel is 0 (full transparency) for the lowest value of the Lookup Table (LUT) and opaque (transparency level set by the `Global alpha` parameter) for the other values
282
+ * This feature is added to the other existing alpha functions: `Constant`, `Linear`, `Sigmoid`, and `Hyperbolic tangent`
283
+
284
+ Bug fixes:
285
+
286
+ * Compatibility with PythonQwt 0.12.
287
+
288
+ ## Version 2.1.1 ##
289
+
290
+ Bug fixes:
291
+
292
+ * API breakage (unintentional) in V2.1.0:
293
+ * In V2.1.0, `mathutils.colormap` module was renamed to `mathutils.colormaps`
294
+ * Original `mathutils.colormap` module naming is restored in this release
295
+ * Colormap selection from the toolbar was not triggering the `SIG_ITEMS_CHANGED` signal (every time an item parameter is changed, the `SIG_ITEMS_CHANGED` signal has to be emitted by the `BasePlot` instance to notify the application that the plot has been modified)
296
+
297
+ ## Version 2.1.0 ##
298
+
299
+ In this release, test coverage is 71%.
300
+
301
+ New features:
302
+
303
+ * Curve-related features:
304
+ * New `tools.SelectPointsTool` to select graphically multiple points on a plot
305
+ * New `tools.EditPointTool` to edit graphically the position of a point on a plot
306
+ * New downsampling feature:
307
+ * The user may enable it to reduce the number of points displayed on a curve (e.g. when the curve is too dense)
308
+ * The downsampling factor is adjustable (default to 10, i.e. 1 point out of 10 is displayed)
309
+ * The feature is disabled by default
310
+ * Image-related features:
311
+ * New "Colormap Manager":
312
+ * Before this release, the colormap selection was limited to presets (e.g. "gray", "jet", etc.)
313
+ * Now, the user can select a preset, edit it, or create a new one from scratch thanks to the new "Colormap Manager" dialog
314
+ * New line cross section feature:
315
+ * Before this release, the cross section feature was limited to either horizontal or vertical lines, or an average cross section withing a rectangle (aligned with the axes, or oblique)
316
+ * Now, the user can draw a line cross section with the new "Line Cross Section" tool: the intensity profile associated to the drawn segment is displayed in a dedicated plot
317
+ * Added support for gestures:
318
+ * Zooming in/out with the a two-finger pinch gesture
319
+ * Panning with a two-finger drag gesture
320
+
321
+ Documentation:
322
+
323
+ * Reorganized some sections
324
+ * Added sections on new features
325
+
326
+ Bug fixes:
327
+
328
+ * Fixed critical bug in oblique cross section feature (regression introduced in 2.0.0)
329
+ * Removed dependency to `pytest-qt` for the test suite (due to Qt6 compatibility issues)
330
+
331
+ ## Version 2.0.3 ##
332
+
333
+ Bug fixes:
334
+
335
+ * [Issue #9](https://github.com/PlotPyStack/PlotPy/issues/9) - MacOS: `error: a space is required between consecutive right angle brackets (use '> >')`
336
+
337
+ ## Version 2.0.2 ##
338
+
339
+ Bug fixes:
340
+
341
+ * [Issue #3](https://github.com/PlotPyStack/PlotPy/issues/3) - `PlotWidget`: `ZeroDivisionError` on resize while ignoring constraints
342
+ * [Issue #4](https://github.com/PlotPyStack/PlotPy/issues/4) - Average cross section: `RuntimeWarning: Mean of empty slice.`
343
+ * [Issue #5](https://github.com/PlotPyStack/PlotPy/issues/5) - Contrast panel: levels histogram is sometimes not updated
344
+ * [Issue #6](https://github.com/PlotPyStack/PlotPy/issues/6) - 1D Histogram items are not properly drawn
345
+ * [Issue #7](https://github.com/PlotPyStack/PlotPy/issues/7) - Contrast panel: histogram may contains zeros periodically due to improper bin sizes
346
+ * [Issue #8](https://github.com/PlotPyStack/PlotPy/issues/8) - Contrast panel: switch back to default tool after selecting min/max
347
+
348
+ ## Version 2.0.1 ##
349
+
350
+ Bug fixes:
351
+
352
+ * Fixed `plotpy.tools.AnnotatedEllipseTool`: `AttributeError` when finalizing the shape
353
+ * `plotpy.widgets.select_with_shape_tool`: added missing `toolbar` and `options` parameters
354
+ * `items.XRangeSelection` is now serializable, as expected
355
+
356
+ Documentation:
357
+
358
+ * `plotpy.plot.SyncPlotWindow`: added missing documentation
359
+ * Added more information on PlotPyStack
360
+ * New "Motivation" section explaining the reasons behind the creation of PlotPy
361
+
362
+ ## Version 2.0.0 ##
363
+
364
+ This version is the first release of the 2.0 series, which is distributed under the [BSD 3-Clause License](https://opensource.org/licenses/BSD-3-Clause).
365
+
366
+ PlotPy 2.0 is a major release that brings a lot of new features and bug fixes.
367
+
368
+ When initiated in 2016, PlotPy 1.0 was the result of the merge of two projects (as well as some other changes, e.g. a redesign of the API):
369
+
370
+ * [guidata](https://pypi.org/project/guidata/), a Python library generating graphical user interfaces for easy dataset editing and display
371
+ * [guiqwt](https://pypi.org/project/guiqwt/), a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development
372
+
373
+ With PlotPy 2.0, the [guidata](https://pypi.org/project/guidata/) code base has been reextracted: PlotPy now relies on [guidata](https://pypi.org/project/guidata/) as a dependency, like before the merge.
374
+
375
+ PlotPy 2.0 also integrates all the bug fixes (>30) and new features that were added to [guiqwt](https://pypi.org/project/guiqwt/) since the merge (i.e. between 2016 and 2023).
376
+
377
+ Supported versions of Python and Qt bindings have been updated:
378
+
379
+ * Python: 3.8, 3.9, and 3.10 (3.11 should work too, but will be officially supported when dropping support for Python 3.8, to keep a 3-year support period)
380
+ * Qt bindings: PyQt5 (even if PyQt6 and PySide6 are not officially supported, efforts have been made and will continue to be made to support them)
381
+
382
+ PlotPy 2.0 is a major release because it also brings a lot of new features:
383
+
384
+ * `plot.PlotWidget`, `plot.PlotDialog`, and `plot.PlotWindow`: API overhaul (simple, more consistent, more flexible, more extensible - see documentation for details)
385
+ * `plot.SyncPlotWindow`: new class to show multiple plots in a single window, in a synchronized way (zoom, pan, etc.)
386
+ * `widgets.selectdialog.SelectDialog`: a dialog box to select items using a shape tool (segment, rectangle or custom)
387
+ * Image lookup table (LUT):
388
+ * Initially, the LUT alpha channel was either constant (input parameter `alpha` was a float between 0 and 1) or linearly dependent on the image pixel values (when the `alpha_mask` parameter was enabled)
389
+ * Now, the LUT may be either constant (same as before) or dependent on the image pixel values but not only linearly: the LUT alpha channel may follow a linear, a sigmoid or an hyperbolic tangent function (see the new `alpha_function` parameter). The old `alpha_mask` parameter was removed
390
+ * Image pixels are now centered on their coordinates:
391
+ * This means that the pixel at row `i` and column `j` is centered on the point `(j, i)` (before, the top-left corner of the pixel at row `i` and column `j` was centered on the point `(j, i)`)
392
+ * This convention is more consistent with the way images are displayed in other scientific image processing tools
393
+ * This is one of the benefits of porting back [guiqwt](https://pypi.org/project/guiqwt/) changes since the merge (i.e. between 2016 and 2023)
394
+ * New SVG-based shapes:
395
+ * `items.RectangleSVGShape`: rectangle shape based on SVG data or file
396
+ * `items.SquareSVGShape`: square shape based on SVG data or file
397
+ * `items.CircleSVGShape`: circle shape based on SVG data or file
398
+ * `builder.PlotBuilder`:
399
+ * Renamed `PlotBuilder` (originally `guiqwt.builder.PlotItemBuilder`)
400
+ * Builder instance is still available using `from plotpy.builder import make`
401
+ * Plot widget creation is now supported:
402
+ * `make.widget()` for `plot.PlotWidget`
403
+ * `make.dialog()` for `plot.PlotDialog`
404
+ * `make.window()` for `plot.PlotWindow`
405
+ * Added support for more plot items:
406
+ * `make.contours()` for generating a list of `items.ContourItem` objects
407
+ * `make.annotated_point()` for `items.AnnotatedPoint`
408
+ * `make.polygon()` for `items.PolygonShape`
409
+ * `make.svg()` for `items.RectangleSVGShape`, `items.SquareSVGShape`, and `items.CircleSVGShape`
410
+ * Added JSON serialization support for all plot items (curve, image, etc.)
411
+
412
+ * Brand new documentation, based on Sphinx with links to other projects API, examples and tutorials (e.g. on development related topics).
413
+ * Black code formatting on all Python files
414
+ * New automated test suite:
415
+ * Automatic execution: `--unattended` command line option (Qt loop is bypassed)
416
+ * Test suite based on `pytest`, supporting `pytest-cov` for coverage testing, `pytest-xvfb` for headless testing, and `pytest-qt` for Qt testing
417
+ * Added support for Coverage: test coverage improved up to 70%
418
+ * Added typing annotations on (almost) all Python files
419
+ * Distribution: switched to `pyproject.toml` (still relying on `setuptools` and `setup.py` for building Cython/C++ extensions)
420
+ * Added code quality configuration files:
421
+ * `.pylintrc`: pylint configuration file
422
+ * `.isort.cfg`: isort configuration file
423
+ * `.coveragerc`: coverage configuration file
424
+ * Added Visual Studio Code configuration files:
425
+ * `.vscode/settings.json`: Python interpreter, code formatting, etc.
426
+ * `.vscode/tasks.json`: build, test, etc.
427
+ * `.vscode/launch.json`: run current file, run tests, etc.
428
+
429
+ PlotPy 2.0 also brings a lot of bug fixes and improvements:
430
+
431
+ * Handled all Cython/C++ extensions compilation warnings
432
+ * Fixed all NumPy deprecation issues (e.g. `numpy.matrix`)
433
+ * Fixed (annotated) circle/ellipse item creation/test
434
+ * Fixed all documentation build warnings
435
+ * Fixed regressions introduced by PlotPy V1 on top of guiqwt:
436
+ * Global references for the Debian package management
437
+ * Major aspect ratio issues:
438
+ * When resizing the plot widget (images were downsized indefinitely)
439
+ * When auto-scaling the plot widget (images were not displayed entirely)
440
+ * `TrImageItem` rotation algorithm
441
+ * Oblique cross-section test
442
+ * About dialog, version informations
443
+ * Ported all [guiqwt](https://pypi.org/project/guiqwt/) bug fixes since the merge (i.e. between 2016 and 2023):
444
+ * Added support for Visual Studio 2015 and earlier
445
+ * Speeding-up image alpha channel calculation
446
+ * Optimized colormap icon caching
447
+ * X-axis direction and auto-scale
448
+ * Added load test (with a very large number of plot widgets)
449
+ * Coordinates inversion in `EllipseShape`
450
+ * ValueError with levels histogram
451
+ * Various fixes regarding plot item creation, cross-section features, PyQt5 support, DICOM support, TIFF support, etc.
452
+ * Etc.