Add detailed comments, comment out fill mode
parent
4f899edcef
commit
18859e1b8c
|
@ -40,7 +40,8 @@ def step_path_arrays_from_1d(
|
||||||
include_endpoints: bool = False,
|
include_endpoints: bool = False,
|
||||||
|
|
||||||
) -> (np.ndarray, np.ndarray):
|
) -> (np.ndarray, np.ndarray):
|
||||||
'''Generate a "step mode" curve aligned with OHLC style bars
|
'''
|
||||||
|
Generate a "step mode" curve aligned with OHLC style bars
|
||||||
such that each segment spans each bar (aka "centered" style).
|
such that each segment spans each bar (aka "centered" style).
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -86,6 +87,18 @@ def step_path_arrays_from_1d(
|
||||||
|
|
||||||
# TODO: got a feeling that dropping this inheritance gets us even more speedups
|
# TODO: got a feeling that dropping this inheritance gets us even more speedups
|
||||||
class FastAppendCurve(pg.PlotCurveItem):
|
class FastAppendCurve(pg.PlotCurveItem):
|
||||||
|
'''
|
||||||
|
A faster, append friendly version of ``pyqtgraph.PlotCurveItem``
|
||||||
|
built for real-time data updates.
|
||||||
|
|
||||||
|
The main difference is avoiding regeneration of the entire
|
||||||
|
historical path where possible and instead only updating the "new"
|
||||||
|
segment(s) via a ``numpy`` array diff calc. Further the "last"
|
||||||
|
graphic segment is drawn independently such that near-term (high
|
||||||
|
frequency) discrete-time-sampled style updates don't trigger a full
|
||||||
|
path redraw.
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
@ -115,7 +128,7 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
# flat-top style histogram-like discrete curve
|
# flat-top style histogram-like discrete curve
|
||||||
self._step_mode: bool = step_mode
|
self._step_mode: bool = step_mode
|
||||||
|
|
||||||
self._fill = False
|
# self._fill = True
|
||||||
self.setBrush(hcolor(fill_color or color))
|
self.setBrush(hcolor(fill_color or color))
|
||||||
|
|
||||||
# TODO: one question still remaining is if this makes trasform
|
# TODO: one question still remaining is if this makes trasform
|
||||||
|
@ -134,8 +147,8 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
profiler = pg.debug.Profiler(disabled=not pg_profile_enabled())
|
profiler = pg.debug.Profiler(disabled=not pg_profile_enabled())
|
||||||
flip_cache = False
|
flip_cache = False
|
||||||
|
|
||||||
# print(f"xrange: {self._xrange}")
|
|
||||||
istart, istop = self._xrange
|
istart, istop = self._xrange
|
||||||
|
# print(f"xrange: {self._xrange}")
|
||||||
|
|
||||||
# compute the length diffs between the first/last index entry in
|
# compute the length diffs between the first/last index entry in
|
||||||
# the input data and the last indexes we have on record from the
|
# the input data and the last indexes we have on record from the
|
||||||
|
@ -164,7 +177,8 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
# if self._step_mode:
|
# if self._step_mode:
|
||||||
# self.path.closeSubpath()
|
# self.path.closeSubpath()
|
||||||
|
|
||||||
# TODO: get this working - right now it's giving heck on vwap...
|
# TODO: get this piecewise prepend working - right now it's
|
||||||
|
# giving heck on vwap...
|
||||||
# if prepend_length:
|
# if prepend_length:
|
||||||
# breakpoint()
|
# breakpoint()
|
||||||
|
|
||||||
|
@ -186,6 +200,10 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
x[-append_length - 2:-1],
|
x[-append_length - 2:-1],
|
||||||
y[-append_length - 2:-1],
|
y[-append_length - 2:-1],
|
||||||
)
|
)
|
||||||
|
# [1:] since we don't need the vertical line normally at
|
||||||
|
# the beginning of the step curve taking the first (x,
|
||||||
|
# y) poing down to the x-axis **because** this is an
|
||||||
|
# appended path graphic.
|
||||||
new_x = new_x[1:]
|
new_x = new_x[1:]
|
||||||
new_y = new_y[1:]
|
new_y = new_y[1:]
|
||||||
|
|
||||||
|
@ -207,15 +225,20 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
# other merging ideas:
|
# other merging ideas:
|
||||||
# https://stackoverflow.com/questions/8936225/how-to-merge-qpainterpaths
|
# https://stackoverflow.com/questions/8936225/how-to-merge-qpainterpaths
|
||||||
if self._step_mode:
|
if self._step_mode:
|
||||||
if self._fill:
|
|
||||||
# XXX: super slow set "union" op
|
|
||||||
self.path = self.path.united(append_path).simplified()
|
|
||||||
|
|
||||||
# path.addPath(append_path)
|
|
||||||
# path.closeSubpath()
|
|
||||||
else:
|
|
||||||
# path.addPath(append_path)
|
# path.addPath(append_path)
|
||||||
self.path.connectPath(append_path)
|
self.path.connectPath(append_path)
|
||||||
|
|
||||||
|
# TODO: try out new work from `pyqtgraph` main which
|
||||||
|
# should repair horrid perf:
|
||||||
|
# https://github.com/pyqtgraph/pyqtgraph/pull/2032
|
||||||
|
# ok, nope still horrible XD
|
||||||
|
# if self._fill:
|
||||||
|
# # XXX: super slow set "union" op
|
||||||
|
# self.path = self.path.united(append_path).simplified()
|
||||||
|
|
||||||
|
# # path.addPath(append_path)
|
||||||
|
# # path.closeSubpath()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# print(f"append_path br: {append_path.boundingRect()}")
|
# print(f"append_path br: {append_path.boundingRect()}")
|
||||||
# self.path.moveTo(new_x[0], new_y[0])
|
# self.path.moveTo(new_x[0], new_y[0])
|
||||||
|
@ -238,6 +261,8 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
x0, x_last = self._xrange = x[0], x[-1]
|
x0, x_last = self._xrange = x[0], x[-1]
|
||||||
y_last = y[-1]
|
y_last = y[-1]
|
||||||
|
|
||||||
|
# draw the "current" step graphic segment so it lines up with
|
||||||
|
# the "middle" of the current (OHLC) sample.
|
||||||
if self._step_mode:
|
if self._step_mode:
|
||||||
self._last_line = QLineF(
|
self._last_line = QLineF(
|
||||||
x_last - 0.5, 0,
|
x_last - 0.5, 0,
|
||||||
|
@ -259,6 +284,7 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
if flip_cache:
|
if flip_cache:
|
||||||
|
# XXX: seems to be needed to avoid artifacts (see above).
|
||||||
self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
|
self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
|
||||||
|
|
||||||
def boundingRect(self):
|
def boundingRect(self):
|
||||||
|
@ -310,7 +336,6 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
p.fillRect(self._last_step_rect, brush)
|
p.fillRect(self._last_step_rect, brush)
|
||||||
|
|
||||||
# p.drawPath(self.path)
|
# p.drawPath(self.path)
|
||||||
|
|
||||||
# profiler('.drawPath()')
|
# profiler('.drawPath()')
|
||||||
|
|
||||||
# else:
|
# else:
|
||||||
|
@ -322,6 +347,9 @@ class FastAppendCurve(pg.PlotCurveItem):
|
||||||
p.drawPath(self.path)
|
p.drawPath(self.path)
|
||||||
profiler('.drawPath()')
|
profiler('.drawPath()')
|
||||||
|
|
||||||
if self._fill:
|
# TODO: try out new work from `pyqtgraph` main which
|
||||||
print('FILLED')
|
# should repair horrid perf:
|
||||||
p.fillPath(self.path, brush)
|
# https://github.com/pyqtgraph/pyqtgraph/pull/2032
|
||||||
|
# if self._fill:
|
||||||
|
# brush = self.opts['brush']
|
||||||
|
# p.fillPath(self.path, brush)
|
||||||
|
|
Loading…
Reference in New Issue