這太他媽的刺激了......使用:
Python 3.8.10 (default, Sep 28 2021, 16:10:42) [GCC 9.3.0]
matplotlib 3.5.0
ipywidgets 7.6.5
jupyter 1.0.0
所以,考慮這個例子:
import IPython.display
from IPython.display import display
from ipywidgets import widgets, Layout
%matplotlib widget
import matplotlib as mpl
import matplotlib.pyplot as plt
widget_01 = widgets.HTML("<p>Hello, world</p>")
widget_02 = widgets.Output(layout=Layout(width='100%'))
widget_03 = widgets.Output(layout=Layout(width='100%'))
with widget_02:
IPython.display.clear_output(True)
display(widgets.HTMLMath("<p>Try equation: $x_y = y_x$</p>"))
myvbox = widgets.VBox([
widget_01,
widget_02,
widget_03
],)
display(myvbox)
with widget_03:
IPython.display.clear_output(True)
display(widgets.HTMLMath("<p>In the next episode...</p>"))
所以,我有一個“Vbox”,它有三個元素,“widget_01”、“widget_02”、“widget_03”;這三個元素放在一個串列中,它(與 dict 不同)有一個順序,所以我可以指望“widget_01”是“第一”,“widget_02”是“第二”,依此類推。由于這是一個“VBox”,即垂直框,我希望串列中的“第一個”專案呈現在頂部,其下方的“第二個”專案(即中間),以及很快。
事實上,這就是最簡單情況下輸出的樣子:

好的,很酷 - 現在,讓我們將“widget_02”變成matplotlib widget:
import IPython.display
from IPython.display import display
from ipywidgets import widgets, Layout
%matplotlib widget
import matplotlib as mpl
import matplotlib.pyplot as plt
widget_01 = widgets.HTML("<p>Hello, world</p>")
widget_02 = widgets.Output(layout=Layout(width='100%'))
widget_03 = widgets.Output(layout=Layout(width='100%'))
with widget_02:
IPython.display.clear_output(True)
fig = plt.figure(figsize=(10,1), dpi=90)
fig.canvas.toolbar_visible = False
ax = fig.add_subplot(111)
ax.plot([0,1,2], [0,1,2])
myvbox = widgets.VBox([
widget_01,
widget_02,
widget_03
],)
display(myvbox)
with widget_03:
IPython.display.clear_output(True)
display(widgets.HTMLMath("<p>In the next episode...</p>"))
好吧,現在 - 無論出于何種原因 - “widget_02”(變成了情節)不再在中間,而是最后(在底部):

我的意思是,我肯定會在更新繪圖后更新“widget_03” - 但我希望 VBox 保持小部件的順序?
那么 - 我怎樣才能按照在 ipywidgets VBox 中列出的順序呈現 Matplotlib 小部件,即使我在渲染繪圖后更新同一個 VBox 中的不同小部件?
uj5u.com熱心網友回復:
呼喚plt.show()后ax.plot([0,1,2], [0,1,2])解決了我您的問題。見下面的代碼:
import IPython.display
from IPython.display import display
from ipywidgets import widgets, Layout
import matplotlib as mpl
import matplotlib.pyplot as plt
widget_01 = widgets.HTML("<p>Hello, world</p>")
widget_02 = widgets.Output(layout=Layout(width='100%'))
widget_03 = widgets.Output(layout=Layout(width='100%'))
with widget_02:
IPython.display.clear_output(True)
fig = plt.figure(figsize=(10,1), dpi=90)
fig.canvas.toolbar_visible = False
ax = fig.add_subplot(111)
ax.plot([0,1,2], [0,1,2])
plt.show()
myvbox = widgets.VBox([
widget_01,
widget_02,
widget_03
],)
display(myvbox)
with widget_03:
IPython.display.clear_output(True)
display(widgets.HTMLMath("<p>In the next episode...</p>"))
輸出如下所示:
uj5u.com熱心網友回復:
好的,我在這里找到了一個解決方案:
...可以使用以下更正的代碼:
import IPython.display
from IPython.display import display
from ipywidgets import widgets, Layout
%matplotlib widget
import matplotlib as mpl
import matplotlib.pyplot as plt
widget_01 = widgets.HTML("<p>Hello, world</p>")
widget_02 = widgets.Output(layout=Layout(width='100%'))
widget_03 = widgets.Output(layout=Layout(width='100%'))
with widget_02:
widget_02.clear_output(wait=True)
plt.ioff() # "turn off interactive mode so figure doesn't show"
fig = plt.figure(figsize=(10,1), dpi=90)
fig.canvas.toolbar_visible = False
ax = fig.add_subplot(111)
ax.plot([0,1,2], [0,1,2])
plt.ion() # "figure still doesn't show"
display(fig.canvas) # "It's the canvas attribute that is the interactive widget, not the figure"
myvbox = widgets.VBox([
widget_01,
widget_02,
widget_03
],)
display(myvbox)
with widget_03:
IPython.display.clear_output(True)
display(widgets.HTMLMath("<p>In the next episode...</p>"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367156.html
標籤:Python matplotlib jupyter-笔记本 蟒蛇 小部件
上一篇:不同顏色的混淆矩陣
