Skip to content

Releases: PlotPyStack/PlotPy

v2.7.4

26 Apr 07:29
Compare
Choose a tag to compare

In this release, test coverage is 80%.

🛠️ Bug fixes:

  • Issue #42 - Image profiles: when moving/resizing image, profile plots are not refreshed
  • Issue #41 - Average profile visualization: empty profile is displayed when the target rectangular area is outside the image area

v2.7.3

05 Apr 10:45
Compare
Choose a tag to compare

In this release, test coverage is 80%.

🛠️ Bug fixes:

  • Issue #40 - Z-axis logarithmic scale (ZAxisLogTool tool) 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 using make.xyimage) as this item supports arbitrary X and Y pixel coordinates
  • Issue #34 - ValueError when trying to plot 2D histogram items with PyQt6

Other changes:

  • Replace deprecated icon files with new SVG icons for selection tools

v2.7.2

14 Feb 14:35
Compare
Choose a tag to compare

Version 2.7.2

🛠️ Bug fixes:

  • Issue #32 - Plot item list panel's parameters dialog box is empty for non-selectable items
  • Issue #30 - handle_final_shape_cb argument doesn't work on MultilineTool, PolygonTool, AnnotatedPolygonTool

v2.7.1

22 Jan 14:02
Compare
Choose a tag to compare

Version 2.7.1

🛠️ Bug fixes:

  • Fixed update canvasRect type to QRectF for intersection checks in CircleSVGShape, following this bug fix in PythonQwt V0.14.4
  • Fixed regression with respect to guiqwt regarding plot items instantiation:
    • guiqwt was allowing to instantiate plot items without needing to create a QApplication instance (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 a QApplication instance
    • This has been fixed by removing the QIcon instantiation from the plot items constructors (call to QwtPlotItem.setIcon method). Note that -in the meantime- QwtPlotItem.setIcon and QwtPlotItem.icon methods have also been removed in PythonQwt V0.14.3. Code relying on this feature should thus be updated to use the new get_icon_name method instead, i.e. get_icon(item.get_icon_name()) instead of item.icon().
  • Issue #26 - Item list panel should not allow to select a non-selectable item

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