Merge pull request #840 from OE-FET/patch-3
Clipping: don't assume that x-values have uniform spacing
This commit is contained in:
commit
7f327329f4
@ -542,13 +542,26 @@ class PlotDataItem(GraphicsObject):
|
||||
if self.opts['clipToView']:
|
||||
view = self.getViewBox()
|
||||
if view is None or not view.autoRangeEnabled()[0]:
|
||||
# this option presumes that x-values have uniform spacing
|
||||
# this option presumes that x-values are in increasing order
|
||||
range = self.viewRect()
|
||||
if range is not None and len(x) > 1:
|
||||
# clip to visible region extended by downsampling value, assuming
|
||||
# uniform spacing of x-values, has O(1) performance
|
||||
dx = float(x[-1]-x[0]) / (len(x)-1)
|
||||
# clip to visible region extended by downsampling value
|
||||
x0 = np.clip(int((range.left()-x[0])/dx)-1*ds , 0, len(x)-1)
|
||||
x1 = np.clip(int((range.right()-x[0])/dx)+2*ds , 0, len(x)-1)
|
||||
x0 = np.clip(int((range.left()-x[0])/dx) - 1*ds, 0, len(x)-1)
|
||||
x1 = np.clip(int((range.right()-x[0])/dx) + 2*ds, 0, len(x)-1)
|
||||
|
||||
# if data has been clipped too strongly (in case of non-uniform
|
||||
# spacing of x-values), refine the clipping region as required
|
||||
# worst case performance: O(log(n))
|
||||
# best case performance: O(1)
|
||||
if x[x0] > range.left():
|
||||
x0 = np.searchsorted(x, range.left()) - 1*ds
|
||||
x0 = np.clip(x0, a_min=0, a_max=len(x))
|
||||
if x[x1] < range.right():
|
||||
x1 = np.searchsorted(x, range.right()) + 2*ds
|
||||
x1 = np.clip(x1, a_min=0, a_max=len(x))
|
||||
|
||||
x = x[x0:x1]
|
||||
y = y[x0:x1]
|
||||
|
||||
|
@ -64,3 +64,25 @@ def test_clear_in_step_mode():
|
||||
c = pg.PlotDataItem([1,4,2,3], [5,7,6], stepMode=True)
|
||||
w.addItem(c)
|
||||
c.clear()
|
||||
|
||||
def test_clipping():
|
||||
y = np.random.normal(size=150)
|
||||
x = np.exp2(np.linspace(5, 10, 150)) # non-uniform spacing
|
||||
|
||||
w = pg.PlotWidget(autoRange=True, downsample=5)
|
||||
c = pg.PlotDataItem(x, y)
|
||||
w.addItem(c)
|
||||
w.show()
|
||||
|
||||
c.setClipToView(True)
|
||||
|
||||
w.setXRange(200, 600)
|
||||
|
||||
for x_min in range(100, 2**10 - 100, 100):
|
||||
w.setXRange(x_min, x_min + 100)
|
||||
|
||||
xDisp, _ = c.getData()
|
||||
vr = c.viewRect()
|
||||
|
||||
assert xDisp[0] <= vr.left()
|
||||
assert xDisp[-1] >= vr.right()
|
||||
|
Loading…
x
Reference in New Issue
Block a user