Python 中的 Plotly-Dash 库存应用程序,带有客户端回调(x 轴缩放上的 y 轴自动缩放)

2024-02-09

我正在使用 xaxis 滑块在 dash-plotly (python) 中创建一个简单的股票图表应用程序。滑动 x 轴时,我希望 y 轴动态重新缩放到视图。我想我已经设法在通过“relayoutData”挂钩滑动 xaxis 刻度时触发回调函数。但脚本没有更新 yaxis,而是抛出错误。我不确定从回调函数更新布局的正确语法。有任何想法吗?

到目前为止,这是我的代码。它运行,但 yaxis 在运行时设置,并且不更新。

非常感谢您的帮助=)

import dash
from dash.dependencies import Output, Input
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import numpy as np
import datetime

#some random values
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
xy = [dateList,np.random.rand(100)]

app = dash.Dash()

app.title = 'Random'
dataS = go.Scatter(
        x = xy[0],
        y = xy[1],
        name = 'Rand',
        mode = 'lines'
    )
layoutS = go.Layout(
    title="Rand",
    xaxis=dict(
        rangeslider_visible=True,
        rangeselector=dict(
            buttons=list([
                dict(count=1, label="1m", step="month", stepmode="backward"),
                dict(count=6, label="6m", step="month", stepmode="backward"),
                dict(count=1, label="YTD", step="year", stepmode="todate"),
                dict(count=1, label="1y", step="year", stepmode="backward"),
                dict(count=5, label="5y", step="year", stepmode="backward"),
                dict(step="all")
            ])
        )
    )
)

app.layout = html.Div(
    html.Div([
        html.H1(children='Random nums'),
        html.Div(children='''
            Rand rand rand.
        '''),

        dcc.Graph(id='RandGraph', animate=True, figure=go.FigureWidget(data=dataS,layout=layoutS))
    ])
)

@app.callback(Output('RandGraph','figure'),[Input('RandGraph','relayoutData')])
def update_graph(relOut):
    layout = go.Layout(
        yaxis=dict(range=[min(y),max(y)])
    )
    return {'layout':layout}

if __name__ == '__main__':
    app.run_server(debug=False)

这是结果。我首先尝试了服务器端实现,但最终速度非常慢(我保留它以供参考)。客户端实现的响应速度更快、响应速度更快。使用起来很愉快。我只需要学习一些 javascript 就可以工作 =) 当我尝试进行数组过滤时,我肯定缺少 pandas !

这是工作代码。享受!

import dash
from dash.dependencies import Output, Input, State
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import numpy as np
import pandas as pd
import datetime

#some random values
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
xy = [dateList,np.random.rand(100)]
df = pd.DataFrame(data=xy[1],columns=["y"],index=xy[0])


#Graph data
dataS = [dict(
    x = df.index,
    y = df['y'],
    name = 'meter',
    mode = 'lines'
)]

#Graph layout
layoutS = go.Layout(
    title="Meter",
    xaxis=dict(
        rangeslider_visible=True,
        rangeselector=dict(
            buttons=list([
                dict(count=1, label="1m", step="month", stepmode="backward"),
                dict(count=6, label="6m", step="month", stepmode="backward"),
                dict(count=1, label="YTD", step="year", stepmode="todate"),
                dict(count=1, label="1y", step="year", stepmode="backward"),
                dict(count=5, label="5y", step="year", stepmode="backward"),
                dict(step="all")
            ])
        )
    ),
    yaxis=dict(range=[0,2])
)

#Dash app layout
app = dash.Dash()
app.title = 'Random'

app.layout = html.Div(
    html.Div([
        html.H1(children='Random nums'),
        html.Div(children='''
            Rand rand rand.
        '''),

        dcc.Input(
            id='input-y',
            placeholder='Insert y value',
            type='number',
            value='',
        ),
        html.Div(id='result'),

        dcc.Graph(id='RandGraph',figure=dict(data=dataS,layout=layoutS))
    ])
)

#client side implementation
app.clientside_callback(
    """
    function(relOut, Figure) {
        if (typeof relOut !== 'undefined') {
            if (typeof relOut["xaxis.range"] !== 'undefined') {
                //get active filter from graph
                fromS = new Date(relOut["xaxis.range"][0]).getTime()
                toS = new Date(relOut["xaxis.range"][1]).getTime()

                xD = Figure.data[0].x
                yD = Figure.data[0].y

                //filter y data with graph display
                yFilt = xD.reduce(function (pV,cV,cI){
                    sec = new Date(cV).getTime()
                    if (sec >= fromS && sec <= toS) {
                        pV.push(yD[cI])
                    }
                    return pV
                }, [])

                yMax = Math.max.apply(Math, yFilt)
                yMin = Math.min.apply(Math, yFilt)
            } else { 
                yMin = Math.min.apply(Math, Figure.data[0].y)
                yMax = Math.max.apply(Math, Figure.data[0].y) 
            }
        } else { 
            yMin = Math.min.apply(Math, Figure.data[0].y)
            yMax = Math.max.apply(Math, Figure.data[0].y) 
        }
        Figure.layout.yaxis = {
            'range': [yMin,yMax],
            'type': 'linear'
        }
        return {'data': Figure.data, 'layout': Figure.layout};
    }
    """,
    Output('RandGraph','figure'),
    [Input('RandGraph','relayoutData')],[State('RandGraph', 'figure')]
)

#Server side implementation (slow)
#@app.callback(
#    Output('RandGraph','figure'),
#    [Input('RandGraph','relayoutData')],[State('RandGraph', 'figure')]
#)
#def update_result(relOut,Fig):
#    ymin = df.loc[relOut['xaxis.range'][1]:relOut['xaxis.range'][0],'y'].min()
#    ymax = df.loc[relOut['xaxis.range'][1]:relOut['xaxis.range'][0],'y'].max()
#    newLayout = go.Layout(
#        title="OL Meter",
#        xaxis=dict(
#            rangeslider_visible=True,
#            rangeselector=dict(
#                buttons=list([
#                    dict(count=0, label="1m", step="month", stepmode="backward"),
#                    dict(count=6, label="6m", step="month", stepmode="backward"),
#                    dict(count=1, label="YTD", step="year", stepmode="todate"),
#                    dict(count=1, label="1y", step="year", stepmode="backward"),
#                    dict(count=5, label="5y", step="year", stepmode="backward"),
#                    dict(step="all")
#                ])
#            ),
#            range=relOut['xaxis.range']
#        ),
#        yaxis=dict(range=[ymin,ymax])
#    )
#    
#    
#    Fig['layout']=newLayout
#    return Fig

if __name__ == '__main__':
    app.run_server(debug=False)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的 Plotly-Dash 库存应用程序,带有客户端回调(x 轴缩放上的 y 轴自动缩放) 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 控制 Kubernetes 中单个 pod 中容器终止的顺序

    我的一个容器内有两个容器 第一个是我的应用程序容器 第二个是 CloudSQL 代理容器 基本上我的应用程序容器依赖于这个 CloudSQL 容器 问题是 当 pod 终止时 CloudSQL 代理容器首先终止 并且仅在几秒钟后我的应用程序
  • 从命令行启动时出现 MacVim 颜色问题

    我对 Vim 比较陌生 到目前为止一直在使用它 没有出现任何问题 我要么从我的扩展坞启动 MacVim 要么使用mvim从命令行 到目前为止效果很好 但现在我遇到了一个问题 没有明显的原因 从命令行启动 MacVim 开始创建一个所有颜色都
  • 在Java中忽略你自己的UDP广播

    在我的程序中 我发送 UDP 广播并对它们做出反应 我需要一种方法来忽略 UDP 广播I发送出去 但对那些不是来自我的机器的做出反应 我确实尝试使用 if NetworkInterface getByInetAddress packet g
  • Vue JS - 访问组件内的根计算属性

    我正在尝试从根 Vue 实例访问计算属性并在组件内部访问它 这 p class currency 在组件模板外部输出的元素正确输出 currency 但是当尝试访问组件内部的 currency 时 不会输出任何内容 我尝试过将货币设置为道具
  • 使用 R 在坐标系中绘制节点和边

    我实施了FR测试here http itee uq edu au zxf papers ACMMM08 distributionn pdf现在我想通过可视化 R 中生成的最小生成树来测试它 顶点和边应该在坐标系中绘制 此外 我想为每个点设置
  • MongoDB 嵌入 Java

    我从文档中得到的是 它在其他计算机上作为单独的进程运行 我可以使用 java 的 mongo db 客户端驱动程序与它进行通信 并且我可以执行正常操作 但我怀疑我是否可以在我的java应用程序中使用MongoDB作为嵌入式数据库 我的意思是
  • 带有 UIImage 的 Swift 游乐场

    我正在使用 Xcode 6 并且正在尝试重新创建在会话 401 Xcode 6 中的新增功能 期间演示的代码 我已将图像添加到 Images xcassets 称为 Sample 并在游乐场文件中我尝试访问此图像 如演示的那样 我的代码如下
  • 为什么 React devtools Profiler 不向我显示组件属性?

    我开始学习React的优化 并看到一些学习资源 在它们上 我可以在探查器中看到组件道具 但在我的 Profiler 中 我没有看到任何道具 为什么 如何在 Profiler 中查看当前渲染组件的 props A make screensho
  • 方法:python-pdfkit 将网页(JS生成)转换为PDF

    views py def download as pdf request some stuff function call to get updated with data and JS template and render it ret
  • Laravel Eloquent:SQL 注入预防是自动完成的吗?

    给出示例代码 Message是一个雄辩的模型 public function submit Request request this gt validate request name gt required email gt require
  • 从 cypress 中的函数返回一个值[重复]

    这个问题在这里已经有答案了 import StudentDetails from Department let studentInfo new StudentDetails let studName any it Get Student N
  • 为什么我的 Qt 4.5 应用程序在 Windows 下打开控制台窗口?

    我一直在 Linux 下使用 Qt Creator 4 5 我的应用程序在 Linux 下构建得很好 但如果我在 Windows 中构建 该应用程序总是在启动时打开一个控制台窗口 我可以阻止它这样做吗 我正在使用默认的 MinGW 设置进行
  • 如何提高JPictureBox大图像的绘制速度?

    我有一个 JPictureBox 从 java awt Component 扩展 请参阅此处的代码http pastebin com SAJc6Sht http pastebin com SAJc6Sht 但只有在没有图像拉伸的情况下它才有
  • 撤销对表 pg_proc 上 postgresql 中不起作用的特定列的访问

    我的目标是仅允许特定用户执行特定模式中的函数 按名称列出可用的函数 但看不到函数的源代码或列出其他模式 通过执行以下操作 无需列出可用函数名称即可实现上述目的 首先创建一个测试用户角色 CREATE ROLE test user WITH
  • Java 做 while, while

    当我运行此代码时 我可以期待什么行为 do while testA do stuff while testB 它的行为会像 do while testA do stuff while testB Or if testA do do stuf
  • 仅针对 nginx 上的特定 url 使用 https 重定向

    我正在尝试让 https 与某些 url 一起使用 但似乎 https 无处不在 具体来说 我在 Nginx 上创建了 2 个虚拟主机 第一个虚拟主机的端口为 80 另一个虚拟主机的端口为 443 包含 SSL 现在我的网站 即domain
  • 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

    为了一个我喜欢的项目 我开始摆弄 ANTLR 在学习了一些教程之后 我现在尝试为我自己的语言创建语法并生成 AST 现在我主要在 ANTLRWorks 中闲逛 但现在我已经验证了解析树似乎没问题 我想 迭代地 因为我仍在学习 仍然需要对最终
  • 授权 Rails_admin 与 pundi

    我使用 pundit gem 进行授权 在我的档案中config initializers rails admin rb RailsAdmin config do config config authorize with pundit co
  • 如何从 C# 嵌入式资源获取文件夹名称

    我想以文件系统排序资源的方式来排序资源 我无法对名称进行 string split 因为文件夹由 分隔 字符 而不是 字符 这意味着文件夹或文件名中包含任何句点都会破坏排序 有没有办法更改分隔符 或获得嵌入资源的原始位置的不同细分 这将为您
  • Python 中的 Plotly-Dash 库存应用程序,带有客户端回调(x 轴缩放上的 y 轴自动缩放)

    我正在使用 xaxis 滑块在 dash plotly python 中创建一个简单的股票图表应用程序 滑动 x 轴时 我希望 y 轴动态重新缩放到视图 我想我已经设法在通过 relayoutData 挂钩滑动 xaxis 刻度时触发回调函