From db06e73372d065ba31cc4843fae0545c22471a6f Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sun, 10 Jan 2016 18:19:34 +0800 Subject: [PATCH] gui/applets: add XY plot --- artiq/applets/plot_xy.py | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 artiq/applets/plot_xy.py diff --git a/artiq/applets/plot_xy.py b/artiq/applets/plot_xy.py new file mode 100755 index 000000000..4b8221f42 --- /dev/null +++ b/artiq/applets/plot_xy.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3.5 + +import numpy as np +import pyqtgraph + +from artiq.applets.simple import SimpleApplet + + +class XYPlot(pyqtgraph.PlotWidget): + def __init__(self, args): + pyqtgraph.PlotWidget.__init__(self) + self.args = args + + def data_changed(self, data, mods): + try: + y = data[self.args.y][1] + except KeyError: + return + x = data.get(self.args.x, (False, None))[1] + if x is None: + x = list(range(len(y))) + error = data.get(self.args.error, (False, None))[1] + fit = data.get(self.args.fit, (False, None))[1] + + if not len(y) or len(y) != len(x): + return + if error is not None and hasattr(error, "__len__"): + if not len(error): + error = None + elif len(error) != len(y): + return + if fit is not None: + if not len(fit): + fit = None + elif len(fit) != len(y): + return + + self.clear() + self.plot(x, y, pen=None, symbol="x") + if error is not None: + # See https://github.com/pyqtgraph/pyqtgraph/issues/211 + if hasattr(error, "__len__") and not isinstance(error, np.ndarray): + error = np.array(error) + errbars = pg.ErrorBarItem(x=np.array(x), y=np.array(y), height=error) + self.addItem(errbars) + if fit is not None: + self.plot(x, fit) + + +def main(): + applet = SimpleApplet(XYPlot) + applet.add_dataset("y", "Y values") + applet.add_dataset("x", "X values", required=False) + applet.add_dataset("error", "Error bars for each X value", required=False) + applet.add_dataset("fit", "Fit values for each X value", required=False) + applet.run() + +if __name__ == "__main__": + main()