v2.0.1 - Maintenance release
That's it, PlotPy V2, the successor of guiqwt is available!
Version 2.0.1
🛠️ Bug fixes:
- Fixed
plotpy.tools.AnnotatedEllipseTool
:AttributeError
when finalizing the shape plotpy.widgets.select_with_shape_tool
: added missingtoolbar
andoptions
parametersitems.XRangeSelection
is now serializable, as expected
📚 Documentation:
plotpy.plot.SyncPlotWindow
: added missing documentation- Added more information on PlotPyStack
- New "Motivation" section explaining the reasons behind the creation of PlotPy
Version 2.0.0
This version is the first release of the 2.0 series, which is distributed under the BSD 3-Clause License.
PlotPy 2.0 is a major release that brings a lot of new features and bug fixes.
When initiated in 2016, PlotPy 1.0 was the result of the merge of two projects (as well as some other changes, e.g. a redesign of the API):
- guidata, a Python library generating graphical user interfaces for easy dataset editing and display
- guiqwt, a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development
With PlotPy 2.0, the guidata code base has been reextracted: PlotPy now relies on guidata as a dependency, like before the merge.
PlotPy 2.0 also integrates all the bug fixes (>30) and new features that were added to guiqwt since the merge (i.e. between 2016 and 2023).
Supported versions of Python and Qt bindings have been updated:
- Python: 3.8, 3.9, and 3.10 (3.11 should work too, but will be officially supported when dropping support for Python 3.8, to keep a 3-year support period)
- Qt bindings: PyQt5 (even if PyQt6 and PySide6 are not officially supported, efforts have been made and will continue to be made to support them)
PlotPy 2.0 is a major release because it also brings a lot of new features:
-
plot.PlotWidget
,plot.PlotDialog
, andplot.PlotWindow
: API overhaul (simple, more consistent, more flexible, more extensible - see documentation for details) -
plot.SyncPlotWindow
: new class to show multiple plots in a single window, in a synchronized way (zoom, pan, etc.) -
widgets.selectdialog.SelectDialog
: a dialog box to select items using a shape tool (segment, rectangle or custom) -
Image lookup table (LUT):
- Initially, the LUT alpha channel was either constant (input parameter
alpha
was a float between 0 and 1) or linearly dependent on the image pixel values (when thealpha_mask
parameter was enabled) - Now, the LUT may be either constant (same as before) or dependent on the image pixel values but not only linearly: the LUT alpha channel may follow a linear, a sigmoid or an hyperbolic tangent function (see the new
alpha_function
parameter). The oldalpha_mask
parameter was removed
- Initially, the LUT alpha channel was either constant (input parameter
-
Image pixels are now centered on their coordinates:
- This means that the pixel at row
i
and columnj
is centered on the point(j, i)
(before, the top-left corner of the pixel at rowi
and columnj
was centered on the point(j, i)
) - This convention is more consistent with the way images are displayed in other scientific image processing tools
- This is one of the benefits of porting back guiqwt changes since the merge (i.e. between 2016 and 2023)
- This means that the pixel at row
-
New SVG-based shapes:
items.RectangleSVGShape
: rectangle shape based on SVG data or fileitems.SquareSVGShape
: square shape based on SVG data or fileitems.CircleSVGShape
: circle shape based on SVG data or file
-
builder.PlotBuilder
:- Renamed
PlotBuilder
(originallyguiqwt.builder.PlotItemBuilder
) - Builder instance is still available using
from plotpy.builder import make
- Plot widget creation is now supported:
make.widget()
forplot.PlotWidget
make.dialog()
forplot.PlotDialog
make.window()
forplot.PlotWindow
- Added support for more plot items:
make.contours()
for generating a list ofitems.ContourItem
objectsmake.annotated_point()
foritems.AnnotatedPoint
make.polygon()
foritems.PolygonShape
make.svg()
foritems.RectangleSVGShape
,items.SquareSVGShape
,
anditems.CircleSVGShape
- Renamed
-
Added JSON serialization support for all plot items (curve, image, etc.)
-
Brand new documentation, based on Sphinx with links to other projects API, examples and tutorials (e.g. on development related topics).
-
Black code formatting on all Python files
-
New automated test suite:
- Automatic execution:
--unattended
command line option (Qt loop is bypassed) - Test suite based on
pytest
, supportingpytest-cov
for coverage testing,
pytest-xvfb
for headless testing, andpytest-qt
for Qt testing - Added support for Coverage: test coverage improved up to 70%
- Automatic execution:
-
Added typing annotations on (almost) all Python files
-
Distribution: switched to
pyproject.toml
(still relying onsetuptools
and
setup.py
for building Cython/C++ extensions) -
Added code quality configuration files:
.pylintrc
: pylint configuration file.isort.cfg
: isort configuration file.coveragerc
: coverage configuration file
-
Added Visual Studio Code configuration files:
.vscode/settings.json
: Python interpreter, code formatting, etc..vscode/tasks.json
: build, test, etc..vscode/launch.json
: run current file, run tests, etc.
PlotPy 2.0 also brings a lot of bug fixes and improvements:
- Handled all Cython/C++ extensions compilation warnings
- Fixed all NumPy deprecation issues (e.g.
numpy.matrix
) - Fixed (annotated) circle/ellipse item creation/test
- Fixed all documentation build warnings
- Fixed regressions introduced by PlotPy V1 on top of guiqwt:
- Global references for the Debian package management
- Major aspect ratio issues:
- When resizing the plot widget (images were downsized indefinitely)
- When auto-scaling the plot widget (images were not displayed entirely)
TrImageItem
rotation algorithm- Oblique cross-section test
- About dialog, version informations
- Ported all guiqwt bug fixes since the merge
(i.e. between 2016 and 2023):- Added support for Visual Studio 2015 and earlier
- Speeding-up image alpha channel calculation
- Optimized colormap icon caching
- X-axis direction and auto-scale
- Added load test (with a very large number of plot widgets)
- Coordinates inversion in
EllipseShape
- ValueError with levels histogram
- Various fixes regarding plot item creation, cross-section features,
PyQt5 support, DICOM support, TIFF support, etc. - Etc.