我正在尝试使用用户定义的输入来控制旭日图。这一切都是用 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
。
我尝试了其他几种方法,其中许多都破坏了反应性属性 - 这是我得到的最接近的方法。
如何使绘图链接到用户定义的值?
我认为错误来自于尝试使用
FirstValue
对象而不是其值来设置散点图数据。如果我们改为使用 FirstValue._value
,那么您的应用程序不会崩溃,但它似乎也不是反应性的。
@reactive.Effect
def _():
scatterplot.data[0].values = [FirstValue._value, 14, 12, 10, 2, 6, 6, 4, 4]