在 ipywidgets interactive 中排列小部件
Arranging widgets in ipywidgets interactive
我有这个使用 ipywidgets 的交互式图形代码;但不确定如何在小部件的交互功能中设置每个变量。默认布局是垂直的。但我想以水平方式排列它们。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
from ipywidgets import interactive,interact
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
time=np.arange(0,1,0.01)
df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
"y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
widget
interactive
仅限于相当简单的小部件布局。如果您想进一步自定义它们,请查看 Flexbox 选项。
一个简单的解决方法是使用 interactive
调用来生成和 link 您的小部件和函数,然后在 HBox 中重组小部件。然后添加一个布局,告诉框在行尾换行。我在最后添加了几个导入和三行来实现这一点。
1) controls
- HBox
个输入小部件。
2) interactive
调用生成的 Output
小部件。
3) A VBox
将两者包裹在一起。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
#importing the necessary items from the Ipywidgets library
from ipywidgets import interactive,interact, HBox, Layout,VBox
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
time=np.arange(0,1,0.01)
df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
"y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
controls = HBox(widget.children[:-1], layout = Layout(flex_flow='row wrap'))
output = widget.children[-1]
display(VBox([controls, output]))
嗨,这是我正在使用的装饰器,而不是@interact:
def interact_delayed(_InteractFactory__interact_f=None, **kwargs):
def patch(obj):
if hasattr(obj.widget, 'layout'):
obj.widget.layout = Layout(flex_flow='row wrap')
for child in obj.widget.children:
if hasattr(child, 'continuous_update'):
child.continuous_update = False
return obj
if _InteractFactory__interact_f is None:
def decorator(f):
obj = interact(f, **kwargs)
return patch(obj)
return decorator
else:
obj = interact(_InteractFactory__interact_f, **kwargs)
return patch(obj)
patch
函数修改 ipywidget 对象的默认属性:应用上一个答案中建议的布局,并将 continuous_update
设置为 false,我发现这在我的案例中很有用。
if-else 分支负责装饰器与函数用例场景。
无法通过在“交互”或交互中添加参数来排列小部件。
我有这个使用 ipywidgets 的交互式图形代码;但不确定如何在小部件的交互功能中设置每个变量。默认布局是垂直的。但我想以水平方式排列它们。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
from ipywidgets import interactive,interact
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
time=np.arange(0,1,0.01)
df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
"y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
widget
interactive
仅限于相当简单的小部件布局。如果您想进一步自定义它们,请查看 Flexbox 选项。
一个简单的解决方法是使用 interactive
调用来生成和 link 您的小部件和函数,然后在 HBox 中重组小部件。然后添加一个布局,告诉框在行尾换行。我在最后添加了几个导入和三行来实现这一点。
1) controls
- HBox
个输入小部件。
2) interactive
调用生成的 Output
小部件。
3) A VBox
将两者包裹在一起。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
#importing the necessary items from the Ipywidgets library
from ipywidgets import interactive,interact, HBox, Layout,VBox
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
time=np.arange(0,1,0.01)
df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
"y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
controls = HBox(widget.children[:-1], layout = Layout(flex_flow='row wrap'))
output = widget.children[-1]
display(VBox([controls, output]))
嗨,这是我正在使用的装饰器,而不是@interact:
def interact_delayed(_InteractFactory__interact_f=None, **kwargs):
def patch(obj):
if hasattr(obj.widget, 'layout'):
obj.widget.layout = Layout(flex_flow='row wrap')
for child in obj.widget.children:
if hasattr(child, 'continuous_update'):
child.continuous_update = False
return obj
if _InteractFactory__interact_f is None:
def decorator(f):
obj = interact(f, **kwargs)
return patch(obj)
return decorator
else:
obj = interact(_InteractFactory__interact_f, **kwargs)
return patch(obj)
patch
函数修改 ipywidget 对象的默认属性:应用上一个答案中建议的布局,并将 continuous_update
设置为 false,我发现这在我的案例中很有用。
if-else 分支负责装饰器与函数用例场景。
无法通过在“交互”或交互中添加参数来排列小部件。