コード例 #1
0
    def test_get_spectrum_distribution_workspace(self):
        # Since the workspace being plotted is a distribution, we should not
        # divide by bin width whether or not normalize_by_bin_width is True
        x, y, dy, dx = funcs.get_spectrum(self.ws2d_histo,
                                          1,
                                          True,
                                          withDy=True,
                                          withDx=True)
        self.assertTrue(np.array_equal(x, np.array([15., 25.])))
        self.assertTrue(np.array_equal(y, np.array([4, 5])))
        self.assertTrue(np.array_equal(dy, np.array([3, 4])))
        self.assertEqual(dx, None)

        x, y, dy, dx = funcs.get_spectrum(self.ws2d_histo,
                                          0,
                                          False,
                                          withDy=True,
                                          withDx=True)
        self.assertTrue(np.array_equal(x, np.array([15., 25.])))
        self.assertTrue(np.array_equal(y, np.array([2, 3])))
        self.assertTrue(np.array_equal(dy, np.array([1, 2])))
        self.assertEqual(dx, None)
        # fail case - try to find spectrum out of range
        self.assertRaises(RuntimeError, funcs.get_spectrum, self.ws2d_histo,
                          10, True)
コード例 #2
0
def _get_data_for_plot(axes, workspace, kwargs, with_dy=False, with_dx=False):
    if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace):
        (normalization, kwargs) = get_normalization(workspace, **kwargs)
        indices, kwargs = get_indices(workspace, **kwargs)
        (x, y, dy) = get_md_data1d(workspace, normalization, indices)
        dx = None
        axis = None
    else:
        axis = MantidAxType(kwargs.pop("axis", MantidAxType.SPECTRUM))
        normalize_by_bin_width, kwargs = get_normalize_by_bin_width(
            workspace, axes, **kwargs)
        workspace_index, distribution, kwargs = get_wksp_index_dist_and_label(
            workspace, axis, **kwargs)
        if axis == MantidAxType.BIN:
            # Overwrite any user specified xlabel
            axes.set_xlabel("Spectrum")
            x, y, dy, dx = get_bins(workspace, workspace_index, with_dy)
        elif axis == MantidAxType.SPECTRUM:
            x, y, dy, dx = get_spectrum(workspace, workspace_index,
                                        normalize_by_bin_width, with_dy,
                                        with_dx)
        else:
            raise ValueError(
                "Axis {} is not a valid axis number.".format(axis))
        indices = None
    return x, y, dy, dx, indices, axis, kwargs
コード例 #3
0
def plot(axes, workspace, *args, **kwargs):
    '''
    3D plots - line plots

    :param axes: class:`matplotlib.axes.Axes3D` object that will do the plotting
    :param workspace: :class:`mantid.api.MatrixWorkspace` or
                      :class:`mantid.api.IMDHistoWorkspace` to extract the data from
    :param zdir: Which direction to use as z ('x', 'y' or 'z') when plotting a 2D set.
    :param indices: Specify which slice of an MDHistoWorkspace to use when plotting. Needs to be a tuple
                    and will be interpreted as a list of indices. You need to use ``slice(None)`` to
                    select which dimension to plot. *e.g.* to select the second axis to plot from a
                    3D volume use ``indices=(5, slice(None), 10)`` where the 5/10 are the bins selected
                    for the other 2 axes.
    :param slicepoint: Specify which slice of an MDHistoWorkspace to use when plotting in the dimension units.
                       You need to use ``None`` to select which dimension to plot. *e.g.* to select the second
                       axis to plot from a 3D volume use ``slicepoint=(1.0, None, 2.0)`` where the 1.0/2.0 are
                       the dimension selected for the other 2 axes.
    '''
    if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace):
        (normalization, kwargs) = get_normalization(workspace, **kwargs)
        indices, kwargs = get_indices(workspace, **kwargs)
        (x, y, z) = get_md_data1d(workspace, normalization, indices)
    else:
        (wksp_index, distribution,
         kwargs) = get_wksp_index_dist_and_label(workspace, **kwargs)
        (x, z, _, _) = get_spectrum(workspace,
                                    wksp_index,
                                    distribution,
                                    withDy=False,
                                    withDx=False)
        y_val = workspace.getAxis(1).extractValues()[wksp_index]
        y = [y_val for _ in range(len(x))]  # fill x size array with y value
        _set_labels_3d(axes, workspace)
    return axes.plot(x, y, z, *args, **kwargs)
コード例 #4
0
def get_ws_data(ws_name, wkspIndex=0, withDy=True):
    wksp = get_ws(ws_name)
    x, y, dy, _ = get_spectrum(wksp,
                               wkspIndex,
                               False,
                               withDy=withDy,
                               withDx=False)
    return x, y, dy
コード例 #5
0
 def test_get_spectrum_no_dy_dx(self, ws):
     x, y, dy, dx = funcs.get_spectrum(ws,
                                       3,
                                       normalize_by_bin_width=False,
                                       withDy=False,
                                       withDx=False)
     self.assertTrue(np.array_equal([13.5, 14.5, 15.5], x))
     self.assertTrue(np.array_equal([10.0, 11.0, 12.0], y))
     self.assertIsNone(dy)
     self.assertIsNone(dx)
コード例 #6
0
 def test_get_spectrum_non_distribution_workspace(self):
     # get data divided by bin width
     x, y, dy, dx = funcs.get_spectrum(self.ws2d_non_distribution,
                                       1,
                                       normalize_by_bin_width=True,
                                       withDy=True,
                                       withDx=True)
     self.assertTrue(np.array_equal(x, np.array([15., 25.])))
     self.assertTrue(np.array_equal(y, np.array([0.4, 0.5])))
     self.assertTrue(np.array_equal(dy, np.array([0.3, 0.4])))
     self.assertEqual(dx, None)
     # get data not divided by bin width
     x, y, dy, dx = funcs.get_spectrum(self.ws2d_non_distribution,
                                       1,
                                       normalize_by_bin_width=False,
                                       withDy=True,
                                       withDx=True)
     self.assertTrue(np.array_equal(x, np.array([15., 25.])))
     self.assertTrue(np.array_equal(y, np.array([4, 5])))
     self.assertTrue(np.array_equal(dy, np.array([3, 4])))
     self.assertEqual(dx, None)
     # fail case - try to find spectrum out of range
     self.assertRaises(RuntimeError, funcs.get_spectrum,
                       self.ws2d_non_distribution, 10, True)
コード例 #7
0
def scatter(axes, workspace, *args, **kwargs):
    '''
    Unpack mantid workspace and render it with matplotlib. ``args`` and
    ``kwargs`` are passed to :py:meth:`matplotlib.axes.Axes.scatter` after special
    keyword arguments are removed. This will automatically label the
    line according to the spectrum number unless specified otherwise.

    :param axes:      :class:`matplotlib.axes.Axes` object that will do the plotting
    :param workspace: :class:`mantid.api.MatrixWorkspace` or :class:`mantid.api.IMDHistoWorkspace`
                      to extract the data from
    :param specNum:   spectrum number to plot if MatrixWorkspace
    :param wkspIndex: workspace index to plot if MatrixWorkspace
    :param distribution: ``None`` (default) asks the workspace. ``False`` means
                         divide by bin width. ``True`` means do not divide by bin width.
                         Applies only when the the workspace is a MatrixWorkspace histogram.
    :param normalization: ``None`` (default) ask the workspace. Applies to MDHisto workspaces. It can override
                          the value from displayNormalizationHisto. It checks only if
                          the normalization is mantid.api.MDNormalization.NumEventsNormalization
    :param indices: Specify which slice of an MDHistoWorkspace to use when plotting. Needs to be a tuple
                    and will be interpreted as a list of indices. You need to use ``slice(None)`` to
                    select which dimension to plot. *e.g.* to select the second axis to plot from a
                    3D volume use ``indices=(5, slice(None), 10)`` where the 5/10 are the bins selected
                    for the other 2 axes.
    :param slicepoint: Specify which slice of an MDHistoWorkspace to use when plotting in the dimension units.
                       You need to use ``None`` to select which dimension to plot. *e.g.* to select the second
                       axis to plot from a 3D volume use ``slicepoint=(1.0, None, 2.0)`` where the 1.0/2.0 are
                       the dimension selected for the other 2 axes.

    For matrix workspaces with more than one spectra, either ``specNum`` or ``wkspIndex``
    needs to be specified. Giving both will generate a :class:`RuntimeError`. There is no similar
    keyword for MDHistoWorkspaces. These type of workspaces have to have exactly one non integrated
    dimension
    '''
    if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace):
        (normalization, kwargs) = get_normalization(workspace, **kwargs)
        indices, kwargs = get_indices(workspace, **kwargs)
        (x, y, _) = get_md_data1d(workspace, normalization, indices)
        _setLabels1D(axes, workspace, indices)
    else:
        (wkspIndex, distribution,
         kwargs) = get_wksp_index_dist_and_label(workspace, **kwargs)
        (x, y, _, _) = get_spectrum(workspace, wkspIndex, distribution)
        _setLabels1D(axes, workspace)
    return axes.scatter(x, y, *args, **kwargs)