Releases: PlotPyStack/PlotPy
Release list
v2.7.3
In this release, test coverage is 80%.
🛠️ Bug fixes:
- Issue #40 - Z-axis logarithmic scale (
ZAxisLogTooltool) is not compatible with anti-aliasing interpolation - Fix intersection check for destination rectangle in
XYImageFilterItem - Issue #36 - Image items are not properly scaling along Y-axis with logarithmic scale:
- Actually, image items do not support non-linear scales (this is an historical limitation)
- This is not documented at all, so we've added an explicit warning: a red colored message is displayed at the center of the image frame when any non-linear scale is applied to either X or Y axis
- When dealing with non-linear scales, PlotPy provides an alternative solution: the user may rely on
XYImageItem(e.g. by usingmake.xyimage) as this item supports arbitrary X and Y pixel coordinates
- Issue #34 -
ValueErrorwhen trying to plot 2D histogram items withPyQt6
Other changes:
- Replace deprecated icon files with new SVG icons for selection tools
v2.7.2
v2.7.1
Version 2.7.1
🛠️ Bug fixes:
- Fixed update
canvasRecttype toQRectFfor intersection checks inCircleSVGShape, following this bug fix inPythonQwtV0.14.4 - Fixed regression with respect to
guiqwtregarding plot items instantiation:guiqwtwas allowing to instantiate plot items without needing to create aQApplicationinstance (no GUI event loop was required)- This was not the case with
plotpy, so that it was not possible -for example- to serialize/deserialize plot items to JSON without creating aQApplicationinstance - This has been fixed by removing the
QIconinstantiation from the plot items constructors (call toQwtPlotItem.setIconmethod). Note that -in the meantime-QwtPlotItem.setIconandQwtPlotItem.iconmethods have also been removed in PythonQwt V0.14.3. Code relying on this feature should thus be updated to use the newget_icon_namemethod instead, i.e.get_icon(item.get_icon_name())instead ofitem.icon().
- Issue #26 - Item list panel should not allow to select a non-selectable item
v2.7.0
Version 2.7.0
Supported versions of Python have been updated (drop support for Python 3.8, add support for Python 3.13):
- PlotPy < 2.7.0: Python 3.8, 3.9, 3.10, 3.11 and 3.12
- PlotPy >= 2.7.0: Python 3.9, 3.10, 3.11, 3.12 and 3.13
Other dependencies have been updated:
- Updated versions to those available at the time of the release of the oldest supported Python version (3.9)
- Exception: Cython 3.0 is required for Python 3.13
💥 New features / Enhancements:
- Added
AnnotatedPolygonannotation to items - Added
make.annotated_polygonfunction toplotpy.buildermodule - Customization of annotation information:
- Added
info_callbackargument to all annotation class constructors - Added
set_info_callbackmethod to all annotation classes - The
info_callbackis a function that takes the annotation object and returns a string with the information to display - Default
info_callbackis redirected to theget_infosmethod of the annotation object (this makes the feature backward compatible)
- Added
🛠️ Bug fixes:
- Fixed
pydicomsupport: usedcmreadinstead ofread_fileto read DICOM files
v2.6.3
⚡ Ready-to-use packages for all platforms are available on PyPI
🧯 In this release, test coverage is 79%.
🛠️ Bug fixes:
- Issue #25 -
OverflowErrorwith Contrast Adjustment panel for constant images - When updating image parameters (
ImageParam) from the associated item object:- If
xmin,xmax,ymin,ymaxattributes are not yet set (i.e.None), do not update them with the image data bounds - Previous behavior was to update them with the image data bounds, which was leading to breaking the automatic bounds update when the image data is updated
- If
- Issue #24 - Colormap: side effect on image axes when changing the colormap
- Issue #23 - Windows: Image
_scalerengine performance regression - PySide6 compatibility issues:
- Fixed deprecated call to
QMouseEventintests/unit/utils.py - Added workaround for
QPolygonFshape point slicing
- Fixed deprecated call to
- Issue #21 - PySide6 on Linux: segfault in test_colormap_editor.py
- Fixed
sliderMovedsignal connection inColorMapEditor - Fixed
AssertionErrorin test_rect_zoom.py (Linux, Python 3.12, PyQt6) - Fixed typing issues in
plotpy.eventsmodule:- Event objects were not properly typed (
QtCore.QEventinstead ofQtGui.QMouseEvent) - Event position arguments were not properly typed (
QtCore.QPointinstead ofQtCore.QPointF)
- Event objects were not properly typed (
- Fix NumPy
FutureWarning: Format strings passed to MaskedConstant are ignored [...]when displaying masked pixel coordinates
v2.6.2
⚡ Ready-to-use packages for all platforms are available on PyPI
💥 New features / Enhancements:
- Added Wheel packages for all major platforms on PyPI:
- Windows (32/64bits), MacOS, Linux
- Python 3.8 to 3.12
🛠️ Bug fixes:
- Fixed color theme support (dark/light mode), leveraging the new
guidataV3.6 feature
v2.6.1
ℹ️ Release V2.6.0 was a fugitive release that was replaced by V2.6.1 due to a critical bug in the segment line cross section computation for masked images.
💥 New features / Enhancements:
- Added support for color theme change at execution (relies on guidata V3.6)
- Changed strategy for default plot widget size:
- No default size is applied to the plot widget anymore (before, the default size was 800x600 pixels)
- Added parameter
sizetoPlotDialog,PlotWindowclasses, andmake.dialog,make.windowfunctions to set the initial size of the plot widget
🛠️ Bug fixes:
- Fixed segment line cross section computation for masked images:
- Avoided warning message when encountering masked values in the image data
- Replacing masked values by NaNs when computing the segment line cross section (as before, but explicitely, to avoid the warning message)
v2.6.0
💥 New features / Enhancements:
- Added support for color theme change at execution (relies on guidata V3.6)
- Changed strategy for default plot widget size:
- No default size is applied to the plot widget anymore (before, the default size was 800x600 pixels)
- Added parameter
sizetoPlotDialog,PlotWindowclasses, andmake.dialog,make.windowfunctions to set the initial size of the plot widget
🛠️ Bug fixes:
- Fixed segment line cross section computation for masked images:
- Avoided warning message when encountering masked values in the image data
- Replacing masked values by NaNs when computing the segment line cross section (as before, but explicitely, to avoid the warning message)
v2.5.1
ℹ️ Release V2.5.0 was a fugitive release that was replaced by V2.5.1 due to packaging issues.
In this release, test coverage is 79%.
💥 New features / Enhancements:
-
Alternative dictionary argument for plot options:
- This new feature was introduced in the context of the cyclic import bug fix, to avoid importing the
plotpy.plotmodule just to get thePlotOptionsorBasePlotOptionsclasses - All classes (and a few functions) that used to take an
optionsargument as aBasePlotOptionsorPlotOptionsinstance now also accept a dictionary argument with the same keys as theBasePlotOptionsorPlotOptionsclass attributes, and the same values as the corresponding attributes - This concerns the following classes and functions:
plotpy.plot.BasePlotplotpy.plot.PlotWidgetplotpy.plot.PlotDialogplotpy.plot.PlotWindowplotpy.plot.SubPlotWidgetplotpy.plot.SyncPlotWindowplotpy.tools.RotateCropToolplotpy.widgets.fit.FitDialogplotpy.widgets.fliprotate.FlipRotateDialogplotpy.widgets.rotatecrop.RotateCropDialogplotpy.widgets.selectdialog.SelectDialogplotpy.widgets.selectdialog.select_with_shape_tool
- This new feature was introduced in the context of the cyclic import bug fix, to avoid importing the
-
Added "Lock LUT range" option for image items:
- This new option is disabled by default, which matches the previous behavior: when updating an image item data, the LUT range is automatically adjusted to the new data range (if not passed as an argument to the
BaseImageItem.set_datamethod) - When enabled, the LUT range is locked and the LUT range is not adjusted when updating the image item data
- The option is available in image parameters dialog
- A new tool
LockLUTRangeToolhas been implemented to toggle the option from the plot context menu: the tool is not registered by default in the plot widget, but can be added by the host application if needed - See test script
tests.features.test_image_data_updatefor an example of usage of the new option and tool
- This new option is disabled by default, which matches the previous behavior: when updating an image item data, the LUT range is automatically adjusted to the new data range (if not passed as an argument to the
-
Added missing
set_stylemethod toXRangeSelectionclass: this method is used to set the style of the range selection item from configuration options
🛠️ Bug fixes:
- Issue #19 - Fix
distutilsdeprecation in setup.py: replaceddistutils.corebysetuptoolsin the setup.py script to avoid the deprecation warning when building the package with Python 3.10 and 3.11, and to ensure compatibility with earlier Python versions (PlotPy is already compatible with the most recent Python versions: this only concerns the build system) - Fix cyclic import in
plotpy.toolsmodule:- Some tools in
plotpy.toolssubpackage were importing theplotpy.plotmodule, which was importing theplotpy.toolsmodule, causing a cyclic import issue - This is now fixed by introducing new constants for axis IDs in the
plotpy.constantsmodule, and using them everywhere in the code, thus avoiding to import theplotpy.plotmodule just to get the axis IDs
- Some tools in
- Fix empty label in X/Y cross section plots:
- This is a regression introduced in V2.1.0
- When showing the X/Y cross section plots (using the plot context menu), an empty label was displayed at the center of each of those plots
- The label now shows "Enable a marker" as previously
- Fix historic unexpected behavior of interactive tools:
- When triggering an interactive tool (e.g. by clicking on the corresponding toolbar button), the tool
activatemethod was called twice, which was not expected, but was not causing any issue given the current implementation - However, when defining custom interactive tools, this behavior could lead to unexpected results (i.e. really executing activation actions twice)
- This is now fixed: the
activatemethod is called only once when triggering an interactive tool
- When triggering an interactive tool (e.g. by clicking on the corresponding toolbar button), the tool
v2.4.2
Version 2.4.2
In this release, test coverage is 79%.
🛠️ Bug fixes:
- Issue #17:
- Debian's Python team has reported that the contour unit test was failing on
arm64
architecture - This is the opportunity to replace the
contour2dCython extension by scikit-image's
find_contoursfunction, thus avoiding to reinvent the wheel by relying on a more
robust and tested implementation - The
contour2dCython extension is removed from the source code - The contour related features remain the same, but the implementation is now based on
scikit-image'sfind_contoursfunction - The scikit-image dependency is added to the package requirements
- Debian's Python team has reported that the contour unit test was failing on