Added a few new examples
This commit is contained in:
parent
193367a56b
commit
dc1af8946e
41
examples/BarGraphItem.py
Normal file
41
examples/BarGraphItem.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Simple example using BarGraphItem
|
||||||
|
"""
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
import pyqtgraph as pg
|
||||||
|
from pyqtgraph.Qt import QtCore, QtGui
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
win = pg.plot()
|
||||||
|
win.setWindowTitle('pyqtgraph example: BarGraphItem')
|
||||||
|
|
||||||
|
x = np.arange(10)
|
||||||
|
y1 = np.sin(x)
|
||||||
|
y2 = 1.1 * np.sin(x+1)
|
||||||
|
y3 = 1.2 * np.sin(x+2)
|
||||||
|
|
||||||
|
bg1 = pg.BarGraphItem(x=x, height=y1, width=0.3, brush='r')
|
||||||
|
bg2 = pg.BarGraphItem(x=x+0.33, height=y2, width=0.3, brush='g')
|
||||||
|
bg3 = pg.BarGraphItem(x=x+0.66, height=y3, width=0.3, brush='b')
|
||||||
|
|
||||||
|
win.addItem(bg1)
|
||||||
|
win.addItem(bg2)
|
||||||
|
win.addItem(bg3)
|
||||||
|
|
||||||
|
|
||||||
|
# Final example shows how to handle mouse clicks:
|
||||||
|
class BarGraph(pg.BarGraphItem):
|
||||||
|
def mouseClickEvent(self, event):
|
||||||
|
print "clicked"
|
||||||
|
|
||||||
|
|
||||||
|
bg = BarGraph(x=x, y=y1*0.3+2, height=0.4+y1*0.2, width=0.8)
|
||||||
|
win.addItem(bg)
|
||||||
|
|
||||||
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
|
QtGui.QApplication.instance().exec_()
|
136
examples/CustomGraphItem.py
Normal file
136
examples/CustomGraphItem.py
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Simple example of subclassing GraphItem.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
import pyqtgraph as pg
|
||||||
|
from pyqtgraph.Qt import QtCore, QtGui
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
# Enable antialiasing for prettier plots
|
||||||
|
pg.setConfigOptions(antialias=True)
|
||||||
|
|
||||||
|
w = pg.GraphicsWindow()
|
||||||
|
w.setWindowTitle('pyqtgraph example: CustomGraphItem')
|
||||||
|
v = w.addViewBox()
|
||||||
|
v.setAspectLocked()
|
||||||
|
|
||||||
|
class Graph(pg.GraphItem):
|
||||||
|
def __init__(self):
|
||||||
|
self.dragPoint = None
|
||||||
|
self.dragOffset = None
|
||||||
|
self.textItems = []
|
||||||
|
pg.GraphItem.__init__(self)
|
||||||
|
self.scatter.sigClicked.connect(self.clicked)
|
||||||
|
|
||||||
|
def setData(self, **kwds):
|
||||||
|
self.text = kwds.pop('text', [])
|
||||||
|
self.data = kwds
|
||||||
|
if 'pos' in self.data:
|
||||||
|
npts = self.data['pos'].shape[0]
|
||||||
|
self.data['data'] = np.empty(npts, dtype=[('index', int)])
|
||||||
|
self.data['data']['index'] = np.arange(npts)
|
||||||
|
self.setTexts(self.text)
|
||||||
|
self.updateGraph()
|
||||||
|
|
||||||
|
def setTexts(self, text):
|
||||||
|
for i in self.textItems:
|
||||||
|
i.scene().removeItem(i)
|
||||||
|
self.textItems = []
|
||||||
|
for t in text:
|
||||||
|
item = pg.TextItem(t)
|
||||||
|
self.textItems.append(item)
|
||||||
|
item.setParentItem(self)
|
||||||
|
|
||||||
|
def updateGraph(self):
|
||||||
|
pg.GraphItem.setData(self, **self.data)
|
||||||
|
for i,item in enumerate(self.textItems):
|
||||||
|
item.setPos(*self.data['pos'][i])
|
||||||
|
|
||||||
|
|
||||||
|
def mouseDragEvent(self, ev):
|
||||||
|
if ev.button() != QtCore.Qt.LeftButton:
|
||||||
|
ev.ignore()
|
||||||
|
return
|
||||||
|
|
||||||
|
if ev.isStart():
|
||||||
|
# We are already one step into the drag.
|
||||||
|
# Find the point(s) at the mouse cursor when the button was first
|
||||||
|
# pressed:
|
||||||
|
pos = ev.buttonDownPos()
|
||||||
|
pts = self.scatter.pointsAt(pos)
|
||||||
|
if len(pts) == 0:
|
||||||
|
ev.ignore()
|
||||||
|
return
|
||||||
|
self.dragPoint = pts[0]
|
||||||
|
ind = pts[0].data()[0]
|
||||||
|
self.dragOffset = self.data['pos'][ind] - pos
|
||||||
|
elif ev.isFinish():
|
||||||
|
self.dragPoint = None
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if self.dragPoint is None:
|
||||||
|
ev.ignore()
|
||||||
|
return
|
||||||
|
|
||||||
|
ind = self.dragPoint.data()[0]
|
||||||
|
self.data['pos'][ind] = ev.pos() + self.dragOffset
|
||||||
|
self.updateGraph()
|
||||||
|
ev.accept()
|
||||||
|
|
||||||
|
def clicked(self, pts):
|
||||||
|
print("clicked: %s" % pts)
|
||||||
|
|
||||||
|
|
||||||
|
g = Graph()
|
||||||
|
v.addItem(g)
|
||||||
|
|
||||||
|
## Define positions of nodes
|
||||||
|
pos = np.array([
|
||||||
|
[0,0],
|
||||||
|
[10,0],
|
||||||
|
[0,10],
|
||||||
|
[10,10],
|
||||||
|
[5,5],
|
||||||
|
[15,5]
|
||||||
|
], dtype=float)
|
||||||
|
|
||||||
|
## Define the set of connections in the graph
|
||||||
|
adj = np.array([
|
||||||
|
[0,1],
|
||||||
|
[1,3],
|
||||||
|
[3,2],
|
||||||
|
[2,0],
|
||||||
|
[1,5],
|
||||||
|
[3,5],
|
||||||
|
])
|
||||||
|
|
||||||
|
## Define the symbol to use for each node (this is optional)
|
||||||
|
symbols = ['o','o','o','o','t','+']
|
||||||
|
|
||||||
|
## Define the line style for each connection (this is optional)
|
||||||
|
lines = np.array([
|
||||||
|
(255,0,0,255,1),
|
||||||
|
(255,0,255,255,2),
|
||||||
|
(255,0,255,255,3),
|
||||||
|
(255,255,0,255,2),
|
||||||
|
(255,0,0,255,1),
|
||||||
|
(255,255,255,255,4),
|
||||||
|
], dtype=[('red',np.ubyte),('green',np.ubyte),('blue',np.ubyte),('alpha',np.ubyte),('width',float)])
|
||||||
|
|
||||||
|
## Define text to show next to each symbol
|
||||||
|
texts = ["Point %d" % i for i in range(6)]
|
||||||
|
|
||||||
|
## Update the graph
|
||||||
|
g.setData(pos=pos, adj=adj, pen=lines, size=1, symbol=symbols, pxMode=False, text=texts)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
|
QtGui.QApplication.instance().exec_()
|
50
examples/FillBetweenItem.py
Normal file
50
examples/FillBetweenItem.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Demonstrates use of FillBetweenItem to fill the space between two plot curves.
|
||||||
|
"""
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
import pyqtgraph as pg
|
||||||
|
from pyqtgraph.Qt import QtGui, QtCore
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
win = pg.plot()
|
||||||
|
win.setWindowTitle('pyqtgraph example: FillBetweenItem')
|
||||||
|
win.setXRange(-10, 10)
|
||||||
|
win.setYRange(-10, 10)
|
||||||
|
|
||||||
|
N = 200
|
||||||
|
x = np.linspace(-10, 10, N)
|
||||||
|
gauss = np.exp(-x**2 / 20.)
|
||||||
|
mn = mx = np.zeros(len(x))
|
||||||
|
curves = [win.plot(x=x, y=np.zeros(len(x)), pen='k') for i in range(4)]
|
||||||
|
brushes = [0.5, (100, 100, 255), 0.5]
|
||||||
|
fills = [pg.FillBetweenItem(curves[i], curves[i+1], brushes[i]) for i in range(3)]
|
||||||
|
for f in fills:
|
||||||
|
win.addItem(f)
|
||||||
|
|
||||||
|
def update():
|
||||||
|
global mx, mn, curves, gauss, x
|
||||||
|
a = 5 / abs(np.random.normal(loc=1, scale=0.2))
|
||||||
|
y1 = -np.abs(a*gauss + np.random.normal(size=len(x)))
|
||||||
|
y2 = np.abs(a*gauss + np.random.normal(size=len(x)))
|
||||||
|
|
||||||
|
s = 0.01
|
||||||
|
mn = np.where(y1<mn, y1, mn) * (1-s) + y1 * s
|
||||||
|
mx = np.where(y2>mx, y2, mx) * (1-s) + y2 * s
|
||||||
|
curves[0].setData(x, mn)
|
||||||
|
curves[1].setData(x, y1)
|
||||||
|
curves[2].setData(x, y2)
|
||||||
|
curves[3].setData(x, mx)
|
||||||
|
|
||||||
|
|
||||||
|
timer = QtCore.QTimer()
|
||||||
|
timer.timeout.connect(update)
|
||||||
|
timer.start(30)
|
||||||
|
|
||||||
|
|
||||||
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
|
QtGui.QApplication.instance().exec_()
|
90
examples/ViewBoxFeatures.py
Normal file
90
examples/ViewBoxFeatures.py
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
ViewBox is the general-purpose graphical container that allows the user to
|
||||||
|
zoom / pan to inspect any area of a 2D coordinate system.
|
||||||
|
|
||||||
|
This example demonstrates many of the features ViewBox provides.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
import pyqtgraph as pg
|
||||||
|
from pyqtgraph.Qt import QtCore, QtGui
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
x = np.arange(1000, dtype=float)
|
||||||
|
y = np.random.normal(size=1000)
|
||||||
|
y += 5 * np.sin(x/100)
|
||||||
|
|
||||||
|
win = pg.GraphicsWindow()
|
||||||
|
win.setWindowTitle('pyqtgraph example: ____')
|
||||||
|
win.resize(1000, 800)
|
||||||
|
win.ci.setBorder((50, 50, 100))
|
||||||
|
|
||||||
|
sub1 = win.addLayout()
|
||||||
|
sub1.addLabel("<b>Standard mouse interaction:</b><br>left-drag to pan, right-drag to zoom.")
|
||||||
|
sub1.nextRow()
|
||||||
|
v1 = sub1.addViewBox()
|
||||||
|
l1 = pg.PlotDataItem(y)
|
||||||
|
v1.addItem(l1)
|
||||||
|
|
||||||
|
|
||||||
|
sub2 = win.addLayout()
|
||||||
|
sub2.addLabel("<b>One-button mouse interaction:</b><br>left-drag zoom to box, wheel to zoom out.")
|
||||||
|
sub2.nextRow()
|
||||||
|
v2 = sub2.addViewBox()
|
||||||
|
v2.setMouseMode(v2.RectMode)
|
||||||
|
l2 = pg.PlotDataItem(y)
|
||||||
|
v2.addItem(l2)
|
||||||
|
|
||||||
|
win.nextRow()
|
||||||
|
|
||||||
|
sub3 = win.addLayout()
|
||||||
|
sub3.addLabel("<b>Locked aspect ratio when zooming.</b>")
|
||||||
|
sub3.nextRow()
|
||||||
|
v3 = sub3.addViewBox()
|
||||||
|
v3.setAspectLocked(1.0)
|
||||||
|
l3 = pg.PlotDataItem(y)
|
||||||
|
v3.addItem(l3)
|
||||||
|
|
||||||
|
sub4 = win.addLayout()
|
||||||
|
sub4.addLabel("<b>View limits:</b><br>prevent panning or zooming past limits.")
|
||||||
|
sub4.nextRow()
|
||||||
|
v4 = sub4.addViewBox()
|
||||||
|
v4.setLimits(xMin=-100, xMax=1100,
|
||||||
|
minXRange=20, maxXRange=500,
|
||||||
|
yMin=-10, yMax=10,
|
||||||
|
minYRange=1, maxYRange=10)
|
||||||
|
l4 = pg.PlotDataItem(y)
|
||||||
|
v4.addItem(l4)
|
||||||
|
|
||||||
|
win.nextRow()
|
||||||
|
|
||||||
|
sub5 = win.addLayout()
|
||||||
|
sub5.addLabel("<b>Linked axes:</b> Data in this plot is always X-aligned to<br>the plot above.")
|
||||||
|
sub5.nextRow()
|
||||||
|
v5 = sub5.addViewBox()
|
||||||
|
v5.setXLink(v3)
|
||||||
|
l5 = pg.PlotDataItem(y)
|
||||||
|
v5.addItem(l5)
|
||||||
|
|
||||||
|
sub6 = win.addLayout()
|
||||||
|
sub6.addLabel("<b>Disable mouse:</b> Per-axis control over mouse input.<br>"
|
||||||
|
"<b>Auto-scale-visible:</b> Automatically fit *visible* data within view<br>"
|
||||||
|
"(try panning left-right).")
|
||||||
|
sub6.nextRow()
|
||||||
|
v6 = sub6.addViewBox()
|
||||||
|
v6.setMouseEnabled(x=True, y=False)
|
||||||
|
v6.enableAutoRange(x=False, y=True)
|
||||||
|
v6.setXRange(300, 450)
|
||||||
|
v6.setAutoVisible(x=False, y=True)
|
||||||
|
l6 = pg.PlotDataItem(y)
|
||||||
|
v6.addItem(l6)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
|
QtGui.QApplication.instance().exec_()
|
Loading…
Reference in New Issue
Block a user