summaryrefslogtreecommitdiff
path: root/src/silx/gui/data/DataViews.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/silx/gui/data/DataViews.py')
-rw-r--r--src/silx/gui/data/DataViews.py420
1 files changed, 261 insertions, 159 deletions
diff --git a/src/silx/gui/data/DataViews.py b/src/silx/gui/data/DataViews.py
index 0a4569f..ed688b8 100644
--- a/src/silx/gui/data/DataViews.py
+++ b/src/silx/gui/data/DataViews.py
@@ -1,6 +1,6 @@
# /*##########################################################################
#
-# Copyright (c) 2016-2022 European Synchrotron Radiation Facility
+# Copyright (c) 2016-2023 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -24,14 +24,12 @@
"""This module defines a views used by :class:`silx.gui.data.DataViewer`.
"""
-from collections import OrderedDict
import logging
import numbers
import numpy
import os
import silx.io
-from silx.utils import deprecation
from silx.gui import qt, icons
from silx.gui.data.TextFormatter import TextFormatter
from silx.io import nxdata
@@ -129,9 +127,17 @@ class DataInfo(object):
if nxd is not None:
self.hasNXdata = True
# can we plot it?
- is_scalar = nxd.signal_is_0d or nxd.interpretation in ["scalar", "scaler"]
- if not (is_scalar or nxd.is_curve or nxd.is_x_y_value_scatter or
- nxd.is_image or nxd.is_stack):
+ is_scalar = nxd.signal_is_0d or nxd.interpretation in [
+ "scalar",
+ "scaler",
+ ]
+ if not (
+ is_scalar
+ or nxd.is_curve
+ or nxd.is_x_y_value_scatter
+ or nxd.is_image
+ or nxd.is_stack
+ ):
# invalid: cannot be plotted by any widget
self.isInvalidNXdata = True
elif nx_class == "NXdata":
@@ -174,8 +180,7 @@ class DataInfo(object):
self.isComplex = numpy.issubdtype(data.dtype, numpy.complexfloating)
self.isBoolean = numpy.issubdtype(data.dtype, numpy.bool_)
elif self.hasNXdata:
- self.isNumeric = numpy.issubdtype(nxd.signal.dtype,
- numpy.number)
+ self.isNumeric = numpy.issubdtype(nxd.signal.dtype, numpy.number)
self.isComplex = numpy.issubdtype(nxd.signal.dtype, numpy.complexfloating)
self.isBoolean = numpy.issubdtype(nxd.signal.dtype, numpy.bool_)
else:
@@ -235,6 +240,7 @@ class DataViewHooks(object):
"""Called when the widget of the view was created"""
return
+
class DataView(object):
"""Holder for the data view."""
@@ -335,13 +341,11 @@ class DataView(object):
pass
def isWidgetInitialized(self):
- """Returns true if the widget is already initialized.
- """
+ """Returns true if the widget is already initialized."""
return self.__widget is not None
def select(self):
- """Called when the view is selected to display the data.
- """
+ """Called when the view is selected to display the data."""
return
def getWidget(self):
@@ -384,20 +388,25 @@ class DataView(object):
:rtype: str
"""
if indices is None:
- return ''
+ return ""
def formatSlice(slice_):
start, stop, step = slice_.start, slice_.stop, slice_.step
- string = ('' if start is None else str(start)) + ':'
+ string = ("" if start is None else str(start)) + ":"
if stop is not None:
string += str(stop)
if step not in (None, 1):
- string += ':' + step
+ string += ":" + step
return string
- return '[' + ', '.join(
- formatSlice(index) if isinstance(index, slice) else str(index)
- for index in indices) + ']'
+ return (
+ "["
+ + ", ".join(
+ formatSlice(index) if isinstance(index, slice) else str(index)
+ for index in indices
+ )
+ + "]"
+ )
def titleForSelection(self, selection):
"""Build title from given selection information.
@@ -413,9 +422,9 @@ class DataView(object):
slicing = self.__formatSlices(selection.slice)
except Exception:
_logger.debug("Error while formatting slices", exc_info=True)
- slicing = '[sliced]'
+ slicing = "[sliced]"
- permuted = '(permuted)' if selection.permutation is not None else ''
+ permuted = "(permuted)" if selection.permutation is not None else ""
try:
title = self.TITLE_PATTERN.format(
@@ -423,7 +432,8 @@ class DataView(object):
filename=filename,
datapath=selection.datapath,
slicing=slicing,
- permuted=permuted)
+ permuted=permuted,
+ )
except Exception:
_logger.debug("Error while formatting title", exc_info=True)
title = selection.datapath + slicing
@@ -530,10 +540,6 @@ class _CompositeDataView(DataView):
"""
raise NotImplementedError()
- @deprecation.deprecated(replacement="getReachableViews", since_version="0.10")
- def availableViews(self):
- return self.getViews()
-
def isSupportedData(self, data, info):
"""If true, the composite view allow sub views to access to this data.
Else this this data is considered as not supported by any of sub views
@@ -556,7 +562,7 @@ class SelectOneDataView(_CompositeDataView):
:param qt.QWidget parent: Parent of the hold widget
"""
super(SelectOneDataView, self).__init__(parent, modeId, icon, label)
- self.__views = OrderedDict()
+ self.__views = {}
self.__currentView = None
def setHooks(self, hooks):
@@ -711,9 +717,10 @@ class SelectOneDataView(_CompositeDataView):
return False
# replace oldView with new view in dict
- self.__views = OrderedDict(
- (newView, None) if view is oldView else (view, idx) for
- view, idx in self.__views.items())
+ self.__views = dict(
+ (newView, None) if view is oldView else (view, idx)
+ for view, idx in self.__views.items()
+ )
return True
@@ -733,7 +740,9 @@ class SelectManyDataView(_CompositeDataView):
:param qt.QWidget parent: Parent of the hold widget
"""
- super(SelectManyDataView, self).__init__(parent, modeId=None, icon=None, label=None)
+ super(SelectManyDataView, self).__init__(
+ parent, modeId=None, icon=None, label=None
+ )
if views is None:
views = []
self.__views = views
@@ -776,7 +785,11 @@ class SelectManyDataView(_CompositeDataView):
"""
if not self.isSupportedData(data, info):
return []
- views = [v for v in self.__views if v.getCachedDataPriority(data, info) != DataView.UNSUPPORTED]
+ views = [
+ v
+ for v in self.__views
+ if v.getCachedDataPriority(data, info) != DataView.UNSUPPORTED
+ ]
return views
def customAxisNames(self):
@@ -870,11 +883,13 @@ class _Plot1dView(DataView):
parent=parent,
modeId=PLOT1D_MODE,
label="Curve",
- icon=icons.getQIcon("view-1d"))
+ icon=icons.getQIcon("view-1d"),
+ )
self.__resetZoomNextTime = True
def createWidget(self, parent):
from silx.gui import plot
+
widget = plot.Plot1D(parent=parent)
widget.setGraphGrid(True)
return widget
@@ -892,10 +907,12 @@ class _Plot1dView(DataView):
data = self.normalizeData(data)
plotWidget = self.getWidget()
legend = "data"
- plotWidget.addCurve(legend=legend,
- x=range(len(data)),
- y=data,
- resetzoom=self.__resetZoomNextTime)
+ plotWidget.addCurve(
+ legend=legend,
+ x=range(len(data)),
+ y=data,
+ resetzoom=self.__resetZoomNextTime,
+ )
plotWidget.setActiveCurve(legend)
self.__resetZoomNextTime = True
@@ -928,7 +945,8 @@ class _Plot2dRecordView(DataView):
parent=parent,
modeId=RECORD_PLOT_MODE,
label="Curve",
- icon=icons.getQIcon("view-1d"))
+ icon=icons.getQIcon("view-1d"),
+ )
self.__resetZoomNextTime = True
self._data = None
self._xAxisDropDown = None
@@ -937,6 +955,7 @@ class _Plot2dRecordView(DataView):
def createWidget(self, parent):
from ._RecordPlot import RecordPlot
+
return RecordPlot(parent=parent)
def clear(self):
@@ -952,7 +971,9 @@ class _Plot2dRecordView(DataView):
self._data = self.normalizeData(data)
all_fields = sorted(self._data.dtype.fields.items(), key=lambda e: e[1][1])
- numeric_fields = [f[0] for f in all_fields if numpy.issubdtype(f[1][0], numpy.number)]
+ numeric_fields = [
+ f[0] for f in all_fields if numpy.issubdtype(f[1][0], numpy.number)
+ ]
if numeric_fields == self.__fields: # Reuse previously selected fields
fieldNameX = self.getWidget().getXAxisFieldName()
fieldNameY = self.getWidget().getYAxisFieldName()
@@ -974,8 +995,12 @@ class _Plot2dRecordView(DataView):
self._plotData(fieldNameX, fieldNameY)
if not self._xAxisDropDown:
- self._xAxisDropDown = self.getWidget().getAxesSelectionToolBar().getXAxisDropDown()
- self._yAxisDropDown = self.getWidget().getAxesSelectionToolBar().getYAxisDropDown()
+ self._xAxisDropDown = (
+ self.getWidget().getAxesSelectionToolBar().getXAxisDropDown()
+ )
+ self._yAxisDropDown = (
+ self.getWidget().getAxesSelectionToolBar().getYAxisDropDown()
+ )
self._xAxisDropDown.activated.connect(self._onAxesSelectionChaned)
self._yAxisDropDown.activated.connect(self._onAxesSelectionChaned)
@@ -993,10 +1018,9 @@ class _Plot2dRecordView(DataView):
xdata = numpy.arange(len(ydata))
else:
xdata = self._data[fieldNameX]
- self.getWidget().addCurve(legend="data",
- x=xdata,
- y=ydata,
- resetzoom=self.__resetZoomNextTime)
+ self.getWidget().addCurve(
+ legend="data", x=xdata, y=ydata, resetzoom=self.__resetZoomNextTime
+ )
self.getWidget().setXAxisFieldName(fieldNameX)
self.getWidget().setYAxisFieldName(fieldNameY)
self.__resetZoomNextTime = True
@@ -1031,18 +1055,20 @@ class _Plot2dView(DataView):
parent=parent,
modeId=PLOT2D_MODE,
label="Image",
- icon=icons.getQIcon("view-2d"))
+ icon=icons.getQIcon("view-2d"),
+ )
self.__resetZoomNextTime = True
def createWidget(self, parent):
from silx.gui import plot
+
widget = plot.Plot2D(parent=parent)
widget.setDefaultColormap(self.defaultColormap())
- widget.getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getColormapAction().setColormapDialog(self.defaultColorDialog())
widget.getIntensityHistogramAction().setVisible(True)
widget.setKeepDataAspectRatio(True)
- widget.getXAxis().setLabel('X')
- widget.getYAxis().setLabel('Y')
+ widget.getXAxis().setLabel("X")
+ widget.getYAxis().setLabel("Y")
maskToolsWidget = widget.getMaskToolsDockWidget().widget()
maskToolsWidget.setItemMaskUpdated(True)
return widget
@@ -1058,9 +1084,9 @@ class _Plot2dView(DataView):
def setData(self, data):
data = self.normalizeData(data)
- self.getWidget().addImage(legend="data",
- data=data,
- resetzoom=self.__resetZoomNextTime)
+ self.getWidget().addImage(
+ legend="data", data=data, resetzoom=self.__resetZoomNextTime
+ )
self.__resetZoomNextTime = False
def setDataSelection(self, selection):
@@ -1072,9 +1098,7 @@ class _Plot2dView(DataView):
def getDataPriority(self, data, info):
if info.size <= 0:
return DataView.UNSUPPORTED
- if (data is None or
- not info.isArray or
- not (info.isNumeric or info.isBoolean)):
+ if data is None or not info.isArray or not (info.isNumeric or info.isBoolean):
return DataView.UNSUPPORTED
if info.dim < 2:
return DataView.UNSUPPORTED
@@ -1094,7 +1118,8 @@ class _Plot3dView(DataView):
parent=parent,
modeId=PLOT3D_MODE,
label="Cube",
- icon=icons.getQIcon("view-3d"))
+ icon=icons.getQIcon("view-3d"),
+ )
try:
from ._VolumeWindow import VolumeWindow # noqa
except ImportError:
@@ -1145,20 +1170,32 @@ class _ComplexImageView(DataView):
parent=parent,
modeId=COMPLEX_IMAGE_MODE,
label="Complex Image",
- icon=icons.getQIcon("view-2d"))
+ icon=icons.getQIcon("view-2d"),
+ )
def createWidget(self, parent):
from silx.gui.plot.ComplexImageView import ComplexImageView
+
widget = ComplexImageView(parent=parent)
- widget.setColormap(self.defaultColormap(), mode=ComplexImageView.ComplexMode.ABSOLUTE)
- widget.setColormap(self.defaultColormap(), mode=ComplexImageView.ComplexMode.SQUARE_AMPLITUDE)
- widget.setColormap(self.defaultColormap(), mode=ComplexImageView.ComplexMode.REAL)
- widget.setColormap(self.defaultColormap(), mode=ComplexImageView.ComplexMode.IMAGINARY)
- widget.getPlot().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.setColormap(
+ self.defaultColormap(), mode=ComplexImageView.ComplexMode.ABSOLUTE
+ )
+ widget.setColormap(
+ self.defaultColormap(), mode=ComplexImageView.ComplexMode.SQUARE_AMPLITUDE
+ )
+ widget.setColormap(
+ self.defaultColormap(), mode=ComplexImageView.ComplexMode.REAL
+ )
+ widget.setColormap(
+ self.defaultColormap(), mode=ComplexImageView.ComplexMode.IMAGINARY
+ )
+ widget.getPlot().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
widget.getPlot().getIntensityHistogramAction().setVisible(True)
widget.getPlot().setKeepDataAspectRatio(True)
- widget.getXAxis().setLabel('X')
- widget.getYAxis().setLabel('Y')
+ widget.getXAxis().setLabel("X")
+ widget.getYAxis().setLabel("Y")
maskToolsWidget = widget.getPlot().getMaskToolsDockWidget().widget()
maskToolsWidget.setItemMaskUpdated(True)
return widget
@@ -1175,8 +1212,7 @@ class _ComplexImageView(DataView):
self.getWidget().setData(data)
def setDataSelection(self, selection):
- self.getWidget().getPlot().setGraphTitle(
- self.titleForSelection(selection))
+ self.getWidget().getPlot().setGraphTitle(self.titleForSelection(selection))
def axesNames(self, data, info):
return ["y", "x"]
@@ -1204,6 +1240,7 @@ class _ArrayView(DataView):
def createWidget(self, parent):
from silx.gui.data.ArrayTableWidget import ArrayTableWidget
+
widget = ArrayTableWidget(parent)
widget.displayAxesSelector(False)
return widget
@@ -1238,7 +1275,8 @@ class _StackView(DataView):
parent=parent,
modeId=STACK_MODE,
label="Image stack",
- icon=icons.getQIcon("view-2d-stack"))
+ icon=icons.getQIcon("view-2d-stack"),
+ )
self.__resetZoomNextTime = True
def customAxisNames(self):
@@ -1252,9 +1290,12 @@ class _StackView(DataView):
def createWidget(self, parent):
from silx.gui import plot
+
widget = plot.StackView(parent=parent)
widget.setColormap(self.defaultColormap())
- widget.getPlotWidget().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getPlotWidget().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
widget.setKeepDataAspectRatio(True)
widget.setLabels(self.axesNames(None, None))
# hide default option panel
@@ -1281,8 +1322,7 @@ class _StackView(DataView):
def setDataSelection(self, selection):
title = self.titleForSelection(selection)
- self.getWidget().setTitleCallback(
- lambda idx: "%s z=%d" % (title, idx))
+ self.getWidget().setTitleCallback(lambda idx: "%s z=%d" % (title, idx))
def axesNames(self, data, info):
return ["depth", "y", "x"]
@@ -1350,6 +1390,7 @@ class _RecordView(DataView):
def createWidget(self, parent):
from .RecordTableView import RecordTableView
+
widget = RecordTableView(parent)
widget.setWordWrap(False)
return widget
@@ -1394,6 +1435,7 @@ class _HexaView(DataView):
def createWidget(self, parent):
from .HexaTableView import HexaTableView
+
widget = HexaTableView(parent)
return widget
@@ -1424,10 +1466,12 @@ class _Hdf5View(DataView):
parent=parent,
modeId=HDF5_MODE,
label="HDF5",
- icon=icons.getQIcon("view-hdf5"))
+ icon=icons.getQIcon("view-hdf5"),
+ )
def createWidget(self, parent):
from .Hdf5TableView import Hdf5TableView
+
widget = Hdf5TableView(parent)
return widget
@@ -1459,10 +1503,8 @@ class _RawView(CompositeDataView):
def __init__(self, parent):
super(_RawView, self).__init__(
- parent=parent,
- modeId=RAW_MODE,
- label="Raw",
- icon=icons.getQIcon("view-raw"))
+ parent=parent, modeId=RAW_MODE, label="Raw", icon=icons.getQIcon("view-raw")
+ )
self.addView(_HexaView(parent))
self.addView(_ScalarView(parent))
self.addView(_ArrayView(parent))
@@ -1480,7 +1522,8 @@ class _ImageView(CompositeDataView):
parent=parent,
modeId=IMAGE_MODE,
label="Image",
- icon=icons.getQIcon("view-2d"))
+ icon=icons.getQIcon("view-2d"),
+ )
self.addView(_ComplexImageView(parent))
self.addView(_Plot2dView(parent))
@@ -1489,9 +1532,9 @@ class _InvalidNXdataView(DataView):
"""DataView showing a simple label with an error message
to inform that a group with @NX_class=NXdata cannot be
interpreted by any NXDataview."""
+
def __init__(self, parent):
- DataView.__init__(self, parent,
- modeId=NXDATA_INVALID_MODE)
+ DataView.__init__(self, parent, modeId=NXDATA_INVALID_MODE)
self._msg = ""
def createWidget(self, parent):
@@ -1532,8 +1575,10 @@ class _InvalidNXdataView(DataView):
self._msg += "@default attribute, "
if default_nxdata_name not in default_entry:
self._msg += " but no corresponding NXdata group exists."
- elif get_attr_as_unicode(default_entry[default_nxdata_name],
- "NX_class") != "NXdata":
+ elif (
+ get_attr_as_unicode(default_entry[default_nxdata_name], "NX_class")
+ != "NXdata"
+ ):
self._msg += " but the corresponding item is not a "
self._msg += "NXdata group."
else:
@@ -1544,7 +1589,10 @@ class _InvalidNXdataView(DataView):
default_nxdata_name = data.attrs["default"]
if default_nxdata_name not in data:
self._msg += " but no corresponding NXdata group exists."
- elif get_attr_as_unicode(data[default_nxdata_name], "NX_class") != "NXdata":
+ elif (
+ get_attr_as_unicode(data[default_nxdata_name], "NX_class")
+ != "NXdata"
+ ):
self._msg += " but the corresponding item is not a "
self._msg += "NXdata group."
else:
@@ -1564,18 +1612,20 @@ class _NXdataBaseDataView(DataView):
cmap_norm = nxdata.plot_style.signal_scale_type
if cmap_norm is not None:
self.defaultColormap().setNormalization(
- 'log' if cmap_norm == 'log' else 'linear')
+ "log" if cmap_norm == "log" else "linear"
+ )
class _NXdataScalarView(_NXdataBaseDataView):
"""DataView using a table view for displaying NXdata scalars:
0-D signal or n-D signal with *@interpretation=scalar*"""
+
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_SCALAR_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_SCALAR_MODE)
def createWidget(self, parent):
from silx.gui.data.ArrayTableWidget import ArrayTableWidget
+
widget = ArrayTableWidget(parent)
# widget.displayAxesSelector(False)
return widget
@@ -1584,16 +1634,14 @@ class _NXdataScalarView(_NXdataBaseDataView):
return ["col", "row"]
def clear(self):
- self.getWidget().setArrayData(numpy.array([[]]),
- labels=True)
+ self.getWidget().setArrayData(numpy.array([[]]), labels=True)
def setData(self, data):
data = self.normalizeData(data)
# data could be a NXdata or an NXentry
nxd = nxdata.get_default(data, validate=False)
signal = nxd.signal
- self.getWidget().setArrayData(signal,
- labels=True)
+ self.getWidget().setArrayData(signal, labels=True)
def getDataPriority(self, data, info):
data = self.normalizeData(data)
@@ -1612,12 +1660,13 @@ class _NXdataCurveView(_NXdataBaseDataView):
It also handles basic scatter plots:
a 1-D signal with one axis whose values are not monotonically increasing.
"""
+
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_CURVE_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_CURVE_MODE)
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayCurvePlot
+
widget = ArrayCurvePlot(parent)
return widget
@@ -1637,24 +1686,17 @@ class _NXdataCurveView(_NXdataBaseDataView):
else:
x_errors = None
- # this fix is necessary until the next release of PyMca (5.2.3 or 5.3.0)
- # see https://github.com/vasole/pymca/issues/144 and https://github.com/vasole/pymca/pull/145
- if not hasattr(self.getWidget(), "setCurvesData") and \
- hasattr(self.getWidget(), "setCurveData"):
- _logger.warning("Using deprecated ArrayCurvePlot API, "
- "without support of auxiliary signals")
- self.getWidget().setCurveData(nxd.signal, nxd.axes[-1],
- yerror=nxd.errors, xerror=x_errors,
- ylabel=nxd.signal_name, xlabel=nxd.axes_names[-1],
- title=nxd.title or nxd.signal_name)
- return
-
- self.getWidget().setCurvesData([nxd.signal] + nxd.auxiliary_signals, nxd.axes[-1],
- yerror=nxd.errors, xerror=x_errors,
- ylabels=signals_names, xlabel=nxd.axes_names[-1],
- title=nxd.title or signals_names[0],
- xscale=nxd.plot_style.axes_scale_types[-1],
- yscale=nxd.plot_style.signal_scale_type)
+ self.getWidget().setCurvesData(
+ [nxd.signal] + nxd.auxiliary_signals,
+ nxd.axes[-1],
+ yerror=nxd.errors,
+ xerror=x_errors,
+ ylabels=signals_names,
+ xlabel=nxd.axes_names[-1],
+ title=nxd.title or signals_names[0],
+ xscale=nxd.plot_style.axes_scale_types[-1],
+ yscale=nxd.plot_style.signal_scale_type,
+ )
def getDataPriority(self, data, info):
data = self.normalizeData(data)
@@ -1667,16 +1709,18 @@ class _NXdataCurveView(_NXdataBaseDataView):
class _NXdataXYVScatterView(_NXdataBaseDataView):
"""DataView using a Plot1D for displaying NXdata 3D scatters as
a scatter of coloured points (1-D signal with 2 axes)"""
+
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_XYVSCATTER_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_XYVSCATTER_MODE)
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import XYVScatterPlot
+
widget = XYVScatterPlot(parent)
widget.getScatterView().setColormap(self.defaultColormap())
- widget.getScatterView().getScatterToolBar().getColormapAction().setColorDialog(
- self.defaultColorDialog())
+ widget.getScatterView().getScatterToolBar().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def axesNames(self, data, info):
@@ -1709,13 +1753,19 @@ class _NXdataXYVScatterView(_NXdataBaseDataView):
self._updateColormap(nxd)
- self.getWidget().setScattersData(y_axis, x_axis, values=[nxd.signal] + nxd.auxiliary_signals,
- yerror=y_errors, xerror=x_errors,
- ylabel=y_label, xlabel=x_label,
- title=nxd.title,
- scatter_titles=[nxd.signal_name] + nxd.auxiliary_signals_names,
- xscale=nxd.plot_style.axes_scale_types[-2],
- yscale=nxd.plot_style.axes_scale_types[-1])
+ self.getWidget().setScattersData(
+ y_axis,
+ x_axis,
+ values=[nxd.signal] + nxd.auxiliary_signals,
+ yerror=y_errors,
+ xerror=x_errors,
+ ylabel=y_label,
+ xlabel=x_label,
+ title=nxd.title,
+ scatter_titles=[nxd.signal_name] + nxd.auxiliary_signals_names,
+ xscale=nxd.plot_style.axes_scale_types[-2],
+ yscale=nxd.plot_style.axes_scale_types[-1],
+ )
def getDataPriority(self, data, info):
data = self.normalizeData(data)
@@ -1730,15 +1780,18 @@ class _NXdataXYVScatterView(_NXdataBaseDataView):
class _NXdataImageView(_NXdataBaseDataView):
"""DataView using a Plot2D for displaying NXdata images:
2-D signal or n-D signals with *@interpretation=image*."""
+
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_IMAGE_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_IMAGE_MODE)
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayImagePlot
+
widget = ArrayImagePlot(parent)
widget.getPlot().setDefaultColormap(self.defaultColormap())
- widget.getPlot().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getPlot().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def axesNames(self, data, info):
@@ -1760,16 +1813,20 @@ class _NXdataImageView(_NXdataBaseDataView):
y_axis, x_axis = nxd.axes[img_slicing]
y_label, x_label = nxd.axes_names[img_slicing]
y_scale, x_scale = nxd.plot_style.axes_scale_types[img_slicing]
- x_units = get_attr_as_unicode(x_axis, 'units') if x_axis else None
- y_units = get_attr_as_unicode(y_axis, 'units') if y_axis else None
+ x_units = get_attr_as_unicode(x_axis, "units") if x_axis else None
+ y_units = get_attr_as_unicode(y_axis, "units") if y_axis else None
self.getWidget().setImageData(
[nxd.signal] + nxd.auxiliary_signals,
- x_axis=x_axis, y_axis=y_axis,
+ x_axis=x_axis,
+ y_axis=y_axis,
signals_names=[nxd.signal_name] + nxd.auxiliary_signals_names,
- xlabel=x_label, ylabel=y_label,
- title=nxd.title, isRgba=isRgba,
- xscale=x_scale, yscale=y_scale,
+ xlabel=x_label,
+ ylabel=y_label,
+ title=nxd.title,
+ isRgba=isRgba,
+ xscale=x_scale,
+ yscale=y_scale,
keep_ratio=(x_units == y_units),
)
@@ -1786,14 +1843,17 @@ class _NXdataImageView(_NXdataBaseDataView):
class _NXdataComplexImageView(_NXdataBaseDataView):
"""DataView using a ComplexImageView for displaying NXdata complex images:
2-D signal or n-D signals with *@interpretation=image*."""
+
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_IMAGE_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_IMAGE_MODE)
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayComplexImagePlot
+
widget = ArrayComplexImagePlot(parent, colormap=self.defaultColormap())
- widget.getPlot().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getPlot().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def clear(self):
@@ -1809,14 +1869,16 @@ class _NXdataComplexImageView(_NXdataBaseDataView):
img_slicing = slice(-2, None)
y_axis, x_axis = nxd.axes[img_slicing]
y_label, x_label = nxd.axes_names[img_slicing]
- x_units = get_attr_as_unicode(x_axis, 'units') if x_axis else None
- y_units = get_attr_as_unicode(y_axis, 'units') if y_axis else None
+ x_units = get_attr_as_unicode(x_axis, "units") if x_axis else None
+ y_units = get_attr_as_unicode(y_axis, "units") if y_axis else None
self.getWidget().setImageData(
[nxd.signal] + nxd.auxiliary_signals,
- x_axis=x_axis, y_axis=y_axis,
+ x_axis=x_axis,
+ y_axis=y_axis,
signals_names=[nxd.signal_name] + nxd.auxiliary_signals_names,
- xlabel=x_label, ylabel=y_label,
+ xlabel=x_label,
+ ylabel=y_label,
title=nxd.title,
keep_ratio=(x_units == y_units),
)
@@ -1838,14 +1900,16 @@ class _NXdataComplexImageView(_NXdataBaseDataView):
class _NXdataStackView(_NXdataBaseDataView):
def __init__(self, parent):
- _NXdataBaseDataView.__init__(
- self, parent, modeId=NXDATA_STACK_MODE)
+ _NXdataBaseDataView.__init__(self, parent, modeId=NXDATA_STACK_MODE)
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayStackPlot
+
widget = ArrayStackPlot(parent)
widget.getStackView().setColormap(self.defaultColormap())
- widget.getStackView().getPlotWidget().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getStackView().getPlotWidget().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def axesNames(self, data, info):
@@ -1867,10 +1931,16 @@ class _NXdataStackView(_NXdataBaseDataView):
widget = self.getWidget()
widget.setStackData(
- nxd.signal, x_axis=x_axis, y_axis=y_axis, z_axis=z_axis,
- signal_name=signal_name,
- xlabel=x_label, ylabel=y_label, zlabel=z_label,
- title=title)
+ nxd.signal,
+ x_axis=x_axis,
+ y_axis=y_axis,
+ z_axis=z_axis,
+ signal_name=signal_name,
+ xlabel=x_label,
+ ylabel=y_label,
+ zlabel=z_label,
+ title=title,
+ )
# Override the colormap, while setStack overwrite it
widget.getStackView().setColormap(self.defaultColormap())
@@ -1886,10 +1956,12 @@ class _NXdataStackView(_NXdataBaseDataView):
class _NXdataVolumeView(_NXdataBaseDataView):
def __init__(self, parent):
_NXdataBaseDataView.__init__(
- self, parent,
+ self,
+ parent,
label="NXdata (3D)",
icon=icons.getQIcon("view-nexus"),
- modeId=NXDATA_VOLUME_MODE)
+ modeId=NXDATA_VOLUME_MODE,
+ )
try:
import silx.gui.plot3d # noqa
except ImportError:
@@ -1904,6 +1976,7 @@ class _NXdataVolumeView(_NXdataBaseDataView):
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayVolumePlot
+
widget = ArrayVolumePlot(parent)
return widget
@@ -1924,10 +1997,16 @@ class _NXdataVolumeView(_NXdataBaseDataView):
widget = self.getWidget()
widget.setData(
- nxd.signal, x_axis=x_axis, y_axis=y_axis, z_axis=z_axis,
+ nxd.signal,
+ x_axis=x_axis,
+ y_axis=y_axis,
+ z_axis=z_axis,
signal_name=signal_name,
- xlabel=x_label, ylabel=y_label, zlabel=z_label,
- title=title)
+ xlabel=x_label,
+ ylabel=y_label,
+ zlabel=z_label,
+ title=title,
+ )
def getDataPriority(self, data, info):
data = self.normalizeData(data)
@@ -1941,16 +2020,21 @@ class _NXdataVolumeView(_NXdataBaseDataView):
class _NXdataVolumeAsStackView(_NXdataBaseDataView):
def __init__(self, parent):
_NXdataBaseDataView.__init__(
- self, parent,
+ self,
+ parent,
label="NXdata (2D)",
icon=icons.getQIcon("view-nexus"),
- modeId=NXDATA_VOLUME_AS_STACK_MODE)
+ modeId=NXDATA_VOLUME_AS_STACK_MODE,
+ )
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayStackPlot
+
widget = ArrayStackPlot(parent)
widget.getStackView().setColormap(self.defaultColormap())
- widget.getStackView().getPlotWidget().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getStackView().getPlotWidget().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def axesNames(self, data, info):
@@ -1972,10 +2056,16 @@ class _NXdataVolumeAsStackView(_NXdataBaseDataView):
widget = self.getWidget()
widget.setStackData(
- nxd.signal, x_axis=x_axis, y_axis=y_axis, z_axis=z_axis,
- signal_name=signal_name,
- xlabel=x_label, ylabel=y_label, zlabel=z_label,
- title=title)
+ nxd.signal,
+ x_axis=x_axis,
+ y_axis=y_axis,
+ z_axis=z_axis,
+ signal_name=signal_name,
+ xlabel=x_label,
+ ylabel=y_label,
+ zlabel=z_label,
+ title=title,
+ )
# Override the colormap, while setStack overwrite it
widget.getStackView().setColormap(self.defaultColormap())
@@ -1989,19 +2079,25 @@ class _NXdataVolumeAsStackView(_NXdataBaseDataView):
return DataView.UNSUPPORTED
+
class _NXdataComplexVolumeAsStackView(_NXdataBaseDataView):
def __init__(self, parent):
_NXdataBaseDataView.__init__(
- self, parent,
+ self,
+ parent,
label="NXdata (2D)",
icon=icons.getQIcon("view-nexus"),
- modeId=NXDATA_VOLUME_AS_STACK_MODE)
+ modeId=NXDATA_VOLUME_AS_STACK_MODE,
+ )
self._is_complex_data = False
def createWidget(self, parent):
from silx.gui.data.NXdataWidgets import ArrayComplexImagePlot
+
widget = ArrayComplexImagePlot(parent, colormap=self.defaultColormap())
- widget.getPlot().getColormapAction().setColorDialog(self.defaultColorDialog())
+ widget.getPlot().getColormapAction().setColormapDialog(
+ self.defaultColorDialog()
+ )
return widget
def axesNames(self, data, info):
@@ -2023,9 +2119,13 @@ class _NXdataComplexVolumeAsStackView(_NXdataBaseDataView):
self.getWidget().setImageData(
[nxd.signal] + nxd.auxiliary_signals,
- x_axis=x_axis, y_axis=y_axis,
+ x_axis=x_axis,
+ y_axis=y_axis,
signals_names=[nxd.signal_name] + nxd.auxiliary_signals_names,
- xlabel=x_label, ylabel=y_label, title=nxd.title)
+ xlabel=x_label,
+ ylabel=y_label,
+ title=nxd.title,
+ )
def getDataPriority(self, data, info):
data = self.normalizeData(data)
@@ -2041,12 +2141,14 @@ class _NXdataComplexVolumeAsStackView(_NXdataBaseDataView):
class _NXdataView(CompositeDataView):
"""Composite view displaying NXdata groups using the most adequate
widget depending on the dimensionality."""
+
def __init__(self, parent):
super(_NXdataView, self).__init__(
parent=parent,
label="NXdata",
modeId=NXDATA_MODE,
- icon=icons.getQIcon("view-nexus"))
+ icon=icons.getQIcon("view-nexus"),
+ )
self.addView(_InvalidNXdataView(parent))
self.addView(_NXdataScalarView(parent))