2016-06-03 9 views
3

Ich versuche, interaktive Schieberegler mit ipywidgets auf jupyter Notebook zu machen, um die Daten eines Plots zu ändern, wenn ein Benutzer einen Slider Widget ändert, was einfach ist und wir können Beispielcodes leicht finden. Das Problem, das ich habe, ist ein zweifaches: 1) Wenn viele Parameter (= Variablen, Schieberegler) in meiner Funktion angezeigt werden, sind Schieberegler vertikal angeordnet, so dass es schwierig wird, sie zu steuern, ohne die Jupiter-Seite zu scrollen. Gibt es eine Möglichkeit, Slider wie m-n-Gitter anzuordnen? 2) Um eine große Anzahl von Integer-/Float-Wert-Schiebereglern zu übergeben, habe ich ein einzelnes Wörterbuch erstellt, das an die Funktion Interactive übergeben wird. Hier werden die Namen der Schlüssel (= Slider/Variable/Parameter) scheinbar in zufälliger Reihenfolge angezeigt. Ich habe versucht, das Wörterbuch nach der Sortierung nach den Schlüsselnamen zu übergeben, aber es löst das Problem nicht.Wie Schlüsselnamen in ipywidgets interaktive Widgets (Slider) zu sortieren?

Ich würde es schätzen, wenn Sie irgendwelche Ideen teilen können.

def myfun(**var_dict): 
    v = [value for value in var_dict.values()] 
    return np.sum(v) 

var_dict = {'var1':1,'var2':2,'var3':3,'var4':4} 
w = interactive(myfun,**var_dict) 
display(w) 

ipywidgets interactive sliders

+0

betrachten ein [bestellt dict] mit (https://docs.python.org/2/library/collections.html#collections. OrderedDict)? – nluigi

+0

Ich habe versucht, OrderedDict, aber nicht funktioniert möglicherweise, weil Python-Funktion Aufruf Semantik Pass-in Schlüsselwort Argumente mit einem regulären ungeordneten Wörterbuch. –

Antwort

3

Sie werden diese nicht in der Lage sein zu lösen mit ** kwargs. Wie in PEP468 "Der einzige Grund, warum sie [Schlüsselwort Argumente] nicht funktionieren, ist, weil der Interpreter diese Bestellinformationen wegwirft." „Ab Version 3.5 Python wird die Reihenfolge der Keyword-Argumente erhalten, wie an eine Funktion übergeben“

Also, wenn Sie dieses Verhalten erhalten möchten, sollten Sie entweder: Name Ihre Argumente, wenn Sie ‚interaktiv‘:

from ipywidgets import interactive 
from IPython.display import display 
import numpy as np 
def myfun(**kwargs): 
    return np.sum(list(kwargs.itervalues())) 
w=interactive(myfun,var1=1,var2=2,var3=3,var4=4) 
display(w) 

oder, wenn Sie wirklich ein dict verwenden möchten, ist das Beste, die Widgets, so weit ich weiß, selbst zu erstellen, ohne die Verwendung von "interaktiv". Sie könnten diese auf diese Weise tun:

from IPython.display import display,clear_output 
from ipywidgets import widgets 
from collections import OrderedDict 
var_dict = OrderedDict([('var1',1),('var2',2),('var3',3),('var4',4)]) 

def myfct(change,list_widgets): 
    clear_output() 
    print np.sum([widget.value for widget in list_widgets]) 

list_widgets=[] 

# create the widgets 
for name,value in var_dict.iteritems(): 
    list_widgets.append(widgets.IntSlider(value=value,min=value-2,max=value+2,description=name)) 

# link the widgets with the function 
for widget in list_widgets: 
    widget.observe(lambda change:myfct(change,list_widgets),names='value',type='change') 

# group the widgets into a FlexBox 
w = widgets.VBox(children=list_widgets) 

# display the widgets 
display(w) 

Genießen :-)

+0

Option 1 ("benennen Sie Ihre Argumente, wenn Sie' interaktiv' verwenden ") funktioniert nicht zuverlässig für mich, wenn Sie Python 3.5.2, IPython 5.1.0 und ipywidgets 5.2.2 verwenden. Nach dem Neustart des Kernels des Jupyter-Notebooks ändert sich auch die Reihenfolge der Widgets scheinbar zufällig. –