Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在bokeh服务器应用程序中绘制多行流数据

在bokeh服务器应用程序中绘制多行流数据
EN

Stack Overflow用户
提问于 2020-04-18 22:40:14
回答 2查看 555关注 0票数 1

我正在尝试构建一个具有流数据的bokeh应用程序,该应用程序跟踪多个“策略”,因为它们是在基于囚徒困境代理的模型中生成的。我遇到了一个问题,试图让我的线状图不在一条线上连接所有的数据点。我把这个小演示脚本放在一起,复制了这个问题。我已经阅读了很多关于bokeh plots中的在线和multi_line渲染的文档,但我就是找不到与我的简单情况相匹配的东西。您可以运行此代码&它将自动打开一个位于localhost:5004的bokeh服务器...

代码语言:javascript
运行
AI代码解释
复制
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models import Button
from bokeh.layouts import column  
import random

def make_document(doc):

    # Create a data source
    data_source = ColumnDataSource({'step': [], 'strategy': [], 'ncount': []})

    # make a list of groups
    strategies = ['DD', 'DC', 'CD', 'CCDD']

    # Create a figure
    fig = figure(title='Streaming Line Plot',
                 plot_width=800, plot_height=400)
    fig.line(x='step', y='ncount', source=data_source)
    global step
    step = 0

    def button1_run():
        global callback_obj
        if button1.label == 'Run':
            button1.label = 'Stop'
            button1.button_type='danger'
            callback_obj = doc.add_periodic_callback(button2_step, 100)
        else:
            button1.label = 'Run'
            button1.button_type = 'success'
            doc.remove_periodic_callback(callback_obj)

    def button2_step():
        global step
        step = step+1
        for i in range(len(strategies)):
            new = {'step': [step],
                   'strategy': [strategies[i]],
                   'ncount': [random.choice(range(1,100))]}
            fig.line(x='step', y='ncount', source=new)
            data_source.stream(new)


    # add on_click callback for button widget
    button1 = Button(label="Run", button_type='success', width=390)
    button1.on_click(button1_run)
    button2 = Button(label="Step", button_type='primary', width=390)
    button2.on_click(button2_step)

    doc.add_root(column(fig, button1, button2))
    doc.title = "Now with live updating!"

apps = {'/': Application(FunctionHandler(make_document))}

server = Server(apps, port=5004)
server.start()

if __name__ == '__main__':
    server.io_loop.add_callback(server.show, "/")
    server.io_loop.start()

我希望通过循环通过示例中的4个“策略”(在单击button2之后),我可以将来自模拟的新数据流式传输到该策略和步骤的线状图中。但我得到的是一条线,所有四个值都垂直连接,然后其中一个连接到下一步的第一个值。下面是几个步骤之后的样子:

我注意到,如果我将data_source.stream(new)移出for循环,我会得到一个漂亮的单线图,但当然这只适用于循环中的最后一个策略。

在我研究过的所有bokeh多线绘制示例中(不是multi_line字形,我无法理解它,而且悬停工具似乎有一些问题),说明似乎非常清楚:如果您想呈现第二条线,可以在现有的figure中添加另一个fig.line渲染器,它将使用source=data_source中为这条线提供的数据绘制一条线。但是,即使我的for循环分别为每个策略收集和添加数据,我也没有得到4个线状图,我只得到了一个。

希望我错过了一些明显的东西!提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-04-19 06:16:41

似乎每个策略都需要一行,而不是每一步一行。如果是这样的话,我会这样做:

代码语言:javascript
运行
AI代码解释
复制
import random

from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.layouts import column
from bokeh.models import Button
from bokeh.palettes import Dark2
from bokeh.plotting import figure, ColumnDataSource
from bokeh.server.server import Server

STRATEGIES = ['DD', 'DC', 'CD', 'CCDD']


def make_document(doc):
    step = 0

    def new_step_data():
        nonlocal step
        result = [dict(step=[step],
                       ncount=[random.choice(range(1, 100))])
                  for _ in STRATEGIES]
        step += 1
        return result

    fig = figure(title='Streaming Line Plot', plot_width=800, plot_height=400)
    sources = []
    for s, d, c in zip(STRATEGIES, new_step_data(), Dark2[4]):
        # Generate the very first step right away
        # to avoid having a completely empty plot.
        ds = ColumnDataSource(d)
        sources.append(ds)
        fig.line(x='step', y='ncount', source=ds, color=c)

    callback_obj = None

    def button1_run():
        nonlocal callback_obj
        if callback_obj is None:
            button1.label = 'Stop'
            button1.button_type = 'danger'
            callback_obj = doc.add_periodic_callback(button2_step, 100)
        else:
            button1.label = 'Run'
            button1.button_type = 'success'
            doc.remove_periodic_callback(callback_obj)

    def button2_step():
        for src, data in zip(sources, new_step_data()):
            src.stream(data)

    # add on_click callback for button widget
    button1 = Button(label="Run", button_type='success', width=390)
    button1.on_click(button1_run)
    button2 = Button(label="Step", button_type='primary', width=390)
    button2.on_click(button2_step)

    doc.add_root(column(fig, button1, button2))
    doc.title = "Now with live updating!"


apps = {'/': Application(FunctionHandler(make_document))}

server = Server(apps, port=5004)

if __name__ == '__main__':
    server.io_loop.add_callback(server.show, "/")
    server.start()
    server.io_loop.start()
票数 1
EN

Stack Overflow用户

发布于 2020-04-22 21:45:04

谢谢你尤金。你的解决方案让我回到了正确的轨道上。我对它进行了更多的尝试,最终得到了以下结果:

代码语言:javascript
运行
AI代码解释
复制
import colorcet as cc
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models import Button
from bokeh.layouts import column
import random

def make_document(doc):

    # make a list of groups
    strategies = ['DD', 'DC', 'CD', 'CCDD']

    # initialize some vars
    step = 0
    callback_obj = None  
    colors = cc.glasbey_dark
    # create a list to hold all CDSs for active strategies in next step
    sources = []

    # Create a figure container
    fig = figure(title='Streaming Line Plot - Step 0', plot_width=800, plot_height=400)

    # get step 0 data for initial strategies
    for i in range(len(strategies)):
        step_data = dict(step=[step], 
                        strategy = [strategies[i]],
                        ncount=[random.choice(range(1, 100))])
        data_source = ColumnDataSource(step_data)
        color = colors[i]
        # this will create one fig.line renderer for each strategy & its data for this step
        fig.line(x='step', y='ncount', source=data_source, color=color, line_width=2)
        # add this CDS to the sources list
        sources.append(data_source)

    def button1_run():
        nonlocal callback_obj
        if button1.label == 'Run':
            button1.label = 'Stop'
            button1.button_type='danger'
            callback_obj = doc.add_periodic_callback(button2_step, 100)
        else:
            button1.label = 'Run'
            button1.button_type = 'success'
            doc.remove_periodic_callback(callback_obj)

    def button2_step():
        nonlocal step
        data = []
        step += 1
        fig.title.text = 'Streaming Line Plot - Step '+str(step)
        for i in range(len(strategies)):
            step_data = dict(step=[step], 
                            strategy = [strategies[i]],
                            ncount=[random.choice(range(1, 100))])
            data.append(step_data)
        for source, data in zip(sources, data):
            source.stream(data)        


    # add on_click callback for button widget
    button1 = Button(label="Run", button_type='success', width=390)
    button1.on_click(button1_run)
    button2 = Button(label="Step", button_type='primary', width=390)
    button2.on_click(button2_step)

    doc.add_root(column(fig, button1, button2))
    doc.title = "Now with live updating!"

apps = {'/': Application(FunctionHandler(make_document))}

server = Server(apps, port=5004)
server.start()

if __name__ == '__main__':
    server.io_loop.add_callback(server.show, "/")
    server.io_loop.start()

结果就是我想要的……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61297247

复制
相关文章
聊天机器人的挑战
大家好,这里是NewBeeNLP。今天来送基本书,《自己动手做聊天机器人》,感兴趣的同学文末参加噢!
NewBeeNLP
2022/11/11
8090
聊天机器人的挑战
TensorFlow 聊天机器人
该文章介绍了如何利用基于Seq2Seq模型进行机器翻译,包括编码器、解码器和注意力机制等方面的实现。同时,文章还提供了训练、预测和评估的代码示例。
MachineLP
2018/01/09
1.1K0
TensorFlow 聊天机器人
聊天机器人一
? ? ? ? ? ? ---- ?
拾点阳光
2019/03/13
1.1K0
聊天机器人一
图灵聊天机器人
01 目录 确定目标 分析目标 代码实操 02 确定目标 本次通过图灵机器人平台的API接口制作一个人工智障聊天机器人 图灵机器人的网址为:'http://www.turingapi.com/ '
佛系编程人
2019/08/14
1.7K0
图灵聊天机器人
聊天机器人总结
里面提到一个名词叫槽位。其实可以简单的理解为填表格。DPO发起询问,NLG生成回复,为了使得回复自然,这里采用推荐时的回复。
故事尾音
2019/12/18
1.1K0
聊天机器人总结
构建一个简单的 Google Dialogflow 聊天机器人【上】
本教程将向您展示如何构建一个简单的Dialogflow聊天机器人,引导您完成Dialogflow的最重要功能。您将学习如何:
磐创AI
2019/07/10
4.2K0
构建一个简单的 Google Dialogflow 聊天机器人【上】
导出Lync用户聊天记录
SQL存档数据库聊天记录日期是UTC,中国是UTC+8,也就是SQL存储数据库聊天记录记录日期比北京时间慢8小时。注意选择导出时间
杨强生
2019/03/05
1.1K0
Transformer聊天机器人教程
在这篇文章中,我们将演示如何构建Transformer聊天机器人。 本文聚焦于:使用TensorFlow Dataset并使用tf.data创建输入管道来使用Cornell Movie-Dialogs Corpus,使用Model子类化实现MultiHeadAttention,使用Functional API实现Transformer。
昱良
2019/05/29
2.4K0
Transformer聊天机器人教程
开启聊天机器人模式
聊天机器人系统框架图 今天看到了一篇关于聊天机器人的一个不错的资源汇总: https://www.52ml.net/20510.html 进去看看先大概了解了一下都有哪些主要的概念: 原文:巨头们都很重视的聊天机器人,你不进来看看吗? 理想的 chatbot 什么样 现在的 bot 什么样 |处理任务 |聊天-搞笑
杨熹
2018/04/03
9340
开启聊天机器人模式
聊天机器人API Demo
昨天车上无聊,又写起了代码…… 居然真写出了个聊天机器人的API Demo……(没啥用) 这个API是调用图灵机器人的官方API,只是简单的解析json,直接把文字信息输出 话不多说,上代码 <?ph
FHYC
2018/06/22
4.5K0
Google杀入AI聊天机器人领域,暴跌千亿?错哪了?
大家好,ChatGPT 现在被大家玩坏了,甚至在用户的不断逼问之下,露出了鸡脚,原来 ChatGPT 也是小黑子
AI算法与图像处理
2023/02/28
4360
Google杀入AI聊天机器人领域,暴跌千亿?错哪了?
开启聊天机器人模式
本文介绍了聊天机器人技术的研究进展,从系统框架、自然语言理解、对话管理、自然语言生成等方面进行了详细阐述,并对当前面临的挑战和未来的展望进行了分析。
MachineLP
2018/01/09
1.1K0
开启聊天机器人模式
聊天机器人模型 - ChatGPT
还有一个问题,正常情况:注册成功openai会赠送18美金,可以用于api调用。但如果你用的这个手机号被其他人用过了,这18美金就没有了。我第一次就遇到这个问题,只能换个E-mail重新注册
崔哥
2023/02/26
1.1K0
beego聊天室的基本配置
beego.Router("/ws", &controllers.WsController{})
公众号-利志分享
2022/04/25
2100
spring之配置单例的集合bean,以供多个bean进行引用
这种情况下,是在一个bean的里面进行配置的,假设现在我们有另外一个bean,也需要使用List集合里的bean,那么应该怎么做呢?
西西嘛呦
2020/08/26
3980
spring之配置单例的集合bean,以供多个bean进行引用
使用Python操作机器人聊天
萌新偶然发现一个好玩的东西 使用Python和机器人聊天 效果 工具 图灵机器人API itchat(提前安装) 准备 自己需要去图灵机器人注册账号,拿到APIkey,大家也可以直接使用我这个 ca0
小歪
2018/04/04
1.5K0
使用Python操作机器人聊天
Python实现聊天机器人
AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。
海天一树
2018/07/25
1.3K0
Python实现聊天机器人
简易聊天系统-聊天服务
聊天负责私人聊天,群组聊天。私人聊天接受信息后保存至数据库再转发给目标用户。群组聊天当前没有离线消息保存,也就是用户登录后无法知道多少消息未读,而是直接拉取指定数量群聊天。当有成员发送后会将聊天信息存储数据库(没有缓存进redis,因为在线用户会直接发送,目前没有这个优化必要),从redis中检索所有群组在线用户并通过消息队列发送至对应网关。
全栈程序员站长
2022/07/21
2.4K0
聊天机器人与Alice的AIML
聊天机器人从20世纪80年代起相继出现:TalkBot、Elbot、eLise、Alice、Laylahbot、爱情玩偶等,其中Alice曾被认为是最聪明的机器人。
Mshu
2018/10/31
2.6K0
如何让人类上瘾 浅谈聊天机器人抓住用户的艺术
在飞速发展的 AI 领域,聊天机器人极有可能是下一个风口。 在其核心,聊天机器人做的事情,是模拟与用户的双向通话。取决于不同的场景和目的,谈话内容有可能是天气,也有可能是时间计划,以及其他各种话题。
AI研习社
2018/03/29
9430
如何让人类上瘾 浅谈聊天机器人抓住用户的艺术

相似问题

google hangout聊天机器人可以聊天消息机器人?

227

Google Meet中的聊天机器人虚拟会议聊天

129

我无法在google聊天中获得“配置webhook”选项

20

用于聊天机器人的Flex

13

Sensu,用于多聊天室的Google聊天处理程序

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档