def draw(self, painter, xMap, yMap, canvasRect): self.update_text() x, y = self.get_top_left(xMap, yMap, canvasRect) x0, y0 = self.get_origin(xMap, yMap, canvasRect) painter.save() self.marker.draw(painter, x0, y0) painter.restore() sz = self.text.size() self.draw_frame(painter, x, y, sz.width(), sz.height()) painter.setPen(QPen(QColor(self.labelparam.color))) painter.translate(x, y) self.text.drawContents(painter) assert_interfaces_valid(LabelItem) LEGEND_WIDTH = 30 # Length of the sample line LEGEND_SPACEH = 5 # Spacing between border, sample, text, border LEGEND_SPACEV = 3 # Vertical space between items class LegendBoxItem(AbstractLabelItem): __implements__ = (IBasePlotItem, ISerializableType) def __init__(self, labelparam=None): self.font = None self.color = None super(LegendBoxItem, self).__init__(labelparam) # saves the last computed sizes
self.cs_plot.unregister_shape(shape) def update_plot(self, obj=None): """ Update cross section curve(s) associated to object *obj* *obj* may be a marker or a rectangular shape (see :py:class:`guiqwt.tools.CrossSectionTool` and :py:class:`guiqwt.tools.AverageCrossSectionTool`) If obj is None, update the cross sections of the last active object """ self.cs_plot.update_plot(obj) assert_interfaces_valid(CrossSectionWidget) #=============================================================================== # X-Y cross sections #=============================================================================== class XCrossSection(CrossSectionWidget): """X-axis cross section widget""" PANEL_ID = ID_XCS OTHER_PANEL_ID = ID_YCS CrossSectionPlotKlass = XCrossSectionPlot def __init__(self, parent=None): super(XCrossSection, self).__init__(parent) self.peritem_ac = None self.applylut_ac = None
def unregister_shape(self, shape): self.cs_plot.unregister_shape(shape) def update_plot(self, obj=None): """ Update cross section curve(s) associated to object *obj* *obj* may be a marker or a rectangular shape (see :py:class:`guiqwt.tools.CrossSectionTool` and :py:class:`guiqwt.tools.AverageCrossSectionTool`) If obj is None, update the cross sections of the last active object """ self.cs_plot.update_plot(obj) assert_interfaces_valid(CrossSectionWidget) #=============================================================================== # X-Y cross sections #=============================================================================== class XCrossSection(CrossSectionWidget): """X-axis cross section widget""" PANEL_ID = ID_XCS OTHER_PANEL_ID = ID_YCS CrossSectionPlotKlass = XCrossSectionPlot def __init__(self, parent=None): super(XCrossSection, self).__init__(parent) self.peritem_ac = None self.applylut_ac = None
def plot_axis_changed(self, plot): plot_id = plot.plot_id if plot_id not in self.synchronized_plots: return for (axis, other_plot_id) in self.synchronized_plots[plot_id]: scalediv = plot.axisScaleDiv(axis) map = plot.canvasMap(axis) other = self.get_plot(other_plot_id) lb = scalediv.lowerBound() ub = scalediv.upperBound() other.setAxisScale(axis, lb, ub) other.replot() assert_interfaces_valid(PlotManager) #=============================================================================== # Curve Plot Widget/Dialog with integrated Item list widget #=============================================================================== def configure_plot_splitter(qsplit, decreasing_size=True): qsplit.setChildrenCollapsible(False) qsplit.setHandleWidth(4) if decreasing_size: qsplit.setStretchFactor(0, 1) qsplit.setStretchFactor(1, 0) qsplit.setSizes([2, 1]) else: qsplit.setStretchFactor(0, 0) qsplit.setStretchFactor(1, 1)
pass def draw(self, painter, xMap, yMap, canvasRect): self.update_text() x, y = self.get_top_left(xMap, yMap, canvasRect) x0, y0 = self.get_origin(xMap, yMap, canvasRect) painter.save() self.marker.drawSymbols(painter, [QPointF(x0, y0)]) painter.restore() sz = self.text.size() self.draw_frame(painter, x, y, sz.width(), sz.height()) painter.setPen(QPen(QColor(self.labelparam.color))) painter.translate(x, y) self.text.drawContents(painter) assert_interfaces_valid(LabelItem) LEGEND_WIDTH = 30 # Length of the sample line LEGEND_SPACEH = 5 # Spacing between border, sample, text, border LEGEND_SPACEV = 3 # Vertical space between items class LegendBoxItem(AbstractLabelItem): __implements__ = (IBasePlotItem, ISerializableType) def __init__(self, labelparam=None): self.font = None self.color = None super(LegendBoxItem, self).__init__(labelparam) # saves the last computed sizes self.sizes = 0.0, 0.0, 0.0, 0.0
""" An objects that provides an Histogram data source interface to a simple numpy array of data """ __implements__ = (IHistDataSource, ) def __init__(self, data): self.data = data def get_histogram(self, nbins): """Returns the histogram computed for nbins bins""" return np.histogram(self.data, nbins) assert_interfaces_valid(HistDataSource) def hist_range_threshold(hist, bin_edges, percent): hist = np.concatenate((hist, [0])) threshold = 0.5 * percent / 100 * hist.sum() i_bin_min = np.cumsum(hist).searchsorted(threshold) i_bin_max = -1 - np.cumsum(np.flipud(hist)).searchsorted(threshold) return bin_edges[i_bin_min], bin_edges[i_bin_max] def lut_range_threshold(item, bins, percent): hist, bin_edges = item.get_histogram(bins) return hist_range_threshold(hist, bin_edges, percent)
synclist.append(item) def plot_axis_changed(self, plot): plot_id = plot.plot_id if plot_id not in self.synchronized_plots: return for (axis, other_plot_id) in self.synchronized_plots[plot_id]: scalediv = plot.axisScaleDiv(axis) map = plot.canvasMap(axis) other = self.get_plot(other_plot_id) lb = scalediv.lowerBound() ub = scalediv.upperBound() other.setAxisScale(axis, lb, ub) other.replot() assert_interfaces_valid(PlotManager) #=============================================================================== # Curve Plot Widget/Dialog with integrated Item list widget #=============================================================================== def configure_plot_splitter(qsplit, decreasing_size=True): qsplit.setChildrenCollapsible(False) qsplit.setHandleWidth(4) if decreasing_size: qsplit.setStretchFactor(0, 1) qsplit.setStretchFactor(1, 0) qsplit.setSizes([2, 1]) else: qsplit.setStretchFactor(0, 0) qsplit.setStretchFactor(1, 1)
def get_item_parameters(self, itemparams): self.shape.get_item_parameters(itemparams) self.label.get_item_parameters(itemparams) self.annotationparam.update_param(self) itemparams.add("AnnotationParam", self, self.annotationparam) def set_item_parameters(self, itemparams): self.shape.set_item_parameters(itemparams) self.label.set_item_parameters(itemparams) update_dataset(self.annotationparam, itemparams.get("AnnotationParam"), visible_only=True) self.annotationparam.update_annotation(self) assert_interfaces_valid(AnnotatedShape) class AnnotatedPoint(AnnotatedShape): """ Construct an annotated point at coordinates (x, y) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = PointShape LABEL_ANCHOR = "TL" def __init__(self, x=0, y=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_pos(x, y)
self.shape.unselect() def get_item_parameters(self, itemparams): self.shape.get_item_parameters(itemparams) self.label.get_item_parameters(itemparams) self.annotationparam.update_param(self) itemparams.add("AnnotationParam", self, self.annotationparam) def set_item_parameters(self, itemparams): self.shape.set_item_parameters(itemparams) self.label.set_item_parameters(itemparams) update_dataset(self.annotationparam, itemparams.get("AnnotationParam"), visible_only=True) self.annotationparam.update_annotation(self) assert_interfaces_valid(AnnotatedShape) class AnnotatedPoint(AnnotatedShape): """ Construct an annotated point at coordinates (x, y) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = PointShape LABEL_ANCHOR = "TL" def __init__(self, x=0, y=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_pos(x, y) #----Public API-------------------------------------------------------------
class HistDataSource(object): """ An objects that provides an Histogram data source interface to a simple numpy array of data """ __implements__ = (IHistDataSource,) def __init__(self, data): self.data = data def get_histogram(self, nbins): """Returns the histogram computed for nbins bins""" return np.histogram(self.data, nbins) assert_interfaces_valid(HistDataSource) def hist_range_threshold(hist, bin_edges, percent): hist = np.concatenate((hist, [0])) threshold = .5*percent/100*hist.sum() i_bin_min = np.cumsum(hist).searchsorted(threshold) i_bin_max = -1-np.cumsum(np.flipud(hist)).searchsorted(threshold) return bin_edges[i_bin_min], bin_edges[i_bin_max] def lut_range_threshold(item, bins, percent): hist, bin_edges = item.get_histogram(bins) return hist_range_threshold(hist, bin_edges, percent) class HistogramItem(CurveItem):