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)
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
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)
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
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)
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)
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)