def test_get_matrix_2d_data_rect(self): # contour from aligned point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point, True, histogram2D=False) np.testing.assert_allclose( x, np.array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]])) np.testing.assert_allclose( y, np.array([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]])) # mesh from aligned point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point, True, histogram2D=True) np.testing.assert_allclose( x, np.array([[0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5]])) np.testing.assert_allclose( y, np.array([[0.5, 0.5, 0.5, 0.5, 0.5], [1.5, 1.5, 1.5, 1.5, 1.5], [2.5, 2.5, 2.5, 2.5, 2.5], [3.5, 3.5, 3.5, 3.5, 3.5]])) # contour from aligned histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[15, 25], [15, 25]])) np.testing.assert_allclose(y, np.array([[5, 5], [7, 7]])) # mesh from aligned histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo, True, histogram2D=True) np.testing.assert_allclose( x, np.array([[10, 20, 30], [10, 20, 30], [10, 20, 30]])) np.testing.assert_allclose(y, np.array([[4, 4, 4], [6, 6, 6], [8, 8, 8]]))
def imshow(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.imshow`. :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 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 matrix workspace is a 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 axisaligned: ``False`` (default). If ``True``, or if the workspace has a variable number of bins, the polygons will be aligned with the axes ''' _setLabels2D(axes, workspace) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) x, y, z = get_md_data2d_bin_bounds(workspace, normalization) else: (uneven_bins, kwargs) = get_data_uneven_flag(workspace, **kwargs) (distribution, kwargs) = get_distribution(workspace, **kwargs) if check_resample_to_regular_grid(workspace): (x, y, z) = get_matrix_2d_ragged(workspace, distribution, histogram2D=True) else: (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=True) if 'extent' not in kwargs: if x.ndim == 2 and y.ndim == 2: kwargs['extent'] = [x[0, 0], x[0, -1], y[0, 0], y[-1, 0]] else: kwargs['extent'] = [x[0], x[-1], y[0], y[-1]] return mantid.plots.modest_image.imshow(axes, z, *args, **kwargs)
def tripcolor(axes, workspace, *args, **kwargs): ''' To be used with non-uniform grids. Currently this only works with workspaces that have a constant number of bins between spectra or with MDHistoWorkspaces. :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 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 matrix workspace is a 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 See :meth:`matplotlib.axes.Axes.tripcolor` for more information. ''' if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) x_temp, y_temp, z = get_md_data2d_bin_centers(workspace, normalization) x, y = numpy.meshgrid(x_temp, y_temp) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False) _setLabels2D(axes, workspace) return axes.tripcolor(x.ravel(), y.ravel(), z.ravel(), *args, **kwargs)
def pcolormesh(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.pcolormesh`. :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 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 matrix workspace is a 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 axisaligned: ``False`` (default). If ``True``, or if the workspace has a variable number of bins, the polygons will be aligned with the axes ''' _setLabels2D(axes, workspace) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) x, y, z = get_md_data2d_bin_bounds(workspace, normalization) else: (aligned, kwargs) = get_data_uneven_flag(workspace, **kwargs) (distribution, kwargs) = get_distribution(workspace, **kwargs) if aligned: kwargs['pcolortype'] = 'mesh' return _pcolorpieces(axes, workspace, distribution, *args, **kwargs) else: (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=True) return axes.pcolormesh(x, y, z, *args, **kwargs)
def contourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.contourf` but calculates the countour levels. Currently this only works with workspaces that have a constant number of bins between spectra. :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 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 matrix workspace is a 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 ''' if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) x, y, z = get_md_data2d_bin_centers(workspace, normalization) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False) _setLabels2D(axes, workspace) return axes.contourf(x, y, z, *args, **kwargs)
def _extract_3d_data(workspace, **kwargs): if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): normalization, kwargs = get_normalization(workspace, **kwargs) x_temp, y_temp, z = get_md_data2d_bin_centers(workspace, normalization) x, y = numpy.meshgrid(x_temp, y_temp) else: distribution, kwargs = get_distribution(workspace, **kwargs) x, y, z = get_matrix_2d_data(workspace, distribution, histogram2D=False) return x, y, z
def tricontourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`mantid.plots.contourf`, but works for non-uniform grids. Currently this only works with workspaces that have a constant number of bins between spectra or with MDHistoWorkspaces. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace See :meth:`matplotlib.axes.Axes.tricontourf` for more information. ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x_temp, y_temp, z = get_md_data2d_bin_centers(workspace, normalization, indices, transpose) x, y = numpy.meshgrid(x_temp, y_temp) _setLabels2D(axes, workspace, indices, transpose) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) # tricontourf segfaults if many z values are not finite # https://github.com/matplotlib/matplotlib/issues/10167 x = x.ravel() y = y.ravel() z = z.ravel() condition = numpy.isfinite(z) x = x[condition] y = y[condition] z = z[condition] return axes.tricontourf(x, y, z, *args, **kwargs)
def _extract_3d_data(workspace, **kwargs): if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): normalization, kwargs = get_normalization(workspace, **kwargs) x_temp, y_temp, z = get_md_data2d_bin_centers(workspace, normalization) x, y = numpy.meshgrid(x_temp, y_temp) else: distribution, kwargs = get_distribution(workspace, **kwargs) x, y, z = get_matrix_2d_data(workspace, distribution, histogram2D=False) return x, y, z
def test_get_matrix_2d_data_rag(self): # contour from ragged point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point_rag, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[1, 2, 3, 4], [2, 4, 6, 8]])) np.testing.assert_allclose(y, np.array([[1, 1, 1, 1], [2, 2, 2, 2]])) # contour from ragged histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo_rag, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[1.5, 2.5, 3.5, 4.5], [3, 5, 7, 9]])) np.testing.assert_allclose(y, np.array([[6, 6, 6, 6], [8, 8, 8, 8]])) # mesh from ragged point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point_rag, True, histogram2D=True) np.testing.assert_allclose(x, np.array([[0.5, 1.5, 2.5, 3.5, 4.5], [1, 3, 5, 7, 9], [1, 3, 5, 7, 9]])) np.testing.assert_allclose(y, np.array( [[0.5, 0.5, 0.5, 0.5, 0.5], [1.5, 1.5, 1.5, 1.5, 1.5], [2.5, 2.5, 2.5, 2.5, 2.5]])) # mesh from ragged histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo_rag, True, histogram2D=True) np.testing.assert_allclose(x, np.array([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [2, 4, 6, 8, 10]])) np.testing.assert_allclose(y, np.array([[5, 5, 5, 5, 5], [7, 7, 7, 7, 7], [9, 9, 9, 9, 9]])) # check that fails for uneven data self.assertRaises(ValueError, funcs.get_matrix_2d_data, self.ws2d_point_uneven, True)
def test_get_matrix_2d_data_rag(self): # contour from ragged point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point_rag, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[1, 2, 3, 4], [2, 4, 6, 8]])) np.testing.assert_allclose(y, np.array([[1, 1, 1, 1], [2, 2, 2, 2]])) # contour from ragged histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo_rag, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[1.5, 2.5, 3.5, 4.5], [3, 5, 7, 9]])) np.testing.assert_allclose(y, np.array([[6, 6, 6, 6], [8, 8, 8, 8]])) # mesh from ragged point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point_rag, True, histogram2D=True) np.testing.assert_allclose(x, np.array([[0.5, 1.5, 2.5, 3.5, 4.5], [1, 3, 5, 7, 9], [1, 3, 5, 7, 9]])) np.testing.assert_allclose(y, np.array( [[0.5, 0.5, 0.5, 0.5, 0.5], [1.5, 1.5, 1.5, 1.5, 1.5], [2.5, 2.5, 2.5, 2.5, 2.5]])) # mesh from ragged histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo_rag, True, histogram2D=True) np.testing.assert_allclose(x, np.array([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [2, 4, 6, 8, 10]])) np.testing.assert_allclose(y, np.array([[5, 5, 5, 5, 5], [7, 7, 7, 7, 7], [9, 9, 9, 9, 9]])) # check that fails for uneven data self.assertRaises(ValueError, funcs.get_matrix_2d_data, self.ws2d_point_uneven, True)
def imshow(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.imshow`. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param axisaligned: ``False`` (default). If ``True``, or if the workspace has a variable number of bins, the polygons will be aligned with the axes :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x, y, z = get_md_data2d_bin_bounds(workspace, normalization, indices, transpose) _setLabels2D(axes, workspace, indices, transpose) else: (uneven_bins, kwargs) = get_data_uneven_flag(workspace, **kwargs) (distribution, kwargs) = get_distribution(workspace, **kwargs) if check_resample_to_regular_grid(workspace): (x, y, z) = get_matrix_2d_ragged(workspace, distribution, histogram2D=True, transpose=transpose) else: (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=True, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) if 'extent' not in kwargs: if x.ndim == 2 and y.ndim == 2: kwargs['extent'] = [x[0, 0], x[0, -1], y[0, 0], y[-1, 0]] else: kwargs['extent'] = [x[0], x[-1], y[0], y[-1]] return mantid.plots.modest_image.imshow(axes, z, *args, **kwargs)
def test_get_matrix_2d_data_rect(self): # contour from aligned point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]])) np.testing.assert_allclose(y, np.array([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]])) # mesh from aligned point data x, y, z = funcs.get_matrix_2d_data(self.ws2d_point, True, histogram2D=True) np.testing.assert_allclose(x, np.array( [[0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5], [0.5, 1.5, 2.5, 3.5, 4.5]])) np.testing.assert_allclose(y, np.array( [[0.5, 0.5, 0.5, 0.5, 0.5], [1.5, 1.5, 1.5, 1.5, 1.5], [2.5, 2.5, 2.5, 2.5, 2.5], [3.5, 3.5, 3.5, 3.5, 3.5]])) # contour from aligned histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo, True, histogram2D=False) np.testing.assert_allclose(x, np.array([[15, 25], [15, 25]])) np.testing.assert_allclose(y, np.array([[5, 5], [7, 7]])) # mesh from aligned histo data x, y, z = funcs.get_matrix_2d_data(self.ws2d_histo, True, histogram2D=True) np.testing.assert_allclose(x, np.array([[10, 20, 30], [10, 20, 30], [10, 20, 30]])) np.testing.assert_allclose(y, np.array([[4, 4, 4], [6, 6, 6], [8, 8, 8]]))
def tricontourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`mantid.plots.contourf`, but works for non-uniform grids. Currently this only works with workspaces that have a constant number of bins between spectra or with MDHistoWorkspaces. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace See :meth:`matplotlib.axes.Axes.tricontourf` for more information. ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x_temp, y_temp, z = get_md_data2d_bin_centers(workspace, normalization, indices, transpose) x, y = numpy.meshgrid(x_temp, y_temp) _setLabels2D(axes, workspace, indices, transpose) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) # tricontourf segfaults if many z values are not finite # https://github.com/matplotlib/matplotlib/issues/10167 x = x.ravel() y = y.ravel() z = z.ravel() condition = numpy.isfinite(z) x = x[condition] y = y[condition] z = z[condition] return axes.tricontourf(x, y, z, *args, **kwargs)
def imshow(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.imshow`. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param axisaligned: ``False`` (default). If ``True``, or if the workspace has a variable number of bins, the polygons will be aligned with the axes :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x, y, z = get_md_data2d_bin_bounds(workspace, normalization, indices, transpose) _setLabels2D(axes, workspace, indices, transpose) else: (uneven_bins, kwargs) = get_data_uneven_flag(workspace, **kwargs) (distribution, kwargs) = get_distribution(workspace, **kwargs) if check_resample_to_regular_grid(workspace): (x, y, z) = get_matrix_2d_ragged(workspace, distribution, histogram2D=True, transpose=transpose) else: (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=True, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) if 'extent' not in kwargs: if x.ndim == 2 and y.ndim == 2: kwargs['extent'] = [x[0, 0], x[0, -1], y[0, 0], y[-1, 0]] else: kwargs['extent'] = [x[0], x[-1], y[0], y[-1]] return mantid.plots.modest_image.imshow(axes, z, *args, **kwargs)
def contourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.contourf` but calculates the countour levels. Currently this only works with workspaces that have a constant number of bins between spectra. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x, y, z = get_md_data2d_bin_centers(workspace, normalization, indices, transpose) _setLabels2D(axes, workspace, indices, transpose) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) return axes.contourf(x, y, z, *args, **kwargs)
def tricontourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`mantid.plots.contourf`, but works for non-uniform grids. Currently this only works with workspaces that have a constant number of bins between spectra or with MDHistoWorkspaces. :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 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 matrix workspace is a 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 See :meth:`matplotlib.axes.Axes.tricontourf` for more information. ''' if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) (x_temp, y_temp, z) = get_md_data2d_bin_centers(workspace, normalization) (x, y) = numpy.meshgrid(x_temp, y_temp) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False) _setLabels2D(axes, workspace) # tricontourf segfaults if many z values are not finite # https://github.com/matplotlib/matplotlib/issues/10167 x = x.ravel() y = y.ravel() z = z.ravel() condition = numpy.isfinite(z) x = x[condition] y = y[condition] z = z[condition] return axes.tricontourf(x, y, z, *args, **kwargs)
def imshow(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.imshow`. :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 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 matrix workspace is a 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 axisaligned: ``False`` (default). If ``True``, or if the workspace has a variable number of bins, the polygons will be aligned with the axes ''' _setLabels2D(axes, workspace) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) x, y, z = get_md_data2d_bin_bounds(workspace, normalization) else: (uneven_bins, kwargs) = get_data_uneven_flag(workspace, **kwargs) (distribution, kwargs) = get_distribution(workspace, **kwargs) if uneven_bins: raise Exception( 'Variable number of bins is not supported by imshow.') else: (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=True) diffs = numpy.diff(x, axis=1) x_spacing_equal = numpy.alltrue(diffs == diffs[0]) diffs = numpy.diff(y, axis=0) y_spacing_equal = numpy.alltrue(diffs == diffs[0]) if not x_spacing_equal or not y_spacing_equal: raise Exception('Unevenly spaced bins are not supported by imshow') if 'extent' not in kwargs: kwargs['extent'] = [x[0, 0], x[0, -1], y[0, 0], y[-1, 0]] return _imshow(axes, z, *args, **kwargs)
def contourf(axes, workspace, *args, **kwargs): ''' Essentially the same as :meth:`matplotlib.axes.Axes.contourf` but calculates the countour levels. Currently this only works with workspaces that have a constant number of bins between spectra. :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 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 matrix workspace is a 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 dimensions to plot. *e.g.* to select the last two axes to plot from a 3D volume use ``indices=(5, slice(None), slice(None))`` where the 5 is the bin selected for the first axis. :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 last two axes to plot from a 3D volume use ``slicepoint=(1.0, None, None)`` where the 1.0 is the value of the dimension selected for the first axis. :param transpose: ``bool`` to transpose the x and y axes of the plotted dimensions of an MDHistoWorkspace ''' transpose = kwargs.pop('transpose', False) if isinstance(workspace, mantid.dataobjects.MDHistoWorkspace): (normalization, kwargs) = get_normalization(workspace, **kwargs) indices, kwargs = get_indices(workspace, **kwargs) x, y, z = get_md_data2d_bin_centers(workspace, normalization, indices, transpose) _setLabels2D(axes, workspace, indices, transpose) else: (distribution, kwargs) = get_distribution(workspace, **kwargs) (x, y, z) = get_matrix_2d_data(workspace, distribution, histogram2D=False, transpose=transpose) _setLabels2D(axes, workspace, transpose=transpose) return axes.contourf(x, y, z, *args, **kwargs)