Bugfixes and example for view linking
This commit is contained in:
parent
97740c2376
commit
7c94b5a702
@ -19,6 +19,7 @@ examples = OrderedDict([
|
|||||||
('Scatter Plot', 'ScatterPlot.py'),
|
('Scatter Plot', 'ScatterPlot.py'),
|
||||||
('Text Item', 'text.py'),
|
('Text Item', 'text.py'),
|
||||||
('ViewBox', 'ViewBox.py'),
|
('ViewBox', 'ViewBox.py'),
|
||||||
|
('Linked Views', 'linkedViews.py'),
|
||||||
('Arrow', 'Arrow.py'),
|
('Arrow', 'Arrow.py'),
|
||||||
])),
|
])),
|
||||||
('Widgets', OrderedDict([
|
('Widgets', OrderedDict([
|
||||||
|
48
examples/linkedViews.py
Normal file
48
examples/linkedViews.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
## This example demonstrates the ability to link the axes of views together
|
||||||
|
## Views can be linked manually using the context menu, but only if they are given names.
|
||||||
|
|
||||||
|
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
|
||||||
|
from pyqtgraph.Qt import QtGui, QtCore
|
||||||
|
import numpy as np
|
||||||
|
import pyqtgraph as pg
|
||||||
|
|
||||||
|
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||||
|
app = QtGui.QApplication([])
|
||||||
|
#mw = QtGui.QMainWindow()
|
||||||
|
#mw.resize(800,800)
|
||||||
|
|
||||||
|
x = np.linspace(-50, 50, 1000)
|
||||||
|
y = np.sin(x) / x
|
||||||
|
|
||||||
|
win = pg.GraphicsWindow(title="View Linking Examples")
|
||||||
|
win.resize(800,600)
|
||||||
|
|
||||||
|
win.addLabel("Views linked at runtime:", colspan=2)
|
||||||
|
win.nextRow()
|
||||||
|
|
||||||
|
p1 = win.addPlot(x=x, y=y, name="Plot1", title="Plot1")
|
||||||
|
p2 = win.addPlot(x=x, y=y, name="Plot2", title="Plot2 - Y linked with Plot1")
|
||||||
|
p2.setLabel('bottom', "Label to test offset")
|
||||||
|
p2.setYLink(p1)
|
||||||
|
|
||||||
|
win.nextRow()
|
||||||
|
|
||||||
|
p3 = win.addPlot(x=x, y=y, name="Plot3", title="Plot3 - X linked with Plot1")
|
||||||
|
p4 = win.addPlot(x=x, y=y, name="Plot4", title="Plot4 - X and Y linked with Plot1")
|
||||||
|
p3.setLabel('left', "Label to test offset")
|
||||||
|
QtGui.QApplication.processEvents()
|
||||||
|
p3.setXLink(p1)
|
||||||
|
p4.setXLink(p1)
|
||||||
|
p4.setYLink(p1)
|
||||||
|
|
||||||
|
|
||||||
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
|
app.exec_()
|
||||||
|
|
@ -33,7 +33,6 @@ class GraphicsLayout(GraphicsWidget):
|
|||||||
return self.currentCol-colspan
|
return self.currentCol-colspan
|
||||||
|
|
||||||
def addPlot(self, row=None, col=None, rowspan=1, colspan=1, **kargs):
|
def addPlot(self, row=None, col=None, rowspan=1, colspan=1, **kargs):
|
||||||
from PlotItem import PlotItem
|
|
||||||
plot = PlotItem(**kargs)
|
plot = PlotItem(**kargs)
|
||||||
self.addItem(plot, row, col, rowspan, colspan)
|
self.addItem(plot, row, col, rowspan, colspan)
|
||||||
return plot
|
return plot
|
||||||
@ -43,6 +42,11 @@ class GraphicsLayout(GraphicsWidget):
|
|||||||
self.addItem(vb, row, col, rowspan, colspan)
|
self.addItem(vb, row, col, rowspan, colspan)
|
||||||
return vb
|
return vb
|
||||||
|
|
||||||
|
def addLabel(self, text, row=None, col=None, rowspan=1, colspan=1, **kargs):
|
||||||
|
text = LabelItem(text, **kargs)
|
||||||
|
self.addItem(text, row, col, rowspan, colspan)
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
def addItem(self, item, row=None, col=None, rowspan=1, colspan=1):
|
def addItem(self, item, row=None, col=None, rowspan=1, colspan=1):
|
||||||
if row is None:
|
if row is None:
|
||||||
@ -95,3 +99,4 @@ class GraphicsLayout(GraphicsWidget):
|
|||||||
## Must be imported at the end to avoid cyclic-dependency hell:
|
## Must be imported at the end to avoid cyclic-dependency hell:
|
||||||
from ViewBox import ViewBox
|
from ViewBox import ViewBox
|
||||||
from PlotItem import PlotItem
|
from PlotItem import PlotItem
|
||||||
|
from LabelItem import LabelItem
|
@ -10,12 +10,11 @@ class LabelItem(GraphicsWidget):
|
|||||||
GraphicsWidget displaying text.
|
GraphicsWidget displaying text.
|
||||||
Used mainly as axis labels, titles, etc.
|
Used mainly as axis labels, titles, etc.
|
||||||
|
|
||||||
Note: To display text inside a scaled view (ViewBox, PlotWidget, etc) use QGraphicsTextItem
|
Note: To display text inside a scaled view (ViewBox, PlotWidget, etc) use TextItem
|
||||||
with the flag ItemIgnoresTransformations set.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, text, parent=None, **args):
|
def __init__(self, text, parent=None, angle=0, **args):
|
||||||
GraphicsWidget.__init__(self, parent)
|
GraphicsWidget.__init__(self, parent)
|
||||||
self.item = QtGui.QGraphicsTextItem(self)
|
self.item = QtGui.QGraphicsTextItem(self)
|
||||||
self.opts = args
|
self.opts = args
|
||||||
@ -26,6 +25,7 @@ class LabelItem(GraphicsWidget):
|
|||||||
self.opts['color'] = fn.colorStr(args['color'])[:6]
|
self.opts['color'] = fn.colorStr(args['color'])[:6]
|
||||||
self.sizeHint = {}
|
self.sizeHint = {}
|
||||||
self.setText(text)
|
self.setText(text)
|
||||||
|
self.setAngle(angle)
|
||||||
|
|
||||||
|
|
||||||
def setAttr(self, attr, value):
|
def setAttr(self, attr, value):
|
||||||
|
@ -480,11 +480,13 @@ class ViewBox(GraphicsWidget):
|
|||||||
self.linksBlocked = b ## prevents recursive plot-change propagation
|
self.linksBlocked = b ## prevents recursive plot-change propagation
|
||||||
|
|
||||||
def linkedXChanged(self):
|
def linkedXChanged(self):
|
||||||
|
## called when x range of linked view has changed
|
||||||
view = self.state['linkedViews'][0]
|
view = self.state['linkedViews'][0]
|
||||||
self.linkedViewChanged(view, ViewBox.XAxis)
|
self.linkedViewChanged(view, ViewBox.XAxis)
|
||||||
|
|
||||||
def linkedYChanged(self):
|
def linkedYChanged(self):
|
||||||
view = self.state['linkedViews'][0]
|
## called when y range of linked view has changed
|
||||||
|
view = self.state['linkedViews'][1]
|
||||||
self.linkedViewChanged(view, ViewBox.YAxis)
|
self.linkedViewChanged(view, ViewBox.YAxis)
|
||||||
|
|
||||||
|
|
||||||
@ -502,15 +504,27 @@ class ViewBox(GraphicsWidget):
|
|||||||
view.blockLink(True)
|
view.blockLink(True)
|
||||||
try:
|
try:
|
||||||
if axis == ViewBox.XAxis:
|
if axis == ViewBox.XAxis:
|
||||||
upp = float(vr.width()) / vg.width()
|
overlap = min(sg.right(), vg.right()) - max(sg.left(), vg.left())
|
||||||
x1 = vr.left() + (sg.x()-vg.x()) * upp
|
if overlap < min(vg.width()/3, sg.width()/3): ## if less than 1/3 of views overlap,
|
||||||
x2 = x1 + sg.width() * upp
|
## then just replicate the view
|
||||||
|
x1 = vr.left()
|
||||||
|
x2 = vr.right()
|
||||||
|
else: ## views overlap; line them up
|
||||||
|
upp = float(vr.width()) / vg.width()
|
||||||
|
x1 = vr.left() + (sg.x()-vg.x()) * upp
|
||||||
|
x2 = x1 + sg.width() * upp
|
||||||
self.enableAutoRange(ViewBox.XAxis, False)
|
self.enableAutoRange(ViewBox.XAxis, False)
|
||||||
self.setXRange(x1, x2, padding=0)
|
self.setXRange(x1, x2, padding=0)
|
||||||
else:
|
else:
|
||||||
upp = float(vr.height()) / vg.height()
|
overlap = min(sg.bottom(), vg.bottom()) - max(sg.top(), vg.top())
|
||||||
x1 = vr.bottom() + (sg.y()-vg.y()) * upp
|
if overlap < min(vg.height()/3, sg.height()/3): ## if less than 1/3 of views overlap,
|
||||||
x2 = x1 + sg.height() * upp
|
## then just replicate the view
|
||||||
|
x1 = vr.top()
|
||||||
|
x2 = vr.bottom()
|
||||||
|
else: ## views overlap; line them up
|
||||||
|
upp = float(vr.height()) / vg.height()
|
||||||
|
x1 = vr.top() + (sg.y()-vg.y()) * upp
|
||||||
|
x2 = x1 + sg.height() * upp
|
||||||
self.enableAutoRange(ViewBox.YAxis, False)
|
self.enableAutoRange(ViewBox.YAxis, False)
|
||||||
self.setYRange(x1, x2, padding=0)
|
self.setYRange(x1, x2, padding=0)
|
||||||
finally:
|
finally:
|
||||||
|
@ -7,6 +7,6 @@ class GraphicsLayoutWidget(GraphicsView):
|
|||||||
def __init__(self, parent=None, **kargs):
|
def __init__(self, parent=None, **kargs):
|
||||||
GraphicsView.__init__(self, parent)
|
GraphicsView.__init__(self, parent)
|
||||||
self.ci = GraphicsLayout(**kargs)
|
self.ci = GraphicsLayout(**kargs)
|
||||||
for n in ['nextRow', 'nextCol', 'addPlot', 'addViewBox', 'addItem', 'getItem']:
|
for n in ['nextRow', 'nextCol', 'addPlot', 'addViewBox', 'addItem', 'getItem', 'addLabel']:
|
||||||
setattr(self, n, getattr(self.ci, n))
|
setattr(self, n, getattr(self.ci, n))
|
||||||
self.setCentralItem(self.ci)
|
self.setCentralItem(self.ci)
|
||||||
|
Loading…
Reference in New Issue
Block a user