diff options
Diffstat (limited to 'silx/sx/_plot3d.py')
-rw-r--r-- | silx/sx/_plot3d.py | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/silx/sx/_plot3d.py b/silx/sx/_plot3d.py deleted file mode 100644 index 444d9e0..0000000 --- a/silx/sx/_plot3d.py +++ /dev/null @@ -1,250 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2018-2019 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 -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -"""This module adds convenient functions to use plot3d widgets from the console. -""" - -__authors__ = ["T. Vincent"] -__license__ = "MIT" -__date__ = "24/04/2018" - - -try: - from collections import abc -except ImportError: # Python2 support - import collections as abc -import logging -import numpy - -from ..gui import qt -from ..gui.plot3d.SceneWindow import SceneWindow -from ..gui.plot3d.ScalarFieldView import ScalarFieldView -from ..gui.plot3d import SFViewParamTree -from ..gui.colors import Colormap -from ..gui.colors import rgba - - -_logger = logging.getLogger(__name__) - - -def contour3d(scalars, - contours=1, - copy=True, - color=None, - colormap='viridis', - vmin=None, - vmax=None, - opacity=1.): - """ - Plot isosurfaces of a 3D scalar field in a :class:`~silx.gui.plot3d.ScalarFieldView.ScalarFieldView` widget. - - How to use: - - >>> from silx import sx - - Provided data, a 3D scalar field as a numpy array of float32: - - >>> plot3d_window = sx.contour3d(data) - - Alternatively you can provide the level of the isosurfaces: - - >>> plot3d_window = sx.contour3d(data, contours=[0.2, 0.4]) - - This function provides a subset of `mayavi.mlab.contour3d - <http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#contour3d>`_ - arguments. - - :param scalars: The 3D scalar field to visualize - :type scalars: numpy.ndarray of float32 with 3 dimensions - :param contours: - Either the number of isosurfaces to draw (as an int) or - the isosurface level (as a float) or a list of isosurface levels - (as a list of float) - :type contours: Union[int, float, List[float]] - :param bool copy: - True (default) to make a copy of scalars. - False to avoid this copy (do not modify provided data afterwards) - :param color: - Color.s to use for isosurfaces. - Either a single color or a list of colors (one for each isosurface). - A color can be defined by its name (as a str) or - as RGB(A) as float or uint8. - :param str colormap: - If color is not provided, this colormap is used - for coloring isosurfaces. - :param vmin: Minimum value of the colormap - :type vmin: Union[float, None] - :param vmax: Maximum value of the colormap - :type vmax: Union[float, None] - :param float opacity: - Transparency of the isosurfaces as a float in [0., 1.] - :return: The widget used to visualize the data - :rtype: ~silx.gui.plot3d.ScalarFieldView.ScalarFieldView - """ - # Prepare isolevel values - if isinstance(contours, int): - # Compute contours number of isovalues - mean = numpy.mean(scalars) - std = numpy.std(scalars) - - start = mean - std * ((contours - 1) // 2) - contours = [start + std * index for index in range(contours)] - - elif isinstance(contours, float): - contours = [contours] - - assert isinstance(contours, abc.Iterable) - - # Prepare colors - if color is not None: - if isinstance(color, str) or isinstance(color[0], (int, float)): - # Single color provided, use it for all isosurfaces - colors = [rgba(color)] * len(contours) - else: - # As many colors as contours - colors = [rgba(c) for c in color] - - # convert colors from float to uint8 - colors = (numpy.array(colors) * 255).astype(numpy.uint8) - - else: # Use colormap - colormap = Colormap(name=colormap, vmin=vmin, vmax=vmax) - colors = colormap.applyToData(contours) - - assert len(colors) == len(contours) - - # Prepare and apply opacity - assert isinstance(opacity, float) - opacity = min(max(0., opacity), 1.) # Clip opacity - colors[:, -1] = (colors[:, -1] * opacity).astype(numpy.uint8) - - # Prepare widget - scalarField = ScalarFieldView() - - scalarField.setBackgroundColor((0.9, 0.9, 0.9)) - scalarField.setForegroundColor((0.1, 0.1, 0.1)) - scalarField.setData(scalars, copy=copy) - - # Create a parameter tree for the scalar field view - treeView = SFViewParamTree.TreeView(scalarField) - treeView.setSfView(scalarField) # Attach the parameter tree to the view - - # Add the parameter tree to the main window in a dock widget - dock = qt.QDockWidget(scalarField) - dock.setWindowTitle('Parameters') - dock.setWidget(treeView) - scalarField.addDockWidget(qt.Qt.RightDockWidgetArea, dock) - - for level, color in zip(contours, colors): - scalarField.addIsosurface(level, color) - - scalarField.show() - - return scalarField - - -_POINTS3D_MODE_CONVERSION = { - '2dcircle': 'o', - '2dcross': 'x', - '2ddash': '_', - '2ddiamond': 'd', - '2dsquare': 's', - 'point': ',' -} - - -def points3d(x, y, z=None, - values=0., - copy=True, - colormap='viridis', - vmin=None, - vmax=None, - mode=None): - """ - Plot a 3D scatter plot in a :class:`~silx.gui.plot3d.SceneWindow.SceneWindow` widget. - - How to use: - - >>> from silx import sx - - Provided x, y, z, values, 4 numpy array of float32: - - >>> plot3d_window = sx.points3d(x, y, z) - - >>> plot3d_window = sx.points3d(x, y, z, values) - - This function provides a subset of `mayavi.mlab.points3d - <http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#points3d>`_ - arguments. - - :param numpy.ndarray x: X coordinates of the points - :param numpy.ndarray y: Y coordinates of the points - :param numpy.ndarray z: Z coordinates of the points (optional) - :param numpy.ndarray values: Values at each point (optional) - :param bool copy: - True (default) to make a copy of scalars. - False to avoid this copy (do not modify provided data afterwards) - :param str colormap: - Colormap to use for coding points as colors. - :param vmin: Minimum value of the colormap - :type vmin: Union[float, None] - :param vmax: Maximum value of the colormap - :type vmax: Union[float, None] - :param str mode: The type of marker to use - - - Circle: 'o', '2dcircle' - - Diamond: 'd', '2ddiamond' - - Square: 's', '2dsquare' - - Plus: '+' - - Cross: 'x', '2dcross' - - Star: '*' - - Vertical line: '|' - - Horizontal line: '_', '2ddash' - - Point: '.' - - Pixel: ',' - :return: The widget used to visualize the data - :rtype: ~silx.gui.plot3d.SceneWindow.SceneWindow - """ - # Prepare widget - window = SceneWindow() - sceneWidget = window.getSceneWidget() - sceneWidget.setBackgroundColor((0.9, 0.9, 0.9)) - sceneWidget.setForegroundColor((0.5, 0.5, 0.5)) - sceneWidget.setTextColor((0.1, 0.1, 0.1)) - - mode = _POINTS3D_MODE_CONVERSION.get(mode, mode) - - if z is None: # 2D scatter plot - scatter = sceneWidget.add2DScatter(x, y, values, copy=copy) - else: # 3D scatter plot - scatter = sceneWidget.add3DScatter(x, y, z, values, copy=copy) - - colormap = Colormap(name=colormap, vmin=vmin, vmax=vmax) - scatter.setColormap(colormap) - if mode is not None: - scatter.setSymbol(mode) - - window.show() - - return window |