用于控制绘图的用户输入,在Python中使用Shiny

问题描述 投票:0回答:1

我正在尝试使用用户定义的输入来控制旭日图。这一切都是用 Python 编写的,并使用了 Shiny 和 Plotly 包。使用这些破折号的原因是因为我在 R 中使用过这两个项目,但是这个项目需要使用 Python。

这个想法是,使用数字输入,用户可以编辑输入旭日图的参数。 将有多个输入,但下面的代码仅适用于单个值,因为我假设任何答案都是可扩展的。

import plotly.graph_objs as go
import plotly.express as px
from shiny import App, reactive, render, ui,  Inputs, Outputs, Session
from shinywidgets import output_widget, register_widget
import pandas as pd



def panel_box(*args, **kwargs):
    return ui.div(
        ui.div(*args, class_="card-body"),
        **kwargs,
        class_="card mb-3",
    )

app_ui = ui.page_fluid(
    {"class": "p-4"},
    ui.row(
        ui.column(
            4,
            panel_box(
                ui.input_numeric("FirstValue", "FirstValue", min = 0, value=2),

            ),
        ),
        ui.column(
            8,
            output_widget("scatterplot"),
        ),
    ),
)

def server(input: Inputs, output: Outputs, session: Session):
    
    FirstValue = reactive.Value(2)

    @reactive.Effect
    @reactive.event(input.FirstValue)
    def _():
        FirstValue.set(input.FirstValue())

    scatterplot = go.FigureWidget(
        data=[
            go.Sunburst(
                labels = ["Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"],
                parents = ["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve" ],
                values = [2, 14, 12, 10, 2, 6, 6, 4, 4],

            ),
        ],
        layout={"showlegend": False},
    )

    @reactive.Effect
    def _():
        scatterplot.data[0].values = [FirstValue, 14, 12, 10, 2, 6, 6, 4, 4]

    register_widget("scatterplot", scatterplot)


app = App(app_ui, server)

目前出现错误

Error in Effect: <shiny.reactive._reactives.Value object at 0x000002275FC35540> is not JSON serializable

我尝试了其他几种方法,其中许多都破坏了反应性属性 - 这是我得到的最接近的方法。

如何使绘图链接到用户定义的值?

python plotly plotly-python py-shiny
1个回答
0
投票

我认为错误来自于尝试使用

FirstValue
对象而不是其值来设置散点图数据。如果我们改为使用
FirstValue._value
,那么您的应用程序不会崩溃,但它似乎也不是反应性的。

@reactive.Effect
    def _():
        scatterplot.data[0].values = [FirstValue._value, 14, 12, 10, 2, 6, 6, 4, 4]
© www.soinside.com 2019 - 2024. All rights reserved.