pandas数据帧行对应于卡尔曼滤波器的连续时间样本。我想在流中显示轨迹(真值,测量值和滤波器估计值)。
def show_tracker(index,data=run_tracker()):
i = int(index)
sleep(0.1)
p = \
hv.Scatter(data[0:i], kdims=['x'], vdims=['y'])(style=dict(color='r')) *\
hv.Curve (data[0:i], kdims=['x.true'], vdims=['y.true']) *\
hv.Scatter(data[0:i], kdims=['x.est'], vdims=['y.est'])(style=dict(color='darkgreen')) *\
hv.Curve (data[0:i], kdims=['x.est'], vdims=['y.est'])(style=dict(color='lightgreen'))
return p
%%opts Scatter [width=600,height=280]
ndx=TimeIndex()
hv.DynamicMap(show_tracker, kdims=[], streams=[ndx])
for i in range(N):
ndx.update(index=i)
问题1:轴自动设置为数据的边界。 因此,轨迹更新发生在绘图边界的最边缘。 是否有允许一些污点的设置, 或者我必须在 show_tracker 函数中计算适当的边界?
问题2:散景后端; 我可以缩放和平移,但是 "复位"导致数据集丢失。我该如何解决?
问题3: show_tracker 的默认数据参数 要求重新执行该函数以生成新的数据帧。 有没有一种简单的方法可以解决这个问题?
答案 0 :(得分:0)
问题1
这是下周发布的1.7版本的最后一个未解决问题之一,跟踪this issue有关更新。但是,我们刚刚更改了DynamicMap上范围的更新方式,如果要更新范围,请务必在其中一个显示的对象上设置%%opts Scatter {+framewise}
或norm=dict(framewise=True)
,因为您已经在做对于样式选项。
第2期
这是散景中重置工具的一个令人遗憾的缺点,您可以跟踪this issue以获取更新。
问题3:
这取决于您正在做什么,数据是否已经生成,或者您是在动态更新数据?如果只需要在函数外创建数据就必须生成数据,这意味着它将在范围内:
data = run_tracker()
def show_tracker(index):
i = int(index)
sleep(0.1)
...
return p
如果您确实想要动态生成新数据,最简单的方法是编写一个小类来跟踪状态。您甚至可以将该类设为Stream,这样您就不必单独定义它。这可能是这样的:
class KalmanTracker(hv.streams.Stream):
index = param.Integer(default=1)
def __init__(self, **params):
# Initializes empty data and parameters
self.data = None
super(KalmanTracker, self).__init__(**params)
def update_data(self, index):
# Update self.data here
def get_view(self, index):
# Update index exceeds data length and
# create a holoviews view of the data
if self.data is None or len(self.data) < index:
self.update_data(index)
data = self.data[:index]
....
return hv_obj
def show(self):
# Create DynamicMap to display and
# pass in self as the Stream
return hv.DynamicMap(self.get_view, kdims=[],
streams=[self])
tracker = KalmanTracker()
tracker.show()
# Should update data and plot
tracker.update(index=10)
完成后,您还可以使用paramnb库从此类生成小部件。你只需这样做:
tracker = KalmanTracker()
paramnb.Widgets(tracker, callback=tracker.update)
tracker.show()