From bb21791c710ccd11c889a6641672adc7fbbdcf3e Mon Sep 17 00:00:00 2001 From: Karl Georg Bedrich Date: Mon, 1 Jun 2020 20:12:52 +0200 Subject: [PATCH] changed structure to redefine axis via plotitem.setAxes (#391) * changed structure to redefine axis via plotitem.setAxes * cleanuup * remove old axesitems before adding new ones * DEBUGGED plotitem.setAxes NEW AxisItem.setOrientation (needed by plotitem.setAxes) show/hide right axes after .setAxes() Co-authored-by: Ogi Moore --- pyqtgraph/graphicsItems/AxisItem.py | 29 +++++++++-- pyqtgraph/graphicsItems/PlotItem/PlotItem.py | 51 +++++++++++++++++--- 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/pyqtgraph/graphicsItems/AxisItem.py b/pyqtgraph/graphicsItems/AxisItem.py index 29f3ad62..c02e6e0c 100644 --- a/pyqtgraph/graphicsItems/AxisItem.py +++ b/pyqtgraph/graphicsItems/AxisItem.py @@ -45,11 +45,8 @@ class AxisItem(GraphicsWidget): GraphicsWidget.__init__(self, parent) self.label = QtGui.QGraphicsTextItem(self) self.picture = None - self.orientation = orientation - if orientation not in ['left', 'right', 'top', 'bottom']: - raise Exception("Orientation argument must be one of 'left', 'right', 'top', or 'bottom'.") - if orientation in ['left', 'right']: - self.label.rotate(-90) + self.orientation = None + self.setOrientation(orientation) self.style = { 'tickTextOffset': [5, 2], ## (horizontal, vertical) spacing between text and axis @@ -111,6 +108,27 @@ class AxisItem(GraphicsWidget): self.grid = False #self.setCacheMode(self.DeviceCoordinateCache) + def setOrientation(self, orientation): + """ + orientation = 'left', 'right', 'top', 'bottom' + """ + if orientation != self.orientation: + if orientation not in ['left', 'right', 'top', 'bottom']: + raise Exception("Orientation argument must be one of 'left', 'right', 'top', or 'bottom'.") + #rotate absolute allows to change orientation multiple times: + if orientation in ['left', 'right']: + self.label.setRotation(-90) + if self.orientation: + self._updateWidth() + self.setMaximumHeight(16777215) + else: + self.label.setRotation(0) + if self.orientation: + self._updateHeight() + self.setMaximumWidth(16777215) + self.orientation = orientation + + def setStyle(self, **kwds): """ Set various style options. @@ -514,6 +532,7 @@ class AxisItem(GraphicsWidget): self.unlinkFromView() self._linkedView = weakref.ref(view) + if self.orientation in ['right', 'left']: view.sigYRangeChanged.connect(self.linkedViewChanged) else: diff --git a/pyqtgraph/graphicsItems/PlotItem/PlotItem.py b/pyqtgraph/graphicsItems/PlotItem/PlotItem.py index 73aa29cb..4142fa3f 100644 --- a/pyqtgraph/graphicsItems/PlotItem/PlotItem.py +++ b/pyqtgraph/graphicsItems/PlotItem/PlotItem.py @@ -153,10 +153,10 @@ class PlotItem(GraphicsWidget): self.legend = None - # Initialize axis items + ## Create and place axis items self.axes = {} - self.setAxisItems(axisItems) - + self.setAxes(axisItems) + self.titleLabel = LabelItem('', size='11pt', parent=self) self.layout.addItem(self.titleLabel, 0, 1) self.setTitle(None) ## hide @@ -242,7 +242,7 @@ class PlotItem(GraphicsWidget): self.ctrl.maxTracesCheck.toggled.connect(self.updateDecimation) self.ctrl.maxTracesSpin.valueChanged.connect(self.updateDecimation) - + if labels is None: labels = {} for label in list(self.axes.keys()): @@ -258,8 +258,45 @@ class PlotItem(GraphicsWidget): self.setTitle(title) if len(kargs) > 0: - self.plot(**kargs) + self.plot(**kargs) + def setAxes(self, axisItems): + """ + Create and place axis items + For valid values for axisItems see __init__ + """ + for v in self.axes.values(): + item = v['item'] + self.layout.removeItem(item) + self.vb.removeItem(item) + + self.axes = {} + if axisItems is None: + axisItems = {} + for k, pos in (('top', (1,1)), ('bottom', (3,1)), ('left', (2,0)), ('right', (2,2))): + axis = axisItems.get(k, None) + if axis: + axis.setOrientation(k) + else: + axis = AxisItem(orientation=k) + axis.linkToView(self.vb) + self.axes[k] = {'item': axis, 'pos': pos} + self.layout.addItem(axis, *pos) + axis.setZValue(-1000) + axis.setFlag(axis.ItemNegativeZStacksBehindParent) + #show/hide axes: + all_dir = ['left', 'bottom', 'right', 'top'] + if axisItems: + to_show = list(axisItems.keys()) + to_hide = [a for a in all_dir if a not in to_show] + else: + to_show = all_dir[:2] + to_hide = all_dir[2:] + for a in to_hide: + self.hideAxis(a) + for a in to_show: + self.showAxis(a) + def implements(self, interface=None): return interface in ['ViewBoxWrapper'] @@ -1123,8 +1160,8 @@ class PlotItem(GraphicsWidget): Show or hide one of the plot's axes. axis must be one of 'left', 'bottom', 'right', or 'top' """ - s = self.getScale(axis) - p = self.axes[axis]['pos'] + s = self.getAxis(axis) + #p = self.axes[axis]['pos'] if show: s.show() else: