Расположение виджетов в ipywidgets интерактивно
У меня есть этот код интерактивного графика с использованием 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
3 ответа
interactive
ограничен довольно простыми макетами виджетов. Посмотрите на параметры Flexbox, если вы хотите настроить их еще немного.
Один простой способ обойти это использовать interactive
вызов для создания и связывания ваших виджетов и функций, а затем реструктурировать виджеты внутри HBox. Затем добавьте компоновку, которая говорит окну переноситься в конце строки. Я добавил еще пару импортов и три строки в конце, чтобы добиться этого.
1) controls
- ан HBox
из ваших входных виджетов.
2) Output
виджет, сгенерированный interactive
вызов.
3) А 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 заботятся о сценариях использования декораторов и функций.
Невозможно упорядочить виджеты, добавив параметр в "взаимодействовать" или "интерактивно".