Skip to content
Snippets Groups Projects
Commit 1d0e6f3f authored by Martyn Gigg's avatar Martyn Gigg
Browse files

Add 2d plot option to workspace tree context menu.

This is just a thin wrapper around pcolormesh.
Refs #21567
parent 51f56fd9
No related branches found
No related tags found
No related merge requests found
......@@ -30,11 +30,40 @@ import matplotlib.pyplot as plt
# Constants
# -----------------------------------------------------------------------------
PROJECTION = 'mantid'
DEFAULT_COLORMAP = 'viridis'
# -----------------------------------------------------------------------------
# Functions
# -----------------------------------------------------------------------------
def raise_if_not_sequence(seq, seq_name):
accepted_types = [list, tuple]
if type(seq) not in accepted_types:
raise ValueError("{} should be a list or tuple".format(seq_name))
def _validate_plot_inputs(workspaces, spectrum_nums, wksp_indices):
"""Raises a ValueError if any arguments have the incorrect types"""
if spectrum_nums is not None and wksp_indices is not None:
raise ValueError("Both spectrum_nums and wksp_indices supplied. "
"Please supply only 1.")
if not isinstance(workspaces, MatrixWorkspace):
raise_if_not_sequence(workspaces, 'Workspaces')
if spectrum_nums is not None:
raise_if_not_sequence(spectrum_nums, 'spectrum_nums')
if wksp_indices is not None:
raise_if_not_sequence(wksp_indices, 'wksp_indices')
def _validate_pcolormesh_inputs(workspaces):
"""Raises a ValueError if any arguments have the incorrect types"""
if not isinstance(workspaces, MatrixWorkspace):
raise_if_not_sequence(workspaces, 'Workspaces')
def plot(workspaces, spectrum_nums=None, wksp_indices=None, errors=False):
"""
Create a figure with a single subplot and for each workspace/index add a
......@@ -64,31 +93,35 @@ def plot(workspaces, spectrum_nums=None, wksp_indices=None, errors=False):
plot_fn(ws, **{kw: num})
ax.legend()
ax.set_title(workspaces[0].getName())
ax.set_title(workspaces[0].name())
fig.canvas.draw()
fig.show()
return fig
def _validate_plot_inputs(workspaces, spectrum_nums, wksp_indices):
"""Raises a ValueError if any arguments have the incorrect types"""
def raise_if_not_sequence(seq):
accepted_types = [list, tuple]
if type(seq) not in accepted_types:
raise ValueError("Workspaces should be a list or tuple")
if spectrum_nums is not None and wksp_indices is not None:
raise ValueError("Both spectrum_nums and wksp_indices supplied. "
"Please supply only 1.")
if not isinstance(workspaces, MatrixWorkspace):
raise_if_not_sequence(workspaces)
if spectrum_nums is not None:
raise_if_not_sequence(spectrum_nums)
def pcolormesh(workspaces):
"""
Create a figure containing subplots
if wksp_indices is not None:
raise_if_not_sequence(wksp_indices)
:param workspaces: A list of workspace handles
:param spectrum_nums: A list of spectrum number identifiers (general start from 1)
:param wksp_indices: A list of workspace indexes (starts from 0)
:param errors: If true then error bars are added for each plot
:returns: The figure containing the plots
"""
# check inputs
_validate_pcolormesh_inputs(workspaces)
# # we may be overwriting an active figure so clear everything
fig = plt.figure()
fig.clf()
nrows, ncols = 1, 1
ax = fig.add_subplot(1, nrows, ncols, projection=PROJECTION)
pcm = ax.pcolormesh(workspaces[0], cmap=DEFAULT_COLORMAP)
fig.colorbar(pcm, ax=ax)
ax.set_title(workspaces[0].name())
fig.canvas.draw()
fig.show()
return fig
# Compatibility function for existing MantidPlot functionality
......@@ -115,13 +148,6 @@ def plotSpectrum(workspaces, indices, distribution=None, error_bars=False,
fmt = 'o'
else:
fmt = '-'
# create figure
fig = plt.figure()
ax = fig.add_subplot(111, projection=PROJECTION)
for ws in workspaces:
for idx in indices:
ax.plot(ws, wkspIndex=idx, fmt=fmt)
if error_bars:
ax.errorbar(ws, wkspIndex=idx)
fig.show()
return fig
return plot(workspaces, wksp_indices=indices,
errors=error_bars, fmt=fmt)
......@@ -28,7 +28,16 @@ from qtpy.QtWidgets import QVBoxLayout
# local package imports
from workbench.plugins.base import PluginWidget
from workbench.plotting.functions import plot
from workbench.plotting.functions import pcolormesh, plot
def _workspaces_from_names(names):
"""Convert a list of workspace names to a list of workspace handles
:param names: List of names of workspaces
"""
ads = AnalysisDataService.Instance()
return [ads[name.encode('utf-8')] for name in names]
class WorkspaceWidget(PluginWidget):
......@@ -45,8 +54,11 @@ class WorkspaceWidget(PluginWidget):
self.setLayout(layout)
# behaviour
workspacewidget.plotSpectrumClicked.connect(functools.partial(self._do_plot1d, errors=False))
workspacewidget.plotSpectrumWithErrorsClicked.connect(functools.partial(self._do_plot1d, errors=True))
workspacewidget.plotSpectrumClicked.connect(functools.partial(self._do_plot_spectrum,
errors=False))
workspacewidget.plotSpectrumWithErrorsClicked.connect(functools.partial(self._do_plot_spectrum,
errors=True))
workspacewidget.plotColorfillClicked.connect(self._do_plot_colorfill)
# ----------------- Plugin API --------------------
......@@ -56,13 +68,20 @@ class WorkspaceWidget(PluginWidget):
def get_plugin_title(self):
return "Workspaces"
def read_user_settings(self, _):
pass
# ----------------- Behaviour --------------------
def _do_plot1d(self, workspace_names, errors):
def _do_plot_spectrum(self, names, errors):
"""
Plot spectra from the selected workspaces
:param names: A list of workspace names
:param errors: If true then error bars will be plotted on the points
"""
try:
ads = AnalysisDataService.Instance()
workspaces = [ads[name.encode('utf-8')] for name in workspace_names]
selection = get_plot_selection(workspaces, self)
selection = get_plot_selection(_workspaces_from_names(names), self)
if selection is not None:
plot(selection.workspaces, spectrum_nums=selection.spectra,
wksp_indices=selection.wksp_indices,
......@@ -70,3 +89,15 @@ class WorkspaceWidget(PluginWidget):
except BaseException:
import traceback
traceback.print_exc()
def _do_plot_colorfill(self, names):
"""
Plot a colorfill from the selected workspaces
:param names: A list of workspace names
"""
try:
pcolormesh(_workspaces_from_names(names))
except BaseException:
import traceback
traceback.print_exc()
......@@ -222,4 +222,5 @@ public:
signals:
void plotSpectrumClicked(const QStringList & workspaceName);
void plotSpectrumWithErrorsClicked(const QStringList & workspaceName);
void plotColorfillClicked(const QStringList &workspaceName);
};
......@@ -61,13 +61,15 @@ public:
signals:
void plotSpectrumClicked(const QStringList &workspaceName);
void plotSpectrumWithErrorsClicked(const QStringList &workspaceName);
void plotColorfillClicked(const QStringList &workspaceName);
private slots:
void onPlotSpectrumClicked();
void onPlotSpectrumWithErrorsClicked();
void onPlotColorfillClicked();
private:
QAction *m_plotSpectrum, *m_plotSpectrumWithErrs;
QAction *m_plotSpectrum, *m_plotSpectrumWithErrs, *m_plotColorfill;
};
}
}
......
......@@ -21,12 +21,15 @@ WorkspaceTreeWidgetSimple::WorkspaceTreeWidgetSimple(MantidDisplayBase *mdb,
QWidget *parent)
: WorkspaceTreeWidget(mdb, parent),
m_plotSpectrum(new QAction("spectrum...", this)),
m_plotSpectrumWithErrs(new QAction("spectrum with errors...", this)) {
m_plotSpectrumWithErrs(new QAction("spectrum with errors...", this)),
m_plotColorfill(new QAction("colorfill", this)) {
// connections
connect(m_plotSpectrum, SIGNAL(triggered()), this,
SLOT(onPlotSpectrumClicked()));
connect(m_plotSpectrumWithErrs, SIGNAL(triggered()), this,
SLOT(onPlotSpectrumWithErrorsClicked()));
connect(m_plotColorfill, SIGNAL(triggered()), this,
SLOT(onPlotColorfillClicked()));
}
WorkspaceTreeWidgetSimple::~WorkspaceTreeWidgetSimple() {}
......@@ -52,6 +55,7 @@ void WorkspaceTreeWidgetSimple::popupContextMenu() {
QMenu *plotSubMenu(new QMenu("Plot", menu));
plotSubMenu->addAction(m_plotSpectrum);
plotSubMenu->addAction(m_plotSpectrumWithErrs);
plotSubMenu->addAction(m_plotColorfill);
menu->addMenu(plotSubMenu);
menu->addSeparator();
......@@ -74,5 +78,9 @@ void WorkspaceTreeWidgetSimple::onPlotSpectrumWithErrorsClicked() {
emit plotSpectrumWithErrorsClicked(getSelectedWorkspaceNamesAsQList());
}
void WorkspaceTreeWidgetSimple::onPlotColorfillClicked() {
emit plotColorfillClicked(getSelectedWorkspaceNamesAsQList());
}
} // namespace MantidWidgets
} // namespace MantidQt
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment