Skip to content

Releases: PlotPyStack/PlotPy

v2.7.0

07 Nov 11:11
Compare
Choose a tag to compare

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 AnnotatedPolygon annotation to items
  • Added make.annotated_polygon function to plotpy.builder module
  • Customization of annotation information:
    • Added info_callback argument to all annotation class constructors
    • Added set_info_callback method to all annotation classes
    • The info_callback is a function that takes the annotation object and returns a string with the information to display
    • Default info_callback is redirected to the get_infos method of the annotation object (this makes the feature backward compatible)

🛠️ Bug fixes:

  • Fixed pydicom support: use dcmread instead of read_file to read DICOM files

v2.6.3

01 Oct 15:51
Compare
Choose a tag to compare

⚡ Ready-to-use packages for all platforms are available on PyPI

🧯 In this release, test coverage is 79%.

🛠️ Bug fixes:

  • Issue #25 - OverflowError with Contrast Adjustment panel for constant images
  • When updating image parameters (ImageParam) from the associated item object:
    • If xmin, xmax, ymin, ymax attributes 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
  • Issue #24 - Colormap: side effect on image axes when changing the colormap
  • Issue #23 - Windows: Image _scaler engine performance regression
  • PySide6 compatibility issues:
    • Fixed deprecated call to QMouseEvent in tests/unit/utils.py
    • Added workaround for QPolygonF shape point slicing
  • Issue #21 - PySide6 on Linux: segfault in test_colormap_editor.py
  • Fixed sliderMoved signal connection in ColorMapEditor
  • Fixed AssertionError in test_rect_zoom.py (Linux, Python 3.12, PyQt6)
  • Fixed typing issues in plotpy.events module:
    • Event objects were not properly typed (QtCore.QEvent instead of QtGui.QMouseEvent)
    • Event position arguments were not properly typed (QtCore.QPoint instead of QtCore.QPointF)
  • Fix NumPy FutureWarning: Format strings passed to MaskedConstant are ignored [...] when displaying masked pixel coordinates

v2.6.2

06 Aug 09:33
Compare
Choose a tag to compare

⚡ 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 guidata V3.6 feature

v2.6.1

02 Aug 13:30
Compare
Choose a tag to compare

ℹ️ 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 size to PlotDialog, PlotWindow classes, and make.dialog, make.window functions 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

02 Aug 13:08
Compare
Choose a tag to compare

💥 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 size to PlotDialog, PlotWindow classes, and make.dialog, make.window functions 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

01 Aug 09:43
Compare
Choose a tag to compare

ℹ️ 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.plot module just to get the PlotOptions or BasePlotOptions classes
    • All classes (and a few functions) that used to take an options argument as a BasePlotOptions or PlotOptions instance now also accept a dictionary argument with the same keys as the BasePlotOptions or PlotOptions class attributes, and the same values as the corresponding attributes
    • This concerns the following classes and functions:
      • plotpy.plot.BasePlot
      • plotpy.plot.PlotWidget
      • plotpy.plot.PlotDialog
      • plotpy.plot.PlotWindow
      • plotpy.plot.SubPlotWidget
      • plotpy.plot.SyncPlotWindow
      • plotpy.tools.RotateCropTool
      • plotpy.widgets.fit.FitDialog
      • plotpy.widgets.fliprotate.FlipRotateDialog
      • plotpy.widgets.rotatecrop.RotateCropDialog
      • plotpy.widgets.selectdialog.SelectDialog
      • plotpy.widgets.selectdialog.select_with_shape_tool
  • 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_data method)
    • 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 LockLUTRangeTool has 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_update for an example of usage of the new option and tool
  • Added missing set_style method to XRangeSelection class: this method is used to set the style of the range selection item from configuration options

🛠️ Bug fixes:

  • Issue #19 - Fix distutils deprecation in setup.py: replaced distutils.core by setuptools in 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.tools module:
    • Some tools in plotpy.tools subpackage were importing the plotpy.plot module, which was importing the plotpy.tools module, causing a cyclic import issue
    • This is now fixed by introducing new constants for axis IDs in the plotpy.constants module, and using them everywhere in the code, thus avoiding to import the plotpy.plot module just to get the axis IDs
  • 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 activate method 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 activate method is called only once when triggering an interactive tool

v2.4.2

16 Jul 10:01
Compare
Choose a tag to compare

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 contour2d Cython extension by scikit-image's
      find_contours function, thus avoiding to reinvent the wheel by relying on a more
      robust and tested implementation
    • The contour2d Cython extension is removed from the source code
    • The contour related features remain the same, but the implementation is now based on
      scikit-image's find_contours function
    • The scikit-image dependency is added to the package requirements

v2.4.1

09 Jul 07:33
Compare
Choose a tag to compare

Version 2.4.1

In this release, test coverage is 79%.

🛠️ Bug fixes:

  • Contrast adjustment panel:
    • A regression was introduced in V2.0.0: levels histogram was no longer removed from
      contrast adjustment panel when the associated image was removed from the plot
    • This is now fixed: when an image is removed, the histogram is removed as well and
      the contrast panel is refreshed (which was not the case even before the regression)

Version 2.4.0

In this release, test coverage is 79%.

💥 New features / Enhancements:

  • Contrast adjustment panel:
    • New layout: the vertical toolbar (which was constrained in a small area on the
      right side of the panel) is now a horizontal toolbar at the top of the panel,
      beside the title
    • New "Set range" button: allows the user to set manually the minimum and maximum
      values of the histogram range
  • New Z-axis logarithmic scale feature:
    • Added new tool ZAxisLogTool to toggle the Z-axis logarithmic scale
    • The tool is registered by default in the plot widget, like the ColormapTool
    • When enabled, the active image item is displayed after applying a base-10
      logarithm to its pixel values
  • Curve statistics tool CurveStatsTool is now customizable:
    • When adding the tool: plot_widget.manager.add_tool(CurveStatsTool, labelfuncs=(...))
    • Or after: plot_widget.manager.get_tool(CurveStatsTool).set_labelfuncs(...)
    • The labelfuncs parameter is a list of tuples (label, func) where label is the
      label displayed in the statistics table, and func is a function that takes the
      curve data and returns the corresponding statistic value (see the documentation for
      more details)
  • Image statistics tool ImageStatsTool is now customizable:
    • When adding the tool: plot_widget.manager.add_tool(ImageStatsTool, stats_func=...)
    • Or after: plot_widget.manager.get_tool(ImageStatsTool).set_stats_func(...)
    • The stats_func parameter is a function that takes the image item and selected
      rectangle coordinates, and returns a string with the statistics to display
  • New SIG_AXIS_PARAMETERS_CHANGED signal emitted by BasePlot when the axes parameters
    are changed (e.g. when the axes are inverted, or the scale is changed)
  • New "Reverse X axis" feature:
    • Added new tool ReverseXAxisTool to toggle the X-axis direction
    • The tool is registered by default in the plot widget, like its Y-axis counterpart

🛠️ Bug fixes:

  • Contrast adjustment panel:
    • Fixed histogram update issues when no image was currently selected (even if the
      an image was displayed and was selected before)
    • Histogram range was not updated when either the minimum or maximum value was set
      using the "Minimum value" or "Maximum value" buttons (which have been renamed to
      "Min." and "Max." in this release)
    • Histogram range was not updated when the "Set full range" button was clicked
  • Image parameters: contrast range was not updated when the image Z axis bounds were
    changed using the "Parameters" dialog

🧹 API cleanup:

  • Deprecated AnnotationParam.update_annotation method: use update_item instead
  • Deprecated AxesShapeParam.update_axes method: use update_item instead
  • Deprecated AxesParam.update_axes method: use update_item instead
  • Deprecated ImageAxesParam.update_axes method: use update_item instead
  • Deprecated LabelParam.update_label method: use update_item instead
  • Deprecated MarkerParam.update_marker method: use update_item instead
  • Deprecated RangeShapeParam.update_range method: use update_item instead
  • Deprecated ShapeParam.update_shape method: use update_item instead

v2.4.0

26 Jun 15:23
Compare
Choose a tag to compare

Version 2.4.0

In this release, test coverage is 79%.

💥 New features / Enhancements:

  • Contrast adjustment panel:
    • New layout: the vertical toolbar (which was constrained in a small area on the
      right side of the panel) is now a horizontal toolbar at the top of the panel,
      beside the title
    • New "Set range" button: allows the user to set manually the minimum and maximum
      values of the histogram range
  • New Z-axis logarithmic scale feature:
    • Added new tool ZAxisLogTool to toggle the Z-axis logarithmic scale
    • The tool is registered by default in the plot widget, like the ColormapTool
    • When enabled, the active image item is displayed after applying a base-10
      logarithm to its pixel values
  • Curve statistics tool CurveStatsTool is now customizable:
    • When adding the tool: plot_widget.manager.add_tool(CurveStatsTool, labelfuncs=(...))
    • Or after: plot_widget.manager.get_tool(CurveStatsTool).set_labelfuncs(...)
    • The labelfuncs parameter is a list of tuples (label, func) where label is the
      label displayed in the statistics table, and func is a function that takes the
      curve data and returns the corresponding statistic value (see the documentation for
      more details)
  • Image statistics tool ImageStatsTool is now customizable:
    • When adding the tool: plot_widget.manager.add_tool(ImageStatsTool, stats_func=...)
    • Or after: plot_widget.manager.get_tool(ImageStatsTool).set_stats_func(...)
    • The stats_func parameter is a function that takes the image item and selected
      rectangle coordinates, and returns a string with the statistics to display
  • New SIG_AXIS_PARAMETERS_CHANGED signal emitted by BasePlot when the axes parameters
    are changed (e.g. when the axes are inverted, or the scale is changed)
  • New "Reverse X axis" feature:
    • Added new tool ReverseXAxisTool to toggle the X-axis direction
    • The tool is registered by default in the plot widget, like its Y-axis counterpart

🛠️ Bug fixes:

  • Contrast adjustment panel:
    • Fixed histogram update issues when no image was currently selected (even if the
      an image was displayed and was selected before)
    • Histogram range was not updated when either the minimum or maximum value was set
      using the "Minimum value" or "Maximum value" buttons (which have been renamed to
      "Min." and "Max." in this release)
    • Histogram range was not updated when the "Set full range" button was clicked
  • Image parameters: contrast range was not updated when the image Z axis bounds were
    changed using the "Parameters" dialog

🧹 API cleanup:

  • Deprecated AnnotationParam.update_annotation method: use update_item instead
  • Deprecated AxesShapeParam.update_axes method: use update_item instead
  • Deprecated AxesParam.update_axes method: use update_item instead
  • Deprecated ImageAxesParam.update_axes method: use update_item instead
  • Deprecated LabelParam.update_label method: use update_item instead
  • Deprecated MarkerParam.update_marker method: use update_item instead
  • Deprecated RangeShapeParam.update_range method: use update_item instead
  • Deprecated ShapeParam.update_shape method: use update_item instead

v2.3.5

21 Jun 10:11
Compare
Choose a tag to compare

Version 2.3.5

This release is mainly intended to fix the Windows binary distribution, which was not
supporting NumPy 2.0.

🛠️ Bug fixes:

  • Moved back conftest.py to the tests folder (was in the root folder), so that
    pytest can be executed with proper configuration when running the test suite
    from the installed package

  • Removed benchmarks from automated test suite (not relevant for the end user):
    added plotpy-benchmarks script to run the benchmarks