PlotPy 2.0.1__tar.gz → 2.0.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.0.1 → PlotPy-2.0.2}/PKG-INFO +1 -1
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/PKG-INFO +1 -1
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/__init__.py +1 -1
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/interfaces/items.py +9 -5
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/histogram.py +29 -6
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/base.py +10 -4
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/misc.py +10 -4
- PlotPy-2.0.2/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/contrastadjustment.py +31 -19
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/csection/csitem.py +0 -8
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/plot/base.py +11 -4
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/histogram.py +43 -23
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_manager.py +21 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_mandelbrot.py +19 -13
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_simple_window.py +60 -23
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/misc.py +1 -1
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/contour2d.c +96 -96
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/histogram2d.c +97 -97
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/mandelbrot.c +97 -97
- PlotPy-2.0.1/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/LICENSE +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/MANIFEST.in +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/SOURCES.txt +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/dependency_links.txt +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/entry_points.txt +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/requires.txt +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/PlotPy.egg-info/top_level.txt +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/README.md +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/_static/favicon.ico +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/changelog.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/conf.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/build.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/contribute.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/guiqwt_to_plotpy.csv +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/guiqwt_to_plotpy.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/platforms.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/v1_to_v2.csv +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/dev/v1_to_v2.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/fit.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/fliprotate.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/imagefile.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/io.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/items/builder.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/items/examples.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/items/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/items/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/items/reference.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/mathutils/colormap.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/mathutils/geometry.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/mathutils/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/mathutils/scaler.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/panels/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/panels/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/panels/reference.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/plot/examples.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/plot/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/plot/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/plot/reference.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/pyplot.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/resizedialog.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/rotatecrop.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/selectdialog.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/signals.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/styles/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/styles/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/styles/reference.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/tools/examples.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/tools/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/tools/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/features/tools/reference.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/my_plot_manager.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/my_plot_manager.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/panorama.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/panorama.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/plot_widgets.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/plot_widgets.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/plotpy-banner.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/plotpy-vertical.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/__init__.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/computations.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/contrast.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/cross_section.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/cross_section2.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/dotarraydemo.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/filtertest1.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/filtertest2.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/fit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/get_point.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/hist2d.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/image_plot_tools.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/imagefilter.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/imagesuperp.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/imagexy.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/manager.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/mandelbrot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/pcolor.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/plot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/simple_dialog.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/simple_window.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/images/screenshots/transform.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/examples.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/index.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/installation.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/licenses.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/motivation.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/intro/overview.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/requirements.rst +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/doc/update_requirements.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/annotation.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/curvemarker.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/label.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/plot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/builder/shape.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/config.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/constants.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/coords.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/events.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/apply.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/arredit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/arrow_down.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/arrow_up.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/autorefresh.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/autoscale.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/axes.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/busy.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/cell_edit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/center.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/contrast.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/copy.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/copytoclipboard.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csapplylut.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csautoscale.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csection.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csection_a.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csection_oblique.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/csperimage.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvestyles/dots.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvestyles/lines.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvestyles/steps.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvestyles/sticks.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvetypes/xfy.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/curvetypes/yfx.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/delete.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/edit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/edit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/edit_add.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/editcopy.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/editdelete.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/editpaste.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/fileimport.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/filesave.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/imshow.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/insert.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/plot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/editors/rename.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/eliminate_outliers.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/eraser.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/exit.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/expander_down.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/expander_right.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/export.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/file.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/fileclose.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/fileimport.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filenew.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/fileopen.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filesave.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filesaveas.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/doc.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/gif.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/html.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/jpg.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/pdf.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/png.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/pps.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/ps.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/tar.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/tgz.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/tif.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/txt.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/xls.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/filetypes/zip.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/font.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/full_range.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/funct.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/hcursor.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/hflip.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/imagestats.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/item_list.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/annotation.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/curve.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/errorbar.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/grid.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/histogram.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/histogram2d.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/image.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/label.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/items/legend.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/magnifier.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/cross.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/diamond.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/ellipse.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/hexagon.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/point.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/square.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/star.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/triangle_d.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/triangle_l.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/triangle_r.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/triangle_u.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markers/xcross.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markerstyles/cross_marker.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markerstyles/horiz_marker.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/markerstyles/vert_marker.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/mask/mask_circle.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/mask/mask_circle_outside.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/mask/mask_rectangle.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/mask/mask_rectangle_outside.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/mask/mask_tool.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/max.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/min.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/move.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/none.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/not_found.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/on_curve.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/bdiagpattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/crosspattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense1pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense2pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense3pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense4pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense5pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense6pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/dense7pattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/diagcrosspattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/fdiagpattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/horpattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/nobrush.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/solidpattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/patterns/verpattern.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/plotpy-banner.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/plotpy-vertical.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/plotpy.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/point_selection.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/print.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/python.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/quickview.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/rectangular_select.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/refresh.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/save_all.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/scales/lin_lin.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/scales/lin_log.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/scales/log_lin.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/scales/log_log.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/selection.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/settings.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shape.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/circle.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/contour.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/ellipse_shape.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/freeform.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/gtaxes.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/marker.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/oblique_rectangle.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/point_shape.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/polyline.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/rectangle.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/shapes/segment.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/snapshot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/styles/dash.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/styles/dashdot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/styles/dashdotdot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/styles/dot.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/styles/solid.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/trash.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/trimage_lock.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/trimage_unlock.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/vcursor.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/vflip.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/xcursor.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/xmax.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/xmin.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/images/xrange.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/interfaces/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/interfaces/panel.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/interfaces/plotmanager.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/io.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/annotation.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/contour.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/curve/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/curve/base.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/curve/errorbar.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/grid.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/filter.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/image_items.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/masked.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/image/transform.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/label.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/polygon.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/axis.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/base.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/ellipse.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/marker.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/point.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/polygon.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/range.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/rectangle.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/segment.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/items/shape/svg.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/lutrange.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/_cm.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/arrayfuncs.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/colormap.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/geometry.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/mathutils/scaler.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/base.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/csection/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/csection/csplot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/csection/cswidget.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/panels/itemlist.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/plot/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/plot/interactive.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/plot/manager.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/plot/plotwidget.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/pyplot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/axes.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/base.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/curve.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/errorbar.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/label.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/styles/shape.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/benchmarks/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/benchmarks/test_benchmarks.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/benchmarks/test_bigimages.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/benchmarks/test_loadtest.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/conftest.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data/brain.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data/brain_cylinder.png +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data/mr-brain.dcm +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data/svg_target.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data/svg_tool.svg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/data.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_auto_curve_image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_autoscale_shapes.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_builder.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_computations.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_contrast.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_cursors.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_dicom_image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_fit.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_image_coords.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_imagefilter.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_imagesuperp.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_loadsaveitems_hdf5.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_loadsaveitems_json.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_loadsaveitems_pickle.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_no_auto_tools.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_plot_log.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_plot_types.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_plot_yreverse.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_pyplot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/features/test_resize.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_annotations.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_curves.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_hist2d.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_histogram.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image_contour.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image_masked.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image_masked_xy.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image_rgb.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_image_xy.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_pcolor.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_polygons.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_svgshapes.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/items/test_transform.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_actiontool.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_cross_section.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_cross_section_oblique.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_customize_shape_tool.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_get_point.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_get_rectangle.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_get_rectangle_with_svg.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_get_segment.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/tools/test_image_plot_tools.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_baseplot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_builder_annotation.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_builder_curve.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_builder_image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_builder_shape.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_contour.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_fontparam.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_geometry.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_highprecisionxy.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_io.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_line.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_plot_curve.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_plot_image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_seg_dist.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_styles.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/unit/test_tools_export.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/vistools.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_dotarraydemo.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_filtertest1.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_filtertest2.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_fliprotate.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_plot_timecurve.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_qtdesigner.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_qtdesigner.ui +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_resize_dialog.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_rotatecrop.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_simple_dialog.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tests/widgets/test_syncplot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/annotation.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/axes.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/base.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/cross_section.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/cursor.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/curve.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/image.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/item.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/label.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/plot.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/selection.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/tools/shape.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/__init__.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/about.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/basetransform.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/fit.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/fliprotate.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/imagefile.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/qtdesigner.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/resizedialog.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/rotatecrop.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy/widgets/selectdialog.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/plotpy-tests.desktop +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/pyproject.toml +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/qtdesigner/plotplugin.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/setup.cfg +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/setup.py +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/arrays.hpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/contour2d.pyx +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/debug.hpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/histogram2d.pyx +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/mandelbrot.pyx +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/pcolor.cpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/points.hpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/scaler.cpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/scaler.hpp +0 -0
- {PlotPy-2.0.1 → PlotPy-2.0.2}/src/traits.hpp +0 -0
|
@@ -20,7 +20,7 @@ External resources:
|
|
|
20
20
|
.. _GitHub: https://github.com/PierreRaybaut/plotpy
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
-
__version__ = "2.0.
|
|
23
|
+
__version__ = "2.0.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
|
|
@@ -489,20 +489,24 @@ class IBaseImageItem:
|
|
|
489
489
|
|
|
490
490
|
|
|
491
491
|
class IHistDataSource:
|
|
492
|
-
def get_histogram(
|
|
492
|
+
def get_histogram(
|
|
493
|
+
self, nbins: int, drange: tuple[float, float] | None = None
|
|
494
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
493
495
|
"""
|
|
494
496
|
Return a tuple (hist, bins) where hist is a list of histogram values
|
|
495
497
|
|
|
496
498
|
Args:
|
|
497
|
-
nbins
|
|
499
|
+
nbins: number of bins
|
|
500
|
+
drange: lower and upper range of the bins. If not provided, range is
|
|
501
|
+
simply (data.min(), data.max()). Values outside the range are ignored.
|
|
498
502
|
|
|
499
503
|
Returns:
|
|
500
|
-
|
|
504
|
+
Tuple (hist, bins)
|
|
501
505
|
|
|
502
506
|
Example of implementation:
|
|
503
507
|
|
|
504
|
-
def get_histogram(self, nbins):
|
|
508
|
+
def get_histogram(self, nbins, drange=None):
|
|
505
509
|
data = self.get_data()
|
|
506
|
-
return np.histogram(data, nbins)
|
|
510
|
+
return np.histogram(data, bins=nbins, range=drange)
|
|
507
511
|
"""
|
|
508
512
|
pass
|
|
@@ -38,17 +38,21 @@ class HistDataSource:
|
|
|
38
38
|
def __init__(self, data: np.ndarray) -> None:
|
|
39
39
|
self.data = data
|
|
40
40
|
|
|
41
|
-
def get_histogram(
|
|
41
|
+
def get_histogram(
|
|
42
|
+
self, nbins: int, drange: tuple[float, float] | None = None
|
|
43
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
42
44
|
"""
|
|
43
45
|
Return a tuple (hist, bins) where hist is a list of histogram values
|
|
44
46
|
|
|
45
47
|
Args:
|
|
46
|
-
nbins
|
|
48
|
+
nbins: number of bins
|
|
49
|
+
drange: lower and upper range of the bins. If not provided, range is
|
|
50
|
+
simply (data.min(), data.max()). Values outside the range are ignored.
|
|
47
51
|
|
|
48
52
|
Returns:
|
|
49
|
-
|
|
53
|
+
Tuple (hist, bins)
|
|
50
54
|
"""
|
|
51
|
-
return np.histogram(self.data, nbins)
|
|
55
|
+
return np.histogram(self.data, bins=nbins, range=drange)
|
|
52
56
|
|
|
53
57
|
|
|
54
58
|
assert_interfaces_valid(HistDataSource)
|
|
@@ -73,6 +77,7 @@ class HistogramItem(CurveItem):
|
|
|
73
77
|
self.hist_count = None
|
|
74
78
|
self.hist_bins = None
|
|
75
79
|
self.bins = None
|
|
80
|
+
self.bin_range = None
|
|
76
81
|
self.old_bins = None
|
|
77
82
|
self.source: BaseImageItem | None = None
|
|
78
83
|
self.logscale: bool | None = None
|
|
@@ -157,20 +162,38 @@ class HistogramItem(CurveItem):
|
|
|
157
162
|
"""
|
|
158
163
|
return self.bins
|
|
159
164
|
|
|
165
|
+
def set_bin_range(self, bin_range: tuple[float, float] | None) -> None:
|
|
166
|
+
"""Sets the range of the bins
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
bin_range: (min, max) or None for automatic range
|
|
170
|
+
"""
|
|
171
|
+
self.bin_range = bin_range
|
|
172
|
+
self.update_histogram()
|
|
173
|
+
|
|
174
|
+
def get_bin_range(self) -> tuple[float, float] | None:
|
|
175
|
+
"""Returns the range of the bins
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
tuple: (min, max)
|
|
179
|
+
"""
|
|
180
|
+
return self.bin_range
|
|
181
|
+
|
|
160
182
|
def compute_histogram(self) -> tuple[np.ndarray, np.ndarray]:
|
|
161
183
|
"""Compute histogram data
|
|
162
184
|
|
|
163
185
|
Returns:
|
|
164
186
|
tuple: (hist, bins)
|
|
165
187
|
"""
|
|
166
|
-
return self.get_hist_source().get_histogram(self.bins)
|
|
188
|
+
return self.get_hist_source().get_histogram(self.bins, self.bin_range)
|
|
167
189
|
|
|
168
190
|
def update_histogram(self) -> None:
|
|
169
191
|
"""Update histogram data"""
|
|
170
192
|
if self.get_hist_source() is None:
|
|
171
193
|
return
|
|
172
194
|
hist, bin_edges = self.compute_histogram()
|
|
173
|
-
|
|
195
|
+
# Duplicate the first `hist` value to get a step-like histogram:
|
|
196
|
+
hist = np.concatenate(([hist[0]], hist))
|
|
174
197
|
if self.logscale:
|
|
175
198
|
hist = np.log(hist + 1)
|
|
176
199
|
|
|
@@ -946,22 +946,28 @@ class BaseImageItem(QwtPlotItem):
|
|
|
946
946
|
"""
|
|
947
947
|
return False
|
|
948
948
|
|
|
949
|
-
def get_histogram(
|
|
949
|
+
def get_histogram(
|
|
950
|
+
self, nbins: int, drange: tuple[float, float] | None = None
|
|
951
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
950
952
|
"""
|
|
951
953
|
Return a tuple (hist, bins) where hist is a list of histogram values
|
|
952
954
|
|
|
953
955
|
Args:
|
|
954
|
-
nbins
|
|
956
|
+
nbins: number of bins
|
|
957
|
+
drange: lower and upper range of the bins. If not provided, range is
|
|
958
|
+
simply (data.min(), data.max()). Values outside the range are ignored.
|
|
955
959
|
|
|
956
960
|
Returns:
|
|
957
|
-
|
|
961
|
+
Tuple (hist, bins)
|
|
958
962
|
"""
|
|
959
963
|
if self.data is None:
|
|
960
964
|
return [0], [0, 1]
|
|
961
965
|
if self.histogram_cache is None or nbins != self.histogram_cache[0].shape[0]:
|
|
962
966
|
if True:
|
|
963
967
|
# Note: np.histogram does not accept data with NaN
|
|
964
|
-
res = np.histogram(
|
|
968
|
+
res = np.histogram(
|
|
969
|
+
self.data[~np.isnan(self.data)], bins=nbins, range=drange
|
|
970
|
+
)
|
|
965
971
|
else:
|
|
966
972
|
# TODO: _histogram is faster, but caching is buggy in this version
|
|
967
973
|
_min, _max = get_nan_range(self.data)
|
|
@@ -405,20 +405,26 @@ class Histogram2DItem(BaseImageItem):
|
|
|
405
405
|
"""
|
|
406
406
|
return True
|
|
407
407
|
|
|
408
|
-
def get_histogram(
|
|
408
|
+
def get_histogram(
|
|
409
|
+
self, nbins: int, drange: tuple[float, float] | None = None
|
|
410
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
409
411
|
"""
|
|
410
412
|
Return a tuple (hist, bins) where hist is a list of histogram values
|
|
411
413
|
|
|
412
414
|
Args:
|
|
413
|
-
nbins
|
|
415
|
+
nbins: number of bins
|
|
416
|
+
drange: lower and upper range of the bins. If not provided, range is
|
|
417
|
+
simply (data.min(), data.max()). Values outside the range are ignored.
|
|
414
418
|
|
|
415
419
|
Returns:
|
|
416
|
-
|
|
420
|
+
Tuple (hist, bins)
|
|
417
421
|
"""
|
|
418
422
|
if self.data is None:
|
|
419
423
|
return [0], [0, 1]
|
|
420
424
|
_min, _max = get_nan_range(self.data)
|
|
421
|
-
if
|
|
425
|
+
if drange is not None:
|
|
426
|
+
bins = np.linspace(drange[0], drange[1], nbins + 1)
|
|
427
|
+
elif self.data.dtype in (np.float64, np.float32):
|
|
422
428
|
bins = np.unique(
|
|
423
429
|
np.array(np.linspace(_min, _max, nbins + 1), dtype=self.data.dtype)
|
|
424
430
|
)
|
|
Binary file
|
|
@@ -19,6 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
from typing import TYPE_CHECKING
|
|
21
21
|
|
|
22
|
+
import numpy as np
|
|
22
23
|
from guidata.configtools import get_icon, get_image_layout
|
|
23
24
|
from guidata.dataset import DataSet, FloatItem
|
|
24
25
|
from guidata.qthelpers import add_actions, create_action
|
|
@@ -37,7 +38,7 @@ from plotpy.styles import CurveParam, HistogramParam
|
|
|
37
38
|
from plotpy.tools import AntiAliasingTool, BasePlotMenuTool, SelectPointTool, SelectTool
|
|
38
39
|
|
|
39
40
|
if TYPE_CHECKING: # pragma: no cover
|
|
40
|
-
from collections.abc import Callable
|
|
41
|
+
from collections.abc import Callable, Generator
|
|
41
42
|
|
|
42
43
|
from qtpy.QtWidgets import QWidget
|
|
43
44
|
|
|
@@ -65,14 +66,10 @@ class LevelsHistogram(BasePlot):
|
|
|
65
66
|
self.antialiased = False
|
|
66
67
|
|
|
67
68
|
# a dict of dict : plot -> selected items -> HistogramItem
|
|
68
|
-
self._tracked_items: dict[BasePlot, dict[BaseImageItem,
|
|
69
|
+
self._tracked_items: dict[BasePlot, dict[BaseImageItem, HistogramItem]] = {}
|
|
69
70
|
self.param = CurveParam(_("Curve"), icon="curve.png")
|
|
70
71
|
self.param.read_config(CONF, "histogram", "curve")
|
|
71
72
|
|
|
72
|
-
self.histparam = HistogramParam(_("Histogram"), icon="histogram.png")
|
|
73
|
-
self.histparam.logscale = False
|
|
74
|
-
self.histparam.n_bins = 256
|
|
75
|
-
|
|
76
73
|
self.range = XRangeSelection(0, 1)
|
|
77
74
|
self.range_mono_color = self.range.shapeparam.sel_line.color
|
|
78
75
|
self.range_multi_color = CONF.get("histogram", "range/multi/color", "red")
|
|
@@ -103,11 +100,13 @@ class LevelsHistogram(BasePlot):
|
|
|
103
100
|
plot.SIG_ITEM_REMOVED.connect(self.item_removed)
|
|
104
101
|
plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.active_item_changed)
|
|
105
102
|
|
|
106
|
-
def tracked_items_gen(
|
|
103
|
+
def tracked_items_gen(
|
|
104
|
+
self,
|
|
105
|
+
) -> Generator[tuple[BaseImageItem, HistogramItem], None, None]:
|
|
107
106
|
"""Generator of tracked items"""
|
|
108
|
-
for
|
|
109
|
-
for
|
|
110
|
-
yield
|
|
107
|
+
for _plot, items in list(self._tracked_items.items()):
|
|
108
|
+
for item_curve_tuple in list(items.items()):
|
|
109
|
+
yield item_curve_tuple # tuple item,curve
|
|
111
110
|
|
|
112
111
|
def __del_known_items(self, known_items: dict, items: list) -> None:
|
|
113
112
|
"""Delete known items
|
|
@@ -129,7 +128,9 @@ class LevelsHistogram(BasePlot):
|
|
|
129
128
|
Args:
|
|
130
129
|
plot: plot whose selection changed
|
|
131
130
|
"""
|
|
132
|
-
items = plot.get_selected_items(
|
|
131
|
+
items: list[BaseImageItem] = plot.get_selected_items(
|
|
132
|
+
item_type=IVoiImageItemType
|
|
133
|
+
)
|
|
133
134
|
known_items = self._tracked_items.setdefault(plot, {})
|
|
134
135
|
|
|
135
136
|
if items:
|
|
@@ -153,13 +154,10 @@ class LevelsHistogram(BasePlot):
|
|
|
153
154
|
|
|
154
155
|
for item in items:
|
|
155
156
|
if item not in known_items:
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
else:
|
|
161
|
-
self.histparam.n_bins = 256
|
|
162
|
-
curve = HistogramItem(self.param, self.histparam, keep_weakref=True)
|
|
157
|
+
histparam = HistogramParam(_("Histogram"), icon="histogram.png")
|
|
158
|
+
histparam.logscale = False
|
|
159
|
+
histparam.n_bins = 256
|
|
160
|
+
curve = HistogramItem(self.param, histparam, keep_weakref=True)
|
|
163
161
|
curve.set_hist_source(item)
|
|
164
162
|
self.add_item(curve, z=0)
|
|
165
163
|
known_items[item] = curve
|
|
@@ -170,8 +168,18 @@ class LevelsHistogram(BasePlot):
|
|
|
170
168
|
return
|
|
171
169
|
self.param.shade = 1.0 / nb_selected
|
|
172
170
|
for item, curve in self.tracked_items_gen():
|
|
171
|
+
if np.issubdtype(item.data.dtype, np.integer):
|
|
172
|
+
# For integer data, we use the full range of data type
|
|
173
|
+
info = np.iinfo(item.data.dtype)
|
|
174
|
+
curve.histparam.bin_min = info.min
|
|
175
|
+
curve.histparam.bin_max = info.max
|
|
176
|
+
curve.histparam.n_bins = min(info.max - info.min + 1, 256)
|
|
177
|
+
else:
|
|
178
|
+
curve.histparam.bin_min = None
|
|
179
|
+
curve.histparam.bin_max = None
|
|
180
|
+
curve.histparam.n_bins = 256
|
|
173
181
|
self.param.update_item(curve)
|
|
174
|
-
|
|
182
|
+
curve.histparam.update_hist(curve)
|
|
175
183
|
|
|
176
184
|
self.active_item_changed(plot)
|
|
177
185
|
|
|
@@ -467,6 +475,7 @@ class ContrastAdjustment(PanelWidget):
|
|
|
467
475
|
tip=_("Select minimum level on image"),
|
|
468
476
|
toolbar_id="contrast",
|
|
469
477
|
end_callback=self.apply_min_selection,
|
|
478
|
+
switch_to_default_tool=True,
|
|
470
479
|
)
|
|
471
480
|
self.max_select_tool = self.manager.add_tool(
|
|
472
481
|
SelectPointTool,
|
|
@@ -476,6 +485,7 @@ class ContrastAdjustment(PanelWidget):
|
|
|
476
485
|
tip=_("Select maximum level on image"),
|
|
477
486
|
toolbar_id="contrast",
|
|
478
487
|
end_callback=self.apply_max_selection,
|
|
488
|
+
switch_to_default_tool=True,
|
|
479
489
|
)
|
|
480
490
|
|
|
481
491
|
def get_plot(self) -> BasePlot:
|
|
@@ -536,6 +546,7 @@ class ContrastAdjustment(PanelWidget):
|
|
|
536
546
|
point = self.min_select_tool.get_coordinates()
|
|
537
547
|
z = item.get_data(*point)
|
|
538
548
|
self.histogram.set_min(z)
|
|
549
|
+
tool.SIG_TOOL_JOB_FINISHED.emit()
|
|
539
550
|
|
|
540
551
|
def apply_max_selection(self, tool: SelectPointTool) -> None:
|
|
541
552
|
"""Apply maximum selection
|
|
@@ -547,6 +558,7 @@ class ContrastAdjustment(PanelWidget):
|
|
|
547
558
|
point = self.max_select_tool.get_coordinates()
|
|
548
559
|
z = item.get_data(*point)
|
|
549
560
|
self.histogram.set_max(z)
|
|
561
|
+
tool.SIG_TOOL_JOB_FINISHED.emit()
|
|
550
562
|
|
|
551
563
|
def set_range(self, _min: float, _max: float) -> None:
|
|
552
564
|
"""Set contrast panel's histogram range
|
|
@@ -311,14 +311,6 @@ class CrossSectionItem(ErrorBarCurveItem):
|
|
|
311
311
|
sectx, secty = self.get_cross_section(obj)
|
|
312
312
|
if secty.size == 0 or np.all(np.isnan(secty)):
|
|
313
313
|
sectx, secty = np.array([]), np.array([])
|
|
314
|
-
elif self.param.curvestyle != "Steps":
|
|
315
|
-
# Center the symbols at the middle of pixels
|
|
316
|
-
# Bugfix, we deactivate warnings only for numpy method call.
|
|
317
|
-
# (V1.0.10 => V1.0.11)
|
|
318
|
-
# Deactivate following warnings after 20210218 mail
|
|
319
|
-
# warnings.filterwarnings('ignore')
|
|
320
|
-
sectx[:-1] += np.mean(np.diff(sectx) / 2)
|
|
321
|
-
# warnings.filterwarnings('default')
|
|
322
314
|
if self.orientation() == QC.Qt.Orientation.Vertical:
|
|
323
315
|
self.process_curve_data(secty, sectx)
|
|
324
316
|
else:
|
|
@@ -2172,17 +2172,22 @@ class BasePlot(qwt.QwtPlot):
|
|
|
2172
2172
|
return x0, x1, y0, y1
|
|
2173
2173
|
|
|
2174
2174
|
# ---- Image scale/aspect ratio -related API -------------------------------
|
|
2175
|
-
def get_current_aspect_ratio(self) -> float:
|
|
2175
|
+
def get_current_aspect_ratio(self) -> float | None:
|
|
2176
2176
|
"""Return current aspect ratio
|
|
2177
2177
|
|
|
2178
2178
|
Returns:
|
|
2179
|
-
|
|
2179
|
+
The current aspect ratio or None if the aspect ratio cannot be computed
|
|
2180
|
+
(this happens when the plot has been shrunk to a size so that the
|
|
2181
|
+
width is zero)
|
|
2180
2182
|
"""
|
|
2181
2183
|
dx = self.axisScaleDiv(self.X_BOTTOM).range()
|
|
2182
2184
|
dy = self.axisScaleDiv(self.Y_LEFT).range()
|
|
2183
2185
|
h = self.canvasMap(self.Y_LEFT).pDist()
|
|
2184
2186
|
w = self.canvasMap(self.X_BOTTOM).pDist()
|
|
2185
|
-
|
|
2187
|
+
try:
|
|
2188
|
+
return fabs((h * dx) / (w * dy))
|
|
2189
|
+
except ZeroDivisionError:
|
|
2190
|
+
return None
|
|
2186
2191
|
|
|
2187
2192
|
def get_aspect_ratio(self) -> float:
|
|
2188
2193
|
"""Return aspect ratio
|
|
@@ -2220,7 +2225,9 @@ class BasePlot(qwt.QwtPlot):
|
|
|
2220
2225
|
if not self.isVisible():
|
|
2221
2226
|
return
|
|
2222
2227
|
current_aspect = self.get_current_aspect_ratio()
|
|
2223
|
-
if
|
|
2228
|
+
if current_aspect is None or (
|
|
2229
|
+
abs(current_aspect - self.__aspect_ratio) < self.EPSILON_ASPECT_RATIO
|
|
2230
|
+
):
|
|
2224
2231
|
return
|
|
2225
2232
|
ymap = self.canvasMap(self.Y_LEFT)
|
|
2226
2233
|
xmap = self.canvasMap(self.X_BOTTOM)
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
3
7
|
from guidata.dataset import (
|
|
4
8
|
BoolItem,
|
|
5
9
|
ChoiceItem,
|
|
6
10
|
ColorItem,
|
|
7
11
|
DataSet,
|
|
12
|
+
FloatItem,
|
|
8
13
|
GetAttrProp,
|
|
9
14
|
IntItem,
|
|
10
15
|
StringItem,
|
|
@@ -14,26 +19,39 @@ from plotpy.config import _
|
|
|
14
19
|
from plotpy.styles.base import ItemParameters
|
|
15
20
|
from plotpy.styles.image import BaseImageParam
|
|
16
21
|
|
|
22
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
23
|
+
from plotpy.items import Histogram2DItem, HistogramItem
|
|
24
|
+
|
|
17
25
|
|
|
18
26
|
class HistogramParam(DataSet):
|
|
19
27
|
n_bins = IntItem(_("Bins"), default=100, min=1, help=_("Number of bins"))
|
|
28
|
+
bin_min = FloatItem(_("Min"), default=None, help=_("Minimum value"), check=False)
|
|
29
|
+
bin_max = FloatItem(_("Max"), default=None, help=_("Maximum value"), check=False)
|
|
20
30
|
logscale = BoolItem(_("logarithmic"), _("Y-axis scale"), default=False)
|
|
21
31
|
|
|
22
|
-
def update_param(self,
|
|
23
|
-
"""
|
|
32
|
+
def update_param(self, item: HistogramItem) -> None:
|
|
33
|
+
"""Update the histogram parameters from the plot item
|
|
24
34
|
|
|
25
|
-
:
|
|
35
|
+
Args:
|
|
36
|
+
item: Histogram item
|
|
26
37
|
"""
|
|
27
|
-
self.n_bins =
|
|
28
|
-
self.
|
|
38
|
+
self.n_bins = item.get_bins()
|
|
39
|
+
self.bin_min, self.bin_max = item.get_bin_range()
|
|
40
|
+
self.logscale = item.get_logscale()
|
|
29
41
|
|
|
30
|
-
def update_hist(self,
|
|
31
|
-
"""
|
|
42
|
+
def update_hist(self, item: HistogramItem) -> None:
|
|
43
|
+
"""Update the histogram plot item from the parameters
|
|
32
44
|
|
|
33
|
-
:
|
|
45
|
+
Args:
|
|
46
|
+
item: Histogram item
|
|
34
47
|
"""
|
|
35
|
-
|
|
36
|
-
|
|
48
|
+
if self.bin_min is None or self.bin_max is None:
|
|
49
|
+
item.bin_range = None
|
|
50
|
+
else:
|
|
51
|
+
item.bin_range = (self.bin_min, self.bin_max)
|
|
52
|
+
item.bins = self.n_bins
|
|
53
|
+
item.logscale = self.logscale
|
|
54
|
+
item.update_histogram()
|
|
37
55
|
|
|
38
56
|
|
|
39
57
|
class Histogram2DParam(BaseImageParam):
|
|
@@ -79,24 +97,26 @@ class Histogram2DParam(BaseImageParam):
|
|
|
79
97
|
help=_("Background color when no data is present"),
|
|
80
98
|
)
|
|
81
99
|
|
|
82
|
-
def update_param(self,
|
|
83
|
-
"""
|
|
100
|
+
def update_param(self, item: Histogram2DItem) -> None:
|
|
101
|
+
"""Update the histogram parameters from the plot item
|
|
84
102
|
|
|
85
|
-
:
|
|
103
|
+
Args:
|
|
104
|
+
item: 2D Histogram item
|
|
86
105
|
"""
|
|
87
|
-
super().update_param(
|
|
88
|
-
self.logscale =
|
|
89
|
-
self.nx_bins, self.ny_bins =
|
|
106
|
+
super().update_param(item)
|
|
107
|
+
self.logscale = item.logscale
|
|
108
|
+
self.nx_bins, self.ny_bins = item.nx_bins, item.ny_bins
|
|
90
109
|
|
|
91
|
-
def update_histogram(self,
|
|
92
|
-
"""
|
|
110
|
+
def update_histogram(self, item: Histogram2DItem) -> None:
|
|
111
|
+
"""Update the histogram plot item from the parameters
|
|
93
112
|
|
|
94
|
-
:
|
|
113
|
+
Args:
|
|
114
|
+
item: 2D Histogram item
|
|
95
115
|
"""
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
self.update_item(
|
|
116
|
+
item.logscale = int(self.logscale)
|
|
117
|
+
item.set_background_color(self.background)
|
|
118
|
+
item.set_bins(self.nx_bins, self.ny_bins)
|
|
119
|
+
self.update_item(item)
|
|
100
120
|
|
|
101
121
|
|
|
102
122
|
class Histogram2DParam_MS(Histogram2DParam):
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
# guitest: show
|
|
9
9
|
|
|
10
10
|
from guidata.qthelpers import qt_app_context, win32_fix_title_bar_background
|
|
11
|
+
from qtpy import QtCore as QC
|
|
11
12
|
from qtpy import QtWidgets as QW
|
|
12
13
|
|
|
13
14
|
from plotpy.builder import make
|
|
@@ -45,6 +46,12 @@ class CentralWidget(QW.QWidget):
|
|
|
45
46
|
def register_tools(self):
|
|
46
47
|
self.manager.register_all_image_tools()
|
|
47
48
|
|
|
49
|
+
def minimumSizeHint(self):
|
|
50
|
+
"""Override QWidget method"""
|
|
51
|
+
# The purpose of this reimplementation is to trigger the issue #3
|
|
52
|
+
# (see https://github.com/PlotPyStack/PlotPy/issues/3)
|
|
53
|
+
return QC.QSize(150, 100)
|
|
54
|
+
|
|
48
55
|
|
|
49
56
|
class Window(QW.QMainWindow):
|
|
50
57
|
def __init__(self):
|
|
@@ -75,5 +82,19 @@ def test_manager():
|
|
|
75
82
|
win.show()
|
|
76
83
|
|
|
77
84
|
|
|
85
|
+
def test_resize_to_minimum_width():
|
|
86
|
+
"""Testing resize window to minimum width"""
|
|
87
|
+
# This test was failing at the time of Issue #3
|
|
88
|
+
# (see https://github.com/PlotPyStack/PlotPy/issues/3)
|
|
89
|
+
with qt_app_context(exec_loop=False):
|
|
90
|
+
win = Window()
|
|
91
|
+
win.show()
|
|
92
|
+
width = 350
|
|
93
|
+
while width > win.minimumWidth():
|
|
94
|
+
width -= 1
|
|
95
|
+
win.resize(width, 100)
|
|
96
|
+
|
|
97
|
+
|
|
78
98
|
if __name__ == "__main__":
|
|
79
99
|
test_manager()
|
|
100
|
+
# test_resize_to_minimum_width()
|
|
@@ -15,7 +15,7 @@ from plotpy.builder import make
|
|
|
15
15
|
from plotpy.config import _
|
|
16
16
|
from plotpy.items import RawImageItem
|
|
17
17
|
from plotpy.mandelbrot import mandelbrot
|
|
18
|
-
from plotpy.tools
|
|
18
|
+
from plotpy.tools import ToggleTool
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class FullScale(ToggleTool):
|
|
@@ -64,20 +64,26 @@ class MandelItem(RawImageItem):
|
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def create_mandelbrot_window():
|
|
68
|
+
"""Create a Mandelbrot set window"""
|
|
69
|
+
win = make.window(
|
|
70
|
+
toolbar=True,
|
|
71
|
+
wintitle="Mandelbrot",
|
|
72
|
+
yreverse=False,
|
|
73
|
+
type="image",
|
|
74
|
+
)
|
|
75
|
+
mandel = MandelItem(-1.5, 0.5, -1.0, 1.0)
|
|
76
|
+
fstool = win.manager.add_tool(FullScale, mandel)
|
|
77
|
+
plot = win.get_plot()
|
|
78
|
+
plot.set_aspect_ratio(lock=False)
|
|
79
|
+
plot.add_item(mandel)
|
|
80
|
+
return win, mandel, fstool
|
|
81
|
+
|
|
82
|
+
|
|
67
83
|
def test_mandel():
|
|
84
|
+
"""Test Mandelbrot set window"""
|
|
68
85
|
with qt_app_context(exec_loop=True):
|
|
69
|
-
win =
|
|
70
|
-
edit=True,
|
|
71
|
-
toolbar=True,
|
|
72
|
-
wintitle="Mandelbrot",
|
|
73
|
-
yreverse=False,
|
|
74
|
-
type="image",
|
|
75
|
-
)
|
|
76
|
-
mandel = MandelItem(-1.5, 0.5, -1.0, 1.0)
|
|
77
|
-
win.manager.add_tool(FullScale, mandel)
|
|
78
|
-
plot = win.manager.get_plot()
|
|
79
|
-
plot.set_aspect_ratio(lock=False)
|
|
80
|
-
plot.add_item(mandel)
|
|
86
|
+
win, _mandel, _fstool = create_mandelbrot_window()
|
|
81
87
|
win.show()
|
|
82
88
|
|
|
83
89
|
|