Updates to IsocurveItem, added isocurve example
minor updates for other examples
This commit is contained in:
parent
fffbd5548e
commit
bdb6ff88a2
@ -7,8 +7,6 @@
|
|||||||
## To place a static arrow anywhere in a scene, use ArrowItem.
|
## To place a static arrow anywhere in a scene, use ArrowItem.
|
||||||
## To attach other types of item to a curve, use CurvePoint.
|
## To attach other types of item to a curve, use CurvePoint.
|
||||||
|
|
||||||
|
|
||||||
## Add path to library (just for examples; you do not need this)
|
|
||||||
import initExample ## Add path to library (just for examples; you do not need this)
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
## Add path to library (just for examples; you do not need this)
|
"""
|
||||||
import sys, os, time
|
Tests the speed of image updates for an ImageItem and RawImageWidget.
|
||||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
|
The speed will generally depend on the type of data being shown, whether
|
||||||
|
it is being scaled and/or converted by lookup table, and whether OpenGL
|
||||||
|
is used by the view widget
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import initExample ## Add path to library (just for examples; you do not need this)
|
||||||
|
|
||||||
|
|
||||||
from pyqtgraph.Qt import QtGui, QtCore
|
from pyqtgraph.Qt import QtGui, QtCore
|
||||||
@ -136,6 +141,7 @@ timer.start(0)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Start Qt event loop unless running in interactive mode.
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||||
if sys.flags.interactive != 1:
|
import sys
|
||||||
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||||
app.exec_()
|
app.exec_()
|
||||||
|
@ -12,9 +12,13 @@ examples = OrderedDict([
|
|||||||
('Basic Plotting', 'Plotting.py'),
|
('Basic Plotting', 'Plotting.py'),
|
||||||
('ImageView', 'ImageView.py'),
|
('ImageView', 'ImageView.py'),
|
||||||
('ParameterTree', '../parametertree'),
|
('ParameterTree', '../parametertree'),
|
||||||
|
('Crosshair / Mouse interaction', 'crosshair.py'),
|
||||||
|
('Video speed test', 'VideoSpeedTest.py'),
|
||||||
|
('Plot speed test', 'PlotSpeedTest.py'),
|
||||||
('GraphicsItems', OrderedDict([
|
('GraphicsItems', OrderedDict([
|
||||||
('Scatter Plot', 'ScatterPlot.py'),
|
('Scatter Plot', 'ScatterPlot.py'),
|
||||||
#('PlotItem', 'PlotItem.py'),
|
#('PlotItem', 'PlotItem.py'),
|
||||||
|
('IsocurveItem', 'isocurve.py'),
|
||||||
('ImageItem - video', 'ImageItem.py'),
|
('ImageItem - video', 'ImageItem.py'),
|
||||||
('ImageItem - draw', 'Draw.py'),
|
('ImageItem - draw', 'Draw.py'),
|
||||||
('Region-of-Interest', 'ROItypes.py'),
|
('Region-of-Interest', 'ROItypes.py'),
|
||||||
@ -90,7 +94,10 @@ class ExampleLoader(QtGui.QMainWindow):
|
|||||||
fn = self.currentFile()
|
fn = self.currentFile()
|
||||||
if fn is None:
|
if fn is None:
|
||||||
return
|
return
|
||||||
|
if sys.platform.startswith('win'):
|
||||||
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, '"' + fn + '"')
|
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, '"' + fn + '"')
|
||||||
|
else:
|
||||||
|
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn)
|
||||||
|
|
||||||
|
|
||||||
def showFile(self):
|
def showFile(self):
|
||||||
|
58
examples/isocurve.py
Normal file
58
examples/isocurve.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Tests use of IsoCurve item displayed with image
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
import scipy.ndimage as ndi
|
||||||
|
|
||||||
|
app = QtGui.QApplication([])
|
||||||
|
|
||||||
|
## make pretty looping data
|
||||||
|
frames = 200
|
||||||
|
data = np.random.normal(size=(frames,30,30), loc=0, scale=100)
|
||||||
|
data = np.concatenate([data, data], axis=0)
|
||||||
|
data = ndi.gaussian_filter(data, (10, 10, 10))[frames/2:frames + frames/2]
|
||||||
|
|
||||||
|
win = pg.GraphicsWindow()
|
||||||
|
vb = win.addViewBox()
|
||||||
|
img = pg.ImageItem(data[0])
|
||||||
|
vb.addItem(img)
|
||||||
|
vb.setAspectLocked()
|
||||||
|
|
||||||
|
## generate empty curves
|
||||||
|
curves = []
|
||||||
|
levels = np.linspace(data.min(), data.max(), 10)
|
||||||
|
for i in range(len(levels)):
|
||||||
|
v = levels[i]
|
||||||
|
## generate isocurve with automatic color selection
|
||||||
|
c = pg.IsocurveItem(level=v, pen=(i, len(levels)*1.5))
|
||||||
|
c.setParentItem(img) ## make sure isocurve is always correctly displayed over image
|
||||||
|
c.setZValue(10)
|
||||||
|
curves.append(c)
|
||||||
|
|
||||||
|
## animate!
|
||||||
|
ptr = 0
|
||||||
|
imgLevels = (data.min(), data.max() * 2)
|
||||||
|
def update():
|
||||||
|
global data, curves, img, ptr, imgLevels
|
||||||
|
ptr = (ptr + 1) % data.shape[0]
|
||||||
|
data[ptr]
|
||||||
|
img.setImage(data[ptr], levels=imgLevels)
|
||||||
|
for c in curves:
|
||||||
|
c.setData(data[ptr])
|
||||||
|
|
||||||
|
timer = QtCore.QTimer()
|
||||||
|
timer.timeout.connect(update)
|
||||||
|
timer.start(50)
|
||||||
|
|
||||||
|
## 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_()
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from GraphicsObject import *
|
from GraphicsObject import *
|
||||||
import pyqtgraph.functions as fn
|
import pyqtgraph.functions as fn
|
||||||
from pyqtgraph.Qt import QtGui
|
from pyqtgraph.Qt import QtGui, QtCore
|
||||||
|
|
||||||
|
|
||||||
class IsocurveItem(GraphicsObject):
|
class IsocurveItem(GraphicsObject):
|
||||||
@ -13,26 +13,50 @@ class IsocurveItem(GraphicsObject):
|
|||||||
call isocurve.setParentItem(image)
|
call isocurve.setParentItem(image)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, data, level, pen='w'):
|
def __init__(self, data=None, level=0, pen='w'):
|
||||||
GraphicsObject.__init__(self)
|
GraphicsObject.__init__(self)
|
||||||
|
self.level = 0
|
||||||
lines = fn.isocurve(data, level)
|
self.data = None
|
||||||
|
self.path = None
|
||||||
self.path = QtGui.QPainterPath()
|
self.setData(data, level)
|
||||||
self.setPen(pen)
|
self.setPen(pen)
|
||||||
|
|
||||||
for line in lines:
|
|
||||||
self.path.moveTo(*line[0])
|
def setData(self, data, level=None):
|
||||||
self.path.lineTo(*line[1])
|
if level is None:
|
||||||
|
level = self.level
|
||||||
|
self.level = level
|
||||||
|
self.data = data
|
||||||
|
self.path = None
|
||||||
|
self.prepareGeometryChange()
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def setLevel(self, level):
|
||||||
|
self.level = level
|
||||||
|
self.path = None
|
||||||
|
self.update()
|
||||||
|
|
||||||
def setPen(self, *args, **kwargs):
|
def setPen(self, *args, **kwargs):
|
||||||
self.pen = fn.mkPen(*args, **kwargs)
|
self.pen = fn.mkPen(*args, **kwargs)
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def boundingRect(self):
|
def boundingRect(self):
|
||||||
|
if self.path is None:
|
||||||
|
return QtCore.QRectF()
|
||||||
return self.path.boundingRect()
|
return self.path.boundingRect()
|
||||||
|
|
||||||
|
def generatePath(self):
|
||||||
|
self.path = QtGui.QPainterPath()
|
||||||
|
if self.data is None:
|
||||||
|
return
|
||||||
|
lines = fn.isocurve(self.data, self.level)
|
||||||
|
for line in lines:
|
||||||
|
self.path.moveTo(*line[0])
|
||||||
|
self.path.lineTo(*line[1])
|
||||||
|
|
||||||
def paint(self, p, *args):
|
def paint(self, p, *args):
|
||||||
|
if self.path is None:
|
||||||
|
self.generatePath()
|
||||||
p.setPen(self.pen)
|
p.setPen(self.pen)
|
||||||
p.drawPath(self.path)
|
p.drawPath(self.path)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user