PlotPy 2.8.1__tar.gz → 2.8.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 (530) hide show
  1. {plotpy-2.8.1 → plotpy-2.8.2}/CHANGELOG.md +10 -0
  2. {plotpy-2.8.1/PlotPy.egg-info → plotpy-2.8.2}/PKG-INFO +1 -1
  3. {plotpy-2.8.1 → plotpy-2.8.2/PlotPy.egg-info}/PKG-INFO +1 -1
  4. {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/SOURCES.txt +2 -0
  5. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/__init__.py +1 -1
  6. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/masked.py +19 -6
  7. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/manager.py +1 -0
  8. plotpy-2.8.2/plotpy/tests/benchmarks/test_large_number_of_annotations.py +122 -0
  9. plotpy-2.8.2/plotpy/tests/unit/test_masked_dtype_change.py +125 -0
  10. {plotpy-2.8.1 → plotpy-2.8.2}/src/histogram2d.c +146 -146
  11. {plotpy-2.8.1 → plotpy-2.8.2}/src/mandelbrot.c +146 -146
  12. {plotpy-2.8.1 → plotpy-2.8.2}/LICENSE +0 -0
  13. {plotpy-2.8.1 → plotpy-2.8.2}/MANIFEST.in +0 -0
  14. {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/dependency_links.txt +0 -0
  15. {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/entry_points.txt +0 -0
  16. {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/requires.txt +0 -0
  17. {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/top_level.txt +0 -0
  18. {plotpy-2.8.1 → plotpy-2.8.2}/README.md +0 -0
  19. {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/README.md +0 -0
  20. {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/_cm.py +0 -0
  21. {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/colormap.py +0 -0
  22. {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/matplotlib_cmaps.py +0 -0
  23. {plotpy-2.8.1 → plotpy-2.8.2}/doc/_static/favicon.ico +0 -0
  24. {plotpy-2.8.1 → plotpy-2.8.2}/doc/changelog.rst +0 -0
  25. {plotpy-2.8.1 → plotpy-2.8.2}/doc/conf.py +0 -0
  26. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/build.rst +0 -0
  27. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/contribute.rst +0 -0
  28. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/guiqwt_to_plotpy.csv +0 -0
  29. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/guiqwt_to_plotpy.rst +0 -0
  30. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/index.rst +0 -0
  31. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/platforms.rst +0 -0
  32. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_guidata_v3.csv +0 -0
  33. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_v2.csv +0 -0
  34. {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_v2.rst +0 -0
  35. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/colormapmanager.rst +0 -0
  36. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/events.rst +0 -0
  37. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/fit.rst +0 -0
  38. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/fliprotate.rst +0 -0
  39. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/imagefile.rst +0 -0
  40. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/index.rst +0 -0
  41. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/io.rst +0 -0
  42. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/builder.rst +0 -0
  43. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/examples.rst +0 -0
  44. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/index.rst +0 -0
  45. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/overview.rst +0 -0
  46. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/reference.rst +0 -0
  47. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/colormaps.rst +0 -0
  48. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/geometry.rst +0 -0
  49. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/index.rst +0 -0
  50. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/scaler.rst +0 -0
  51. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/index.rst +0 -0
  52. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/overview.rst +0 -0
  53. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/reference.rst +0 -0
  54. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/examples.rst +0 -0
  55. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/index.rst +0 -0
  56. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/overview.rst +0 -0
  57. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/reference.rst +0 -0
  58. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/pyplot.rst +0 -0
  59. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/resizedialog.rst +0 -0
  60. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/rotatecrop.rst +0 -0
  61. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/selectdialog.rst +0 -0
  62. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/signals.rst +0 -0
  63. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/index.rst +0 -0
  64. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/overview.rst +0 -0
  65. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/reference.rst +0 -0
  66. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/examples.rst +0 -0
  67. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/index.rst +0 -0
  68. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/overview.rst +0 -0
  69. {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/reference.rst +0 -0
  70. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/my_plot_manager.png +0 -0
  71. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/my_plot_manager.svg +0 -0
  72. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama-vertical.png +0 -0
  73. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama-vertical.svg +0 -0
  74. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama.png +0 -0
  75. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama.svg +0 -0
  76. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plot_widgets.png +0 -0
  77. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plot_widgets.svg +0 -0
  78. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plotpy-banner.png +0 -0
  79. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plotpy-vertical.png +0 -0
  80. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/__init__.png +0 -0
  81. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/computations.png +0 -0
  82. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/contrast.png +0 -0
  83. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/cross_section.png +0 -0
  84. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/cross_section2.png +0 -0
  85. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/dotarraydemo.png +0 -0
  86. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/filtertest1.png +0 -0
  87. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/filtertest2.png +0 -0
  88. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/fit.png +0 -0
  89. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/get_point.png +0 -0
  90. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/hist2d.png +0 -0
  91. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/image_plot_tools.png +0 -0
  92. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagefilter.png +0 -0
  93. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagesuperp.png +0 -0
  94. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagexy.png +0 -0
  95. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/manager.png +0 -0
  96. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/mandelbrot.png +0 -0
  97. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/pcolor.png +0 -0
  98. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/plot.png +0 -0
  99. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/simple_dialog.png +0 -0
  100. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/simple_window.png +0 -0
  101. {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/transform.png +0 -0
  102. {plotpy-2.8.1 → plotpy-2.8.2}/doc/index.rst +0 -0
  103. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/examples.rst +0 -0
  104. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/index.rst +0 -0
  105. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/installation.rst +0 -0
  106. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/licenses.rst +0 -0
  107. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/motivation.rst +0 -0
  108. {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/overview.rst +0 -0
  109. {plotpy-2.8.1 → plotpy-2.8.2}/doc/requirements.rst +0 -0
  110. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/__init__.py +0 -0
  111. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/annotation.py +0 -0
  112. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/curvemarker.py +0 -0
  113. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/image.py +0 -0
  114. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/label.py +0 -0
  115. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/plot.py +0 -0
  116. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/shape.py +0 -0
  117. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/config.py +0 -0
  118. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/constants.py +0 -0
  119. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/coords.py +0 -0
  120. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/colormaps_default.json +0 -0
  121. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/apply.png +0 -0
  122. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arredit.png +0 -0
  123. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arrow_down.png +0 -0
  124. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arrow_up.png +0 -0
  125. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/autorefresh.png +0 -0
  126. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/autoscale.png +0 -0
  127. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/axes.png +0 -0
  128. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/busy.png +0 -0
  129. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/cell_edit.png +0 -0
  130. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/center.png +0 -0
  131. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/cmap_edit.png +0 -0
  132. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/contrast.png +0 -0
  133. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/copy.png +0 -0
  134. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/copytoclipboard.png +0 -0
  135. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csapplylut.png +0 -0
  136. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csautoscale.png +0 -0
  137. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection.png +0 -0
  138. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_a.png +0 -0
  139. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_line.png +0 -0
  140. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_oblique.png +0 -0
  141. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csperimage.png +0 -0
  142. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curve_downsample.png +0 -0
  143. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/dots.png +0 -0
  144. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/lines.png +0 -0
  145. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/steps.png +0 -0
  146. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/sticks.png +0 -0
  147. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvetypes/xfy.png +0 -0
  148. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvetypes/yfx.png +0 -0
  149. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/delete.png +0 -0
  150. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/edit.png +0 -0
  151. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/edit_point_selection.png +0 -0
  152. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/edit.png +0 -0
  153. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/edit_add.png +0 -0
  154. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editcopy.png +0 -0
  155. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editdelete.png +0 -0
  156. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editpaste.png +0 -0
  157. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/fileimport.png +0 -0
  158. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/filesave.png +0 -0
  159. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/imshow.png +0 -0
  160. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/insert.png +0 -0
  161. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/plot.png +0 -0
  162. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/rename.png +0 -0
  163. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/eliminate_outliers.png +0 -0
  164. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/eraser.png +0 -0
  165. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/exit.png +0 -0
  166. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/expander_down.png +0 -0
  167. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/expander_right.png +0 -0
  168. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/export.png +0 -0
  169. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/file.png +0 -0
  170. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileclose.png +0 -0
  171. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileimport.png +0 -0
  172. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filenew.png +0 -0
  173. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileopen.png +0 -0
  174. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filesave.png +0 -0
  175. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filesaveas.png +0 -0
  176. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/doc.png +0 -0
  177. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/gif.png +0 -0
  178. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/html.png +0 -0
  179. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/jpg.png +0 -0
  180. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/pdf.png +0 -0
  181. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/png.png +0 -0
  182. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/pps.png +0 -0
  183. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/ps.png +0 -0
  184. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tar.png +0 -0
  185. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tgz.png +0 -0
  186. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tif.png +0 -0
  187. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/txt.png +0 -0
  188. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/xls.png +0 -0
  189. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/zip.png +0 -0
  190. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/font.png +0 -0
  191. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/full_range.png +0 -0
  192. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/funct.png +0 -0
  193. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/hcursor.png +0 -0
  194. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/hflip.png +0 -0
  195. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/imagestats.png +0 -0
  196. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/item_list.png +0 -0
  197. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/annotation.png +0 -0
  198. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/curve.png +0 -0
  199. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/errorbar.png +0 -0
  200. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/grid.png +0 -0
  201. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/histogram.png +0 -0
  202. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/histogram2d.png +0 -0
  203. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/image.png +0 -0
  204. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/label.png +0 -0
  205. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/legend.png +0 -0
  206. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/polygonmap.png +0 -0
  207. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/magnifier.png +0 -0
  208. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/cross.png +0 -0
  209. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/diamond.png +0 -0
  210. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/ellipse.png +0 -0
  211. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/hexagon.png +0 -0
  212. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/point.png +0 -0
  213. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/square.png +0 -0
  214. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/star.png +0 -0
  215. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_d.png +0 -0
  216. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_l.png +0 -0
  217. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_r.png +0 -0
  218. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_u.png +0 -0
  219. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/xcross.png +0 -0
  220. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/cross_marker.png +0 -0
  221. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/horiz_marker.png +0 -0
  222. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/vert_marker.png +0 -0
  223. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_circle.png +0 -0
  224. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_circle_outside.png +0 -0
  225. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_rectangle.png +0 -0
  226. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_rectangle_outside.png +0 -0
  227. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_tool.png +0 -0
  228. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/max.png +0 -0
  229. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/min.png +0 -0
  230. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/move.png +0 -0
  231. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/multipoint_selection.png +0 -0
  232. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/none.png +0 -0
  233. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/not_found.png +0 -0
  234. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/on_curve.png +0 -0
  235. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/bdiagpattern.png +0 -0
  236. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/crosspattern.png +0 -0
  237. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense1pattern.png +0 -0
  238. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense2pattern.png +0 -0
  239. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense3pattern.png +0 -0
  240. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense4pattern.png +0 -0
  241. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense5pattern.png +0 -0
  242. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense6pattern.png +0 -0
  243. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense7pattern.png +0 -0
  244. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/diagcrosspattern.png +0 -0
  245. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/fdiagpattern.png +0 -0
  246. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/horpattern.png +0 -0
  247. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/nobrush.png +0 -0
  248. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/solidpattern.png +0 -0
  249. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/verpattern.png +0 -0
  250. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy-banner.svg +0 -0
  251. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy-vertical.svg +0 -0
  252. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy.svg +0 -0
  253. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/point_selection.png +0 -0
  254. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/print.png +0 -0
  255. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/python.png +0 -0
  256. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/quickview.png +0 -0
  257. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/refresh.png +0 -0
  258. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/save_all.png +0 -0
  259. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/lin_lin.png +0 -0
  260. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/lin_log.png +0 -0
  261. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/log_lin.png +0 -0
  262. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/log_log.png +0 -0
  263. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/select.svg +0 -0
  264. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/select_area.svg +0 -0
  265. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/settings.png +0 -0
  266. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shape.png +0 -0
  267. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/circle.png +0 -0
  268. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/contour.png +0 -0
  269. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/ellipse_shape.png +0 -0
  270. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/gtaxes.png +0 -0
  271. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/marker.png +0 -0
  272. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/oblique_rectangle.png +0 -0
  273. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/point_shape.png +0 -0
  274. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/polygon.png +0 -0
  275. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/polyline.png +0 -0
  276. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/rectangle.png +0 -0
  277. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/segment.png +0 -0
  278. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/xrange.png +0 -0
  279. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/yrange.png +0 -0
  280. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/snapshot.png +0 -0
  281. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dash.png +0 -0
  282. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dashdot.png +0 -0
  283. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dashdotdot.png +0 -0
  284. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dot.png +0 -0
  285. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/solid.png +0 -0
  286. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trash.png +0 -0
  287. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trimage_lock.png +0 -0
  288. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trimage_unlock.png +0 -0
  289. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/vcursor.png +0 -0
  290. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/vflip.png +0 -0
  291. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xcursor.png +0 -0
  292. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xmax.png +0 -0
  293. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xmin.png +0 -0
  294. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/zlog.svg +0 -0
  295. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/events.py +0 -0
  296. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/__init__.py +0 -0
  297. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/__init__.py +0 -0
  298. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_generic_range_slider.py +0 -0
  299. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_generic_slider.py +0 -0
  300. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_labeled.py +0 -0
  301. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_misc.py +0 -0
  302. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_range_style.py +0 -0
  303. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_sliders.py +0 -0
  304. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/__init__.py +0 -0
  305. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/items.py +0 -0
  306. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/panel.py +0 -0
  307. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/plotmanager.py +0 -0
  308. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/io.py +0 -0
  309. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/__init__.py +0 -0
  310. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/annotation.py +0 -0
  311. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/contour.py +0 -0
  312. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/__init__.py +0 -0
  313. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/base.py +0 -0
  314. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/errorbar.py +0 -0
  315. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/grid.py +0 -0
  316. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/histogram.py +0 -0
  317. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/__init__.py +0 -0
  318. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/base.py +0 -0
  319. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/filter.py +0 -0
  320. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/misc.py +0 -0
  321. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/standard.py +0 -0
  322. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/transform.py +0 -0
  323. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/label.py +0 -0
  324. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/polygonmap.py +0 -0
  325. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/__init__.py +0 -0
  326. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/axis.py +0 -0
  327. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/base.py +0 -0
  328. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/ellipse.py +0 -0
  329. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/marker.py +0 -0
  330. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/point.py +0 -0
  331. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/polygon.py +0 -0
  332. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/range.py +0 -0
  333. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/rectangle.py +0 -0
  334. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/segment.py +0 -0
  335. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/svg.py +0 -0
  336. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
  337. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/lutrange.py +0 -0
  338. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/__init__.py +0 -0
  339. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/arrayfuncs.py +0 -0
  340. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/colormap.py +0 -0
  341. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/geometry.py +0 -0
  342. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/scaler.py +0 -0
  343. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/__init__.py +0 -0
  344. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/base.py +0 -0
  345. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/contrastadjustment.py +0 -0
  346. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/__init__.py +0 -0
  347. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/csitem.py +0 -0
  348. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/csplot.py +0 -0
  349. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/cswidget.py +0 -0
  350. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/itemlist.py +0 -0
  351. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/__init__.py +0 -0
  352. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/base.py +0 -0
  353. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/interactive.py +0 -0
  354. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/plotwidget.py +0 -0
  355. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/pyplot.py +0 -0
  356. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/__init__.py +0 -0
  357. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/axes.py +0 -0
  358. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/base.py +0 -0
  359. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/curve.py +0 -0
  360. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/errorbar.py +0 -0
  361. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/histogram.py +0 -0
  362. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/image.py +0 -0
  363. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/label.py +0 -0
  364. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/polygonmap.py +0 -0
  365. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/shape.py +0 -0
  366. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/__init__.py +0 -0
  367. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/__init__.py +0 -0
  368. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_benchmarks.py +0 -0
  369. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_bigimages.py +0 -0
  370. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_loadtest.py +0 -0
  371. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/conftest.py +0 -0
  372. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/brain.png +0 -0
  373. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/brain_cylinder.png +0 -0
  374. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/datetime.txt +0 -0
  375. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/mr-brain.dcm +0 -0
  376. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/svg_target.svg +0 -0
  377. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/svg_tool.svg +0 -0
  378. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data.py +0 -0
  379. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/__init__.py +0 -0
  380. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_auto_curve_image.py +0 -0
  381. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_autoscale_shapes.py +0 -0
  382. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_builder.py +0 -0
  383. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_colormap_editor.py +0 -0
  384. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_colormap_manager.py +0 -0
  385. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_computations.py +0 -0
  386. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_contrast.py +0 -0
  387. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_cursors.py +0 -0
  388. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_data_update_curve.py +0 -0
  389. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_data_update_image.py +0 -0
  390. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_dicom_image.py +0 -0
  391. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_fit.py +0 -0
  392. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_fit_locked_params.py +0 -0
  393. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_coords.py +0 -0
  394. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_filter.py +0 -0
  395. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_superp.py +0 -0
  396. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_hdf5.py +0 -0
  397. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_json.py +0 -0
  398. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_pickle.py +0 -0
  399. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_manager.py +0 -0
  400. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_no_auto_tools.py +0 -0
  401. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_log.py +0 -0
  402. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_time.py +0 -0
  403. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_types.py +0 -0
  404. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_yreverse.py +0 -0
  405. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_pyplot.py +0 -0
  406. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_resize.py +0 -0
  407. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/__init__.py +0 -0
  408. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_annotated_range.py +0 -0
  409. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_annotations.py +0 -0
  410. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_curves.py +0 -0
  411. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_curves_highdpi.py +0 -0
  412. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_hist2d.py +0 -0
  413. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_histogram.py +0 -0
  414. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image.py +0 -0
  415. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_contour.py +0 -0
  416. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_masked.py +0 -0
  417. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_masked_xy.py +0 -0
  418. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_rgb.py +0 -0
  419. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_xy.py +0 -0
  420. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_mandelbrot.py +0 -0
  421. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_pcolor.py +0 -0
  422. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_polygons.py +0 -0
  423. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_svgshapes.py +0 -0
  424. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_transform.py +0 -0
  425. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/__init__.py +0 -0
  426. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_actiontool.py +0 -0
  427. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section.py +0 -0
  428. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section_line.py +0 -0
  429. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section_oblique.py +0 -0
  430. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_customize_shape_tool.py +0 -0
  431. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cyclic_import.py +0 -0
  432. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_downsample_curve.py +0 -0
  433. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_edit_point.py +0 -0
  434. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_point.py +0 -0
  435. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_points.py +0 -0
  436. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_rectangle.py +0 -0
  437. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_rectangle_with_svg.py +0 -0
  438. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_segment.py +0 -0
  439. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_image_plot_tools.py +0 -0
  440. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_stats_tools.py +0 -0
  441. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_zaxislog.py +0 -0
  442. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/__init__.py +0 -0
  443. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_annotation_tools.py +0 -0
  444. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_aspect_ratio_tool.py +0 -0
  445. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_baseplot.py +0 -0
  446. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_annotation.py +0 -0
  447. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_curve.py +0 -0
  448. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_image.py +0 -0
  449. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_shape.py +0 -0
  450. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_contour.py +0 -0
  451. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_cursor_tools.py +0 -0
  452. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_curve_tools.py +0 -0
  453. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_datetime_axis.py +0 -0
  454. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_display_coords_tool.py +0 -0
  455. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_events.py +0 -0
  456. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_fontparam.py +0 -0
  457. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_geometry.py +0 -0
  458. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_io.py +0 -0
  459. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_line.py +0 -0
  460. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_line_cross_section_tool.py +0 -0
  461. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_manipulate_selection.py +0 -0
  462. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_mask_tool.py +0 -0
  463. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_multiline_tools.py +0 -0
  464. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_oblique_cross_section_tool.py +0 -0
  465. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_plot_curve.py +0 -0
  466. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_plot_image.py +0 -0
  467. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_rect_zoom.py +0 -0
  468. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_seg_dist.py +0 -0
  469. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_styles.py +0 -0
  470. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_tools_export.py +0 -0
  471. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/utils.py +0 -0
  472. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/vistools.py +0 -0
  473. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/__init__.py +0 -0
  474. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_dotarraydemo.py +0 -0
  475. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_filtertest1.py +0 -0
  476. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_filtertest2.py +0 -0
  477. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_fliprotate.py +0 -0
  478. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_plot_timecurve.py +0 -0
  479. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_qtdesigner.py +0 -0
  480. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_qtdesigner.ui +0 -0
  481. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_resize_dialog.py +0 -0
  482. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_rotatecrop.py +0 -0
  483. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_simple_dialog.py +0 -0
  484. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_simple_window.py +0 -0
  485. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_syncplot.py +0 -0
  486. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_theme.py +0 -0
  487. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/__init__.py +0 -0
  488. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/annotation.py +0 -0
  489. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/axes.py +0 -0
  490. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/base.py +0 -0
  491. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/cross_section.py +0 -0
  492. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/cursor.py +0 -0
  493. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/curve.py +0 -0
  494. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/image.py +0 -0
  495. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/item.py +0 -0
  496. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/label.py +0 -0
  497. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/misc.py +0 -0
  498. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/plot.py +0 -0
  499. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/selection.py +0 -0
  500. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/shape.py +0 -0
  501. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/__init__.py +0 -0
  502. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/about.py +0 -0
  503. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/basetransform.py +0 -0
  504. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/__init__.py +0 -0
  505. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/_slider.py +0 -0
  506. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/editor.py +0 -0
  507. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/manager.py +0 -0
  508. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/widget.py +0 -0
  509. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/fit.py +0 -0
  510. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/fliprotate.py +0 -0
  511. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/imagefile.py +0 -0
  512. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/qtdesigner.py +0 -0
  513. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/resizedialog.py +0 -0
  514. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/rotatecrop.py +0 -0
  515. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/selectdialog.py +0 -0
  516. {plotpy-2.8.1 → plotpy-2.8.2}/plotpy-tests.desktop +0 -0
  517. {plotpy-2.8.1 → plotpy-2.8.2}/pyproject.toml +0 -0
  518. {plotpy-2.8.1 → plotpy-2.8.2}/qtdesigner/plotplugin.py +0 -0
  519. {plotpy-2.8.1 → plotpy-2.8.2}/requirements.txt +0 -0
  520. {plotpy-2.8.1 → plotpy-2.8.2}/setup.cfg +0 -0
  521. {plotpy-2.8.1 → plotpy-2.8.2}/setup.py +0 -0
  522. {plotpy-2.8.1 → plotpy-2.8.2}/src/arrays.hpp +0 -0
  523. {plotpy-2.8.1 → plotpy-2.8.2}/src/debug.hpp +0 -0
  524. {plotpy-2.8.1 → plotpy-2.8.2}/src/histogram2d.pyx +0 -0
  525. {plotpy-2.8.1 → plotpy-2.8.2}/src/mandelbrot.pyx +0 -0
  526. {plotpy-2.8.1 → plotpy-2.8.2}/src/pcolor.cpp +0 -0
  527. {plotpy-2.8.1 → plotpy-2.8.2}/src/points.hpp +0 -0
  528. {plotpy-2.8.1 → plotpy-2.8.2}/src/scaler.cpp +0 -0
  529. {plotpy-2.8.1 → plotpy-2.8.2}/src/scaler.hpp +0 -0
  530. {plotpy-2.8.1 → plotpy-2.8.2}/src/traits.hpp +0 -0
@@ -1,5 +1,15 @@
1
1
  # Changelog #
2
2
 
3
+ ## Version 2.8.2 ##
4
+
5
+ 🛠️ Bug fixes:
6
+
7
+ * Fixed `RuntimeWarning` when changing masked image data type from float to integer:
8
+ * `MaskedImageItem.update_mask()` now handles NaN and None `filling_value` gracefully
9
+ * When converting to integer dtypes, NaN/None values are replaced with 0 instead of triggering numpy cast warnings
10
+ * When converting to float dtypes, NaN is preserved as the fill value
11
+ * Added comprehensive tests to validate dtype conversion scenarios
12
+
3
13
  ## Version 2.8.1 ##
4
14
 
5
15
  🛠️ Bug fixes:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PlotPy
3
- Version: 2.8.1
3
+ Version: 2.8.2
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License-Expression: BSD-3-Clause
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PlotPy
3
- Version: 2.8.1
3
+ Version: 2.8.2
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License-Expression: BSD-3-Clause
@@ -373,6 +373,7 @@ plotpy/tests/vistools.py
373
373
  plotpy/tests/benchmarks/__init__.py
374
374
  plotpy/tests/benchmarks/test_benchmarks.py
375
375
  plotpy/tests/benchmarks/test_bigimages.py
376
+ plotpy/tests/benchmarks/test_large_number_of_annotations.py
376
377
  plotpy/tests/benchmarks/test_loadtest.py
377
378
  plotpy/tests/data/brain.png
378
379
  plotpy/tests/data/brain_cylinder.png
@@ -464,6 +465,7 @@ plotpy/tests/unit/test_line.py
464
465
  plotpy/tests/unit/test_line_cross_section_tool.py
465
466
  plotpy/tests/unit/test_manipulate_selection.py
466
467
  plotpy/tests/unit/test_mask_tool.py
468
+ plotpy/tests/unit/test_masked_dtype_change.py
467
469
  plotpy/tests/unit/test_multiline_tools.py
468
470
  plotpy/tests/unit/test_oblique_cross_section_tool.py
469
471
  plotpy/tests/unit/test_plot_curve.py
@@ -20,7 +20,7 @@ External resources:
20
20
  .. _GitHub: https://github.com/PierreRaybaut/plotpy
21
21
  """
22
22
 
23
- __version__ = "2.8.1"
23
+ __version__ = "2.8.2"
24
24
  __VERSION__ = tuple([int(number) for number in __version__.split(".")])
25
25
 
26
26
  # --- Important note: DATAPATH and LOCALEPATH are used by guidata.configtools
@@ -150,12 +150,25 @@ class MaskedImageMixin:
150
150
  def update_mask(self) -> None:
151
151
  """Update mask"""
152
152
  if isinstance(self.data, np.ma.MaskedArray):
153
- # Casting filling_value to data dtype, otherwise this may raise an error
154
- # in future versions of NumPy (at the time of writing, this raises a
155
- # DeprecationWarning "NumPy will stop allowing conversion of out-of-bound
156
- # Python integers to integer arrays.")
157
- val = np.array(self.param.filling_value).astype(self.data.dtype)
158
-
153
+ filling_value = self.param.filling_value
154
+ if filling_value is None or (
155
+ isinstance(filling_value, float) and np.isnan(filling_value)
156
+ ):
157
+ # Use a safe default for integer types when filling_value is None or NaN
158
+ if np.issubdtype(self.data.dtype, np.integer):
159
+ val = np.array(0, dtype=self.data.dtype)
160
+ else:
161
+ val = np.array(np.nan, dtype=self.data.dtype)
162
+ else:
163
+ # If filling_value is out of bounds for data dtype, get the default
164
+ # fill value for that dtype
165
+ if np.issubdtype(self.data.dtype, np.integer):
166
+ info = np.iinfo(self.data.dtype)
167
+ if filling_value < info.min or filling_value > info.max:
168
+ # Using the default fill value thanks to the get_fill_value()
169
+ # method of MaskedArray:
170
+ filling_value = self.data.get_fill_value()
171
+ val = np.array(filling_value).astype(self.data.dtype)
159
172
  self.data.set_fill_value(val)
160
173
 
161
174
  def set_mask(self, mask: ma.MaskedArray) -> None:
@@ -718,6 +718,7 @@ class PlotManager:
718
718
  self.add_tool(tools.AnnotatedPointTool)
719
719
  self.add_tool(tools.AnnotatedSegmentTool)
720
720
  self.add_tool(tools.AnnotatedRectangleTool)
721
+ self.add_tool(tools.AnnotatedPolygonTool)
721
722
  self.add_tool(tools.AnnotatedObliqueRectangleTool)
722
723
  self.add_tool(tools.AnnotatedCircleTool)
723
724
  self.add_tool(tools.AnnotatedEllipseTool)
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Licensed under the terms of the BSD 3-Clause
4
+ # (see plotpy/LICENSE for details)
5
+
6
+ """Large number of annotations test"""
7
+
8
+ # guitest: show
9
+
10
+ import timeit
11
+
12
+ import numpy as np
13
+ from guidata.qthelpers import qt_app_context
14
+
15
+ from plotpy.builder import make
16
+ from plotpy.tests import data as ptd
17
+ from plotpy.tests import vistools as ptv
18
+
19
+ WIN_REFS = []
20
+
21
+
22
+ def plot(items, title):
23
+ """Plot items"""
24
+ global WIN_REFS
25
+ title = f"{title} - #refs: {len(WIN_REFS) + 1}"
26
+ win = ptv.show_items(items, plot_type="image", wintitle=title, title=title)
27
+ WIN_REFS.append(win)
28
+ return win
29
+
30
+
31
+ def create_polygon_vertices(
32
+ x0: float, y0: float, nb_points: int, radius_mean: float, radius_variation: float
33
+ ) -> list[tuple[float, float]]:
34
+ """Generate points for a polygon around (x0, y0)
35
+
36
+ Args:
37
+ x0: x coordinate of the polygon center
38
+ y0: y coordinate of the polygon center
39
+ nb_points: number of points to generate
40
+ radius_mean: mean radius of the polygon
41
+ radius_variation: variation in radius
42
+
43
+ Returns:
44
+ List of (x, y) points representing the polygon vertices
45
+ """
46
+ points = []
47
+ # Calculate number of NaNs to append (random numbers between 0 and nb_points-10):
48
+ num_nans = np.random.randint(0, nb_points - 10)
49
+ for j in range(nb_points - num_nans):
50
+ angle = j * (2 * np.pi / (nb_points - num_nans))
51
+ radius = radius_mean + radius_variation * np.random.rand()
52
+ x = x0 + radius * np.cos(angle)
53
+ y = y0 + radius * np.sin(angle)
54
+ points.append((x, y))
55
+ for _ in range(num_nans):
56
+ points.append((np.nan, np.nan))
57
+ return points
58
+
59
+
60
+ def create_random_polygons(
61
+ size: int, nb_polygons: int, nb_points_per_polygon: int
62
+ ) -> np.ndarray:
63
+ """Create random polygons
64
+
65
+ Args:
66
+ size: size of the area in which to create polygons
67
+ nb_polygons: number of polygons to create
68
+ nb_points_per_polygon: number of points per polygon
69
+
70
+ Returns:
71
+ Array of shape (nb_polygons, nb_points_per_polygon, 2)
72
+ """
73
+ polygons = []
74
+ for _ in range(nb_polygons):
75
+ x0 = size * np.random.rand()
76
+ y0 = size * np.random.rand()
77
+ points = create_polygon_vertices(
78
+ x0, y0, nb_points_per_polygon, radius_mean=20, radius_variation=30
79
+ )
80
+ # Append the flattened points:
81
+ polygons.append(points)
82
+ return np.array(polygons)
83
+
84
+
85
+ def test_large_number_of_annotations(measure_execution_time: bool = False):
86
+ """Test large number of annotations
87
+
88
+ Args:
89
+ measure_execution_time: if True, measure and print the execution time, then
90
+ quit the application immediately.
91
+ """
92
+ title = "Large number of annotations test"
93
+ size = 2000
94
+ nb_polygons = 100
95
+ nb_points_per_polygon = 120
96
+ with qt_app_context(exec_loop=not measure_execution_time):
97
+ data = ptd.gen_image4(size, size)
98
+ x = np.linspace(0, size - 1, size)
99
+ y = np.linspace(0, size - 1, size)
100
+ item = make.xyimage(x, y, data)
101
+ item.set_readonly(True)
102
+ item.set_selectable(False)
103
+ items = [item]
104
+ polygons = create_random_polygons(size, nb_polygons, nb_points_per_polygon)
105
+ for i, points in enumerate(polygons):
106
+ polygon = make.annotated_polygon(np.array(points), title=f"Polygon {i + 1}")
107
+ polygon.set_closed(False)
108
+ items.append(polygon)
109
+ if measure_execution_time:
110
+ exec_time = timeit.timeit(lambda: plot(items, title), number=10) / 10
111
+ print(
112
+ f"Execution time with {nb_polygons} polygons "
113
+ f"({nb_points_per_polygon} points per polygon): "
114
+ f"{exec_time:.3f} seconds/plot"
115
+ )
116
+ else:
117
+ win = plot(items, title)
118
+ win.register_annotation_tools()
119
+
120
+
121
+ if __name__ == "__main__":
122
+ test_large_number_of_annotations(measure_execution_time=True)
@@ -0,0 +1,125 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Licensed under the terms of the BSD 3-Clause
4
+ # (see plotpy/LICENSE for details)
5
+
6
+ """
7
+ Test for MaskedImageItem dtype changes
8
+
9
+ This test verifies that changing the data type of a masked image from float to
10
+ integer types (like float64 to uint8) doesn't raise RuntimeWarnings when the
11
+ filling_value is NaN or None.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import warnings
17
+
18
+ import numpy as np
19
+
20
+ from plotpy.builder import make
21
+
22
+
23
+ def test_masked_image_dtype_change_from_float_to_uint8():
24
+ """Test changing masked image dtype from float64 to uint8 with NaN filling_value"""
25
+ # Create a float64 masked array with NaN as fill value (the default)
26
+ data = np.random.rand(10, 10).astype(np.float64)
27
+ mask = np.zeros_like(data, dtype=bool)
28
+ mask[3:5, 3:5] = True
29
+ masked_data = np.ma.masked_array(data, mask=mask)
30
+
31
+ # Create masked image item
32
+ item = make.maskedimage(masked_data, colormap="viridis", show_mask=True)
33
+
34
+ # Verify initial state
35
+ assert item.data.dtype == np.float64
36
+
37
+ # Set filling_value to NaN (typical for float images)
38
+ item.param.filling_value = np.nan
39
+
40
+ # Change data dtype to uint8
41
+ new_data = (masked_data * 255).astype(np.uint8)
42
+ item.set_data(new_data)
43
+
44
+ # This should not raise a RuntimeWarning
45
+ with warnings.catch_warnings(record=True) as warning_list:
46
+ warnings.simplefilter("always")
47
+ item.update_mask()
48
+
49
+ # Check that no RuntimeWarning was raised
50
+ runtime_warnings = [
51
+ w for w in warning_list if issubclass(w.category, RuntimeWarning)
52
+ ]
53
+ assert len(runtime_warnings) == 0, "RuntimeWarning should not be raised"
54
+
55
+ # Verify the data type changed
56
+ assert item.data.dtype == np.uint8
57
+
58
+
59
+ def test_masked_image_dtype_change_with_none_filling_value():
60
+ """Test changing masked image dtype with None filling_value"""
61
+ # Create a float64 masked array
62
+ data = np.random.rand(10, 10).astype(np.float64)
63
+ mask = np.zeros_like(data, dtype=bool)
64
+ mask[3:5, 3:5] = True
65
+ masked_data = np.ma.masked_array(data, mask=mask)
66
+
67
+ # Create masked image item
68
+ item = make.maskedimage(masked_data, colormap="viridis", show_mask=True)
69
+
70
+ # Set filling_value to None
71
+ item.param.filling_value = None
72
+
73
+ # Change data dtype to uint8
74
+ new_data = (masked_data * 255).astype(np.uint8)
75
+ item.set_data(new_data)
76
+
77
+ # This should not raise a RuntimeWarning
78
+ with warnings.catch_warnings(record=True) as warning_list:
79
+ warnings.simplefilter("always")
80
+ item.update_mask()
81
+
82
+ # Check that no RuntimeWarning was raised
83
+ runtime_warnings = [
84
+ w for w in warning_list if issubclass(w.category, RuntimeWarning)
85
+ ]
86
+ assert len(runtime_warnings) == 0, "RuntimeWarning should not be raised"
87
+
88
+
89
+ def test_masked_image_filling_value_defaults():
90
+ """Test that filling_value defaults are appropriate for different dtypes"""
91
+ test_dtypes = [np.uint8, np.uint16, np.int16, np.float32, np.float64]
92
+
93
+ for dtype in test_dtypes:
94
+ data = np.random.rand(5, 5)
95
+ if np.issubdtype(dtype, np.integer):
96
+ data = (data * 100).astype(dtype)
97
+ else:
98
+ data = data.astype(dtype)
99
+
100
+ mask = np.zeros_like(data, dtype=bool)
101
+ mask[2:3, 2:3] = True
102
+ masked_data = np.ma.masked_array(data, mask=mask)
103
+
104
+ item = make.maskedimage(masked_data, colormap="viridis", show_mask=True)
105
+
106
+ # Set filling_value to NaN (typical initial state for float images)
107
+ item.param.filling_value = np.nan
108
+
109
+ # This should handle the conversion gracefully
110
+ with warnings.catch_warnings(record=True) as warning_list:
111
+ warnings.simplefilter("always")
112
+ item.update_mask()
113
+
114
+ # Check that no RuntimeWarning was raised
115
+ runtime_warnings = [
116
+ w for w in warning_list if issubclass(w.category, RuntimeWarning)
117
+ ]
118
+ assert len(runtime_warnings) == 0, f"RuntimeWarning for dtype {dtype}"
119
+
120
+
121
+ if __name__ == "__main__":
122
+ test_masked_image_dtype_change_from_float_to_uint8()
123
+ test_masked_image_dtype_change_with_none_filling_value()
124
+ test_masked_image_filling_value_defaults()
125
+ print("All tests passed!")