HoloView--live data

原文地址HoloView–live data

实时数据

到目前为止,已经演示了HoloViews对象如何包装数据,并提供了丰富、有用的表示。所有可视化都假设数据在内存中已经可用,因此可以使用它来构造适当的对象,并且所有生成的可视化都可以在静态HTML页面中查看,当用户与它们交互时不再需要Python。
在许多重要场景中,数据在内存中立即可用的假设并不成立。感兴趣的数据可能存在于某个远程服务器上,使其在获取之前在本地不可用。在其他情况下,数据可能存在于本地磁盘上,但太大而无法放入内存。也许这些数据甚至还不存在:它可能是一些尚未执行的计算的结果,或者是一些尚未进行相应测量的实际过程的结果。
所有这些场景都是“实时数据”的示例,可以使用适当的Python进程将其提供给HoloViews。在本节中,我们将了解HoloViews如何允许您构建可视化,这些可视化可以动态更新到新的可用数据,并且可以响应实时用户交互。
要处理实时数据,您需要一个实时Python服务器,而不是静态网站,这就是为什么下面显示的输出是GIF动画。如果您自己运行此notebook,您将能够尝试自己的交互,并将其与显示的GIF动画进行比较。

计算过程

当然第一步,还是调包

import holoviews as hv
from holoviews import opts
import numpy as np
hv.extension('bokeh')

有许多可能的实时数据示例,包括金融数据馈送、实时科学测量和复杂的数值模拟。在这里,我们将考虑由两个非常简单的方程跟踪的路径:
x n + 1 = sin ⁡ ( a y n ) + c cos ⁡ ( a x n ) x_{n+1} = \sin(ay_n) + c \cos(ax_n) xn+1=sin(ayn)+ccos(axn)
y n + 1 = sin ⁡ ( b x n ) + d cos ⁡ ( b y n ) y_{n+1} = \sin(bx_n) + d \cos(by_n) yn+1=sin(bxn)+dcos(byn)
这些方程是’Clifford Attractor`Clifford Pickover书中定义的“Clifford吸引子”,下面我们写一个简单的函数来实现这个迭代

def clifford_equation(a,b,c,d,x0,y0):
    xn,yn = x0,y0
    coords = [(x0,y0)]
    for i in range(10000):
        x_n1 = np.sin(a*yn) + c*np.cos(a*xn)
        y_n1 = np.sin(b*xn) + d*np.cos(b*yn)
        xn,yn = x_n1,y_n1
        coords.append((xn,yn))
    return coords```
如果我们现在运行这个函数,我们将得到一个包含10000个元组的列表,这将不会提供太多信息。为了可视化这些数据,我们可以为我们将在笔记本的其余部分中使用的曲线和点元素设置一个合适的视觉默认值:

```python
opts.defaults(
    opts.Curve(color='black'),
    opts.Points(color='red', alpha=0.1, width=400, height=400))

现在,我们可以将“clifford”函数的输出传递给“Points”元素,这样定义一个函数就很容易了,当调用该函数时,我们可以看到:

def clifford_attractor(a,b,c,d):
    return hv.Points(clifford_equation(a,b,c,d,x0=0,y0=0))

然后,我们可以从原点开始查看a、b、c、d值的某些组合的输出:

clifford_attractor(a =-1.5, b=1.5, c=1, d=0.75 )

在这里插入图片描述
HoloViews元素为我们提供了四个选定值的快照,但我们真正想要做的是直接与四维参数空间交互,即使该参数空间太大,无法可行地计算所有可能的组合。简而言之,现在为止我们画的图还是静态的

实时参数的探索

为了动态探索这些参数,我们可以先声明一个“DynamicMap”,传入我们的函数,我们将函数的四个参数声明为“kdims”:
clifford = hv.DynamicMap(clifford_attractor, kdims=[‘a’,‘b’,‘c’,‘d’])
clifford
在这里插入图片描述
正如您从错误消息中看到的,HoloViews还没有提供可视化所需的信息——它无法猜测用于“a”、“b”、“c”和“d”维度的任何值。由于我们知道合适的值是什么样的,因此可以使用redim方法轻松指定合适的范围:

# When run live, this cell's output should match the behavior of the GIF below
clifford.redim.range(a=(-1.5,-1),b=(1.5,2),c=(1,1.2),d=(0.75,0.8), x=(-2,2), y=(-2,2))

在这里插入图片描述这些范围随“redim”一起提供。范围``是每个参数的合适值的语义规范,用于定义上述交互式滑块的合适范围。

实时交互

除了速度和内存使用之外,上面的实时可视化与标准HoloViews可视化没有什么区别。借助实时Python服务器和Bokeh后端,HoloViews还可以使用“DynamicMap”和streams系统构建高度定制的交互显示。HoloViews流只是配置为跟踪某些变量的相应流类的参数,通常反映一些用户交互。例如,让我们编写一个函数,它接受初始“x”和“y”值,并计算上述绘图的更复杂版本,将“x”、“y”起点显示为一个点,以及一段线段,该线段指示计算吸引子时从该点开始的第一步,一些文本以数字形式显示起点:

from holoviews.streams import PointerXY

# When run live, this cell's output should match the behavior of the GIF below
iclifford = hv.DynamicMap(interactive_clifford, kdims=['a','b','c','d'], streams=[PointerXY(x=0,y=0)])
iclifford.redim.range(a=(-1.4,-1),b=(1.6,1.8),c=(1,1.5),d=(0.7,0.8), x=(-2,2), y=(-2,2))

在这里插入图片描述
通过使用鼠标探索,查看是否可以找到位于“x=0.18,y=0.65”的定点位置(下一步将您映射到相同位置),参数为“a=-1.4,b=1.6,c=1”和“d=0.7”。

使用实时数据的权衡

DynamicMap和Streams允许对激动人心的动态可视化进行规范,使您能够用很少的代码构建功能齐全的交互式应用程序和模拟(尤其是与声明性小部件库(如面板)相结合时)。这些动态可视化的工作方式是,HoloViews在浏览器中运行JavaScript,然后与运行在Jupyter笔记本服务器或Bokeh服务器中的Python服务器进程进行通信。这个Python进程可能在您的机器上本地运行,或者在某些远程internet或本地网络服务器上运行。不管它在哪里运行,这个Python进程都会执行您提供给DynamicMap的回调,允许HoloViews在参数更改时更新您的可视化。
该体系结构功能强大且完全通用,因为您始终可以将内存中的静态内容转换为由函数生成的动态输出(有关详细信息,请参阅《用户指南》)。然后可以将这些动态可视化部署为仪表板或Bokeh应用程序。
然而,并不总是建议使用实时数据,因为使用纯静态内容也有一些重要的优势:

使用实时数据的原因

  • 你的数据天生就来自一个实时的来源,你的可视化需要实时反映这一点。
  • 您希望探索一个大的参数空间,并且对该空间进行充分的静态采样在内存或计算时间上是不允许的。
  • 您的数据太大,无法存储在内存中,您只需要浏览其中可以从磁盘流式传输的一部分。
  • 您需要一个无限期更新的开放式可视化。

使用静态数据的原因

  • 您希望以这样一种方式存档或记录您的可视化,即它独立于代码执行而存在于潜在变化的代码库中。
  • 您希望在不需要运行实时服务器的静态HTML文件中共享可视化效果(例如,可以通过电子邮件发送并立即查看或放置在HTML服务器上的文件)。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值