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 <ognyan.moore@gmail.com>
This commit is contained in:
Karl Georg Bedrich 2020-06-01 20:12:52 +02:00 committed by GitHub
parent 68b8dbac1a
commit bb21791c71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 12 deletions

View File

@ -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:

View File

@ -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: