我正在尝试创建一个仪表板,其中包含 jupyter 笔记本内的绘图和 ipython 小部件。但我遇到了一个非常烦人的问题:第一次执行单元格时该函数不显示任何图表。它仅在第一次与其小部件交互并刷新绘图后显示。
注意: 我必须使用
interactive_output
因为我想更改布局。
当我使用 interact
或 interactive
代替时,问题不会发生
interactive_output
。
在这里您可以看到发生此问题的示例代码:
a = widgets.IntSlider(value=10)
b = widgets.IntSlider()
c = widgets.IntSlider()
ui = widgets.HBox([a, b, c])
def f(a, b, c):
fig = go.Figure()
fig.add_trace(go.Scatter(x=[a,b,c], y=[a,b,c],
mode='lines',
name='Shear'))
fig.show()
out = widgets.interactive_output(f, {'a': a, 'b': b, 'c': c})
display(ui, out)
我希望在运行代码后即可显示绘图,而无需之前与小部件进行交互。我该如何解决这个问题?
感谢您的宝贵时间。
现在有情节或有些事情很奇怪。我一直在 JupyterLab 中看到这项工作:
import plotly.graph_objects as go
import ipywidgets as widgets
a = widgets.IntSlider(value=10)
b = widgets.IntSlider(value=4)
c = widgets.IntSlider(value=4)
def f(a, b, c):
fig = go.Figure()
fig.add_trace(go.Scatter(x=[a,b,c], y=[a,b,c],
mode='lines',
name='Shear'))
fig.show()
ui = widgets.HBox([a, b, c])
out = widgets.interactive_output(f, {'a': a, 'b': b, 'c': c})
display(ui, out)
a.value=5
您的代码甚至可以在添加了导入语句的新笔记本中的 JupyterLab 中运行。(这些导入语句是我发布的内容中的前两行。)
您可以通过此处亲自查看它,并在会话启动后打开一个新笔记本并粘贴您或我的代码并查看它的运行,而无需先与滑块交互。 但是,大多数情况下,在同一会话中的新经典笔记本中,它只是
永远不会显示任何情节,即使在使用滑块之后(?!?)。然而,有时在新笔记本中,在经典界面中,我提供的相同代码确实可以工作。或者,在经典笔记本中,当在之前的代码here之后运行时,它每次都有效。 (您甚至可以单击瞧按钮,然后绘图就会呈现。)但它每次在与该会话关联的 JupyterLab 中都有效。 (在会话内部,您可以通过在经典模式下单击左上角的 Jupyter 徽标来访问 JupyterLab。)
我认为有些东西没有在经典笔记本中导入或初始化,但它现在的样子却让我无法理解。由于某种原因,粘贴在笔记本这里
克服了它。奇怪的是,我什至不必先运行该笔记本中的代码。只需打开它,粘贴代码,然后运行该单元就足以使其一致工作?!?这很奇怪而且没有意义。
我认为不需要将笔记本设置为“信任”,因为我最近确实在经典笔记本界面模式下获得了全新笔记本来使用我的代码,只是不一致。
更奇怪的是,如果粘贴到从
here
出现的笔记本中,您的代码的行为就像您所说的那样,但当您在经典界面中的同一会话中打开新笔记本时却没有显示。
import plotly.express as px
import ipywidgets as widgets
a = widgets.IntSlider(value=10)
b = widgets.IntSlider(value=4)
c = widgets.IntSlider(value=4)
def f(a, b, c):
# based on https://stackoverflow.com/questions/61358173/plotly-interactive-graph-with-linesmarkers-mode-using-plotly-express
fig = px.line(x=[a,b,c], y=[a,b,c])
fig.add_scatter(x=[a,b,c], y=[a,b,c],
mode='markers',
name='Shear')
fig.show()
ui = widgets.HBox([a, b, c])
out = widgets.interactive_output(f, {'a': a, 'b': b, 'c': c})
display(ui, out)
a.value=5
以相同的模式工作或不工作。