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.
- {plotpy-2.8.1 → plotpy-2.8.2}/CHANGELOG.md +10 -0
- {plotpy-2.8.1/PlotPy.egg-info → plotpy-2.8.2}/PKG-INFO +1 -1
- {plotpy-2.8.1 → plotpy-2.8.2/PlotPy.egg-info}/PKG-INFO +1 -1
- {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/SOURCES.txt +2 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/__init__.py +1 -1
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/masked.py +19 -6
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/manager.py +1 -0
- plotpy-2.8.2/plotpy/tests/benchmarks/test_large_number_of_annotations.py +122 -0
- plotpy-2.8.2/plotpy/tests/unit/test_masked_dtype_change.py +125 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/histogram2d.c +146 -146
- {plotpy-2.8.1 → plotpy-2.8.2}/src/mandelbrot.c +146 -146
- {plotpy-2.8.1 → plotpy-2.8.2}/LICENSE +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/MANIFEST.in +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/dependency_links.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/entry_points.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/requires.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/PlotPy.egg-info/top_level.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/README.md +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/README.md +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/_cm.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/colormap.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/colormaps/matplotlib_cmaps.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/_static/favicon.ico +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/changelog.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/conf.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/build.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/contribute.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/guiqwt_to_plotpy.csv +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/guiqwt_to_plotpy.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/platforms.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_guidata_v3.csv +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_v2.csv +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/dev/v1_to_v2.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/colormapmanager.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/events.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/fit.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/fliprotate.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/imagefile.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/io.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/builder.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/examples.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/items/reference.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/colormaps.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/geometry.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/mathutils/scaler.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/panels/reference.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/examples.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/plot/reference.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/pyplot.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/resizedialog.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/rotatecrop.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/selectdialog.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/signals.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/styles/reference.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/examples.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/features/tools/reference.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/my_plot_manager.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/my_plot_manager.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama-vertical.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama-vertical.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/panorama.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plot_widgets.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plot_widgets.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plotpy-banner.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/plotpy-vertical.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/__init__.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/computations.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/contrast.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/cross_section.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/cross_section2.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/dotarraydemo.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/filtertest1.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/filtertest2.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/fit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/get_point.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/hist2d.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/image_plot_tools.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagefilter.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagesuperp.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/imagexy.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/manager.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/mandelbrot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/pcolor.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/plot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/simple_dialog.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/simple_window.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/images/screenshots/transform.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/examples.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/index.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/installation.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/licenses.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/motivation.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/intro/overview.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/doc/requirements.rst +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/annotation.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/curvemarker.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/label.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/plot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/builder/shape.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/config.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/constants.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/coords.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/colormaps_default.json +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/apply.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arredit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arrow_down.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/arrow_up.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/autorefresh.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/autoscale.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/axes.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/busy.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/cell_edit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/center.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/cmap_edit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/contrast.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/copy.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/copytoclipboard.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csapplylut.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csautoscale.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_a.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_line.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csection_oblique.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/csperimage.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curve_downsample.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/dots.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/lines.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/steps.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvestyles/sticks.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvetypes/xfy.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/curvetypes/yfx.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/delete.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/edit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/edit_point_selection.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/edit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/edit_add.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editcopy.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editdelete.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/editpaste.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/fileimport.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/filesave.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/imshow.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/insert.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/plot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/editors/rename.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/eliminate_outliers.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/eraser.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/exit.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/expander_down.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/expander_right.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/export.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/file.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileclose.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileimport.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filenew.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/fileopen.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filesave.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filesaveas.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/doc.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/gif.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/html.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/jpg.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/pdf.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/png.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/pps.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/ps.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tar.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tgz.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/tif.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/txt.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/xls.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/filetypes/zip.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/font.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/full_range.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/funct.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/hcursor.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/hflip.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/imagestats.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/item_list.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/annotation.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/curve.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/errorbar.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/grid.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/histogram.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/histogram2d.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/image.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/label.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/legend.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/items/polygonmap.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/magnifier.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/cross.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/diamond.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/ellipse.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/hexagon.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/point.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/square.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/star.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_d.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_l.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_r.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/triangle_u.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markers/xcross.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/cross_marker.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/horiz_marker.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/markerstyles/vert_marker.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_circle.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_circle_outside.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_rectangle.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_rectangle_outside.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/mask/mask_tool.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/max.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/min.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/move.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/multipoint_selection.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/none.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/not_found.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/on_curve.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/bdiagpattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/crosspattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense1pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense2pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense3pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense4pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense5pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense6pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/dense7pattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/diagcrosspattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/fdiagpattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/horpattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/nobrush.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/solidpattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/patterns/verpattern.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy-banner.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy-vertical.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/plotpy.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/point_selection.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/print.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/python.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/quickview.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/refresh.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/save_all.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/lin_lin.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/lin_log.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/log_lin.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/scales/log_log.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/select.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/select_area.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/settings.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shape.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/circle.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/contour.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/ellipse_shape.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/gtaxes.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/marker.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/oblique_rectangle.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/point_shape.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/polygon.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/polyline.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/rectangle.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/segment.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/xrange.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/shapes/yrange.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/snapshot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dash.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dashdot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dashdotdot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/dot.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/styles/solid.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trash.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trimage_lock.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/trimage_unlock.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/vcursor.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/vflip.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xcursor.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xmax.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/xmin.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/data/icons/zlog.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/events.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_generic_range_slider.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_generic_slider.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_labeled.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_misc.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_range_style.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/external/sliders/_sliders.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/items.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/panel.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/interfaces/plotmanager.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/io.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/annotation.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/contour.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/curve/errorbar.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/grid.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/histogram.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/filter.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/misc.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/standard.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/image/transform.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/label.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/polygonmap.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/axis.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/ellipse.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/marker.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/point.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/polygon.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/range.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/rectangle.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/segment.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/items/shape/svg.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/lutrange.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/arrayfuncs.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/colormap.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/geometry.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/mathutils/scaler.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/contrastadjustment.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/csitem.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/csplot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/csection/cswidget.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/panels/itemlist.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/interactive.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/plot/plotwidget.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/pyplot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/axes.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/errorbar.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/histogram.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/label.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/polygonmap.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/styles/shape.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_benchmarks.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_bigimages.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/benchmarks/test_loadtest.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/conftest.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/brain.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/brain_cylinder.png +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/datetime.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/mr-brain.dcm +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/svg_target.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data/svg_tool.svg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/data.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_auto_curve_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_autoscale_shapes.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_builder.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_colormap_editor.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_colormap_manager.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_computations.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_contrast.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_cursors.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_data_update_curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_data_update_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_dicom_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_fit.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_fit_locked_params.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_coords.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_filter.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_image_superp.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_hdf5.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_json.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_loadsaveitems_pickle.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_manager.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_no_auto_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_log.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_time.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_types.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_plot_yreverse.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_pyplot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/features/test_resize.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_annotated_range.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_annotations.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_curves.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_curves_highdpi.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_hist2d.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_histogram.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_contour.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_masked.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_masked_xy.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_rgb.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_image_xy.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_mandelbrot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_pcolor.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_polygons.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_svgshapes.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/items/test_transform.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_actiontool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section_line.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cross_section_oblique.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_customize_shape_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_cyclic_import.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_downsample_curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_edit_point.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_point.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_points.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_rectangle.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_rectangle_with_svg.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_get_segment.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_image_plot_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_stats_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/tools/test_zaxislog.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_annotation_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_aspect_ratio_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_baseplot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_annotation.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_builder_shape.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_contour.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_cursor_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_curve_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_datetime_axis.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_display_coords_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_events.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_fontparam.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_geometry.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_io.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_line.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_line_cross_section_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_manipulate_selection.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_mask_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_multiline_tools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_oblique_cross_section_tool.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_plot_curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_plot_image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_rect_zoom.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_seg_dist.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_styles.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/test_tools_export.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/unit/utils.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/vistools.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_dotarraydemo.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_filtertest1.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_filtertest2.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_fliprotate.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_plot_timecurve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_qtdesigner.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_qtdesigner.ui +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_resize_dialog.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_rotatecrop.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_simple_dialog.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_simple_window.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_syncplot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tests/widgets/test_theme.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/annotation.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/axes.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/base.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/cross_section.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/cursor.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/curve.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/image.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/item.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/label.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/misc.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/plot.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/selection.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/tools/shape.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/about.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/basetransform.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/__init__.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/_slider.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/editor.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/manager.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/colormap/widget.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/fit.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/fliprotate.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/imagefile.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/qtdesigner.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/resizedialog.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/rotatecrop.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy/widgets/selectdialog.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/plotpy-tests.desktop +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/pyproject.toml +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/qtdesigner/plotplugin.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/requirements.txt +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/setup.cfg +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/setup.py +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/arrays.hpp +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/debug.hpp +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/histogram2d.pyx +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/mandelbrot.pyx +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/pcolor.cpp +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/points.hpp +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/scaler.cpp +0 -0
- {plotpy-2.8.1 → plotpy-2.8.2}/src/scaler.hpp +0 -0
- {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:
|
|
@@ -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.
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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!")
|