新手:来自熊猫的holoviews曲线跟进:流的问题

时间:2017-04-08 23:46:16

标签: pandas stream holoviews

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 的默认数据参数 要求重新执行该函数以生成新的数据帧。 有没有一种简单的方法可以解决这个问题?

1 个答案:

答案 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()