2017-12-26 26 views
1

Ich bin neu in Python und ich möchte eine interaktive Dropdown-Liste aus einem ipywidget erstellen. Der Hauptzweck besteht darin, die Dropdown-Liste basierend auf zwei anderen Widgets zu aktualisieren. Im folgenden Code wird das Widget plotType basierend auf der Eingabe aus den Widgets headers_x und headers_y aktualisiert (beide beziehen sich auf die zum Plotten ausgewählten Datenrahmenspalten). Wenn beide headers_x und headers_y die Select Option haben, dann ist die plotType "Make Auswahl" zeigen muss. Aber wenn die headers_x und headers_y andere Optionen ausgewählt haben (Spalten aus dem Dataframe), dann muss der plotType entsprechend geändert werden. Wenn die headers_x und headers_y sind beide numerisch, dann die plotType zeigen muss: numericVsNumeric, aber wenn headers_x kategorische und headers_y numerisch ist, dann plotType zu zeigen, braucht 'catergoricalVsNumeric 'Ich habe meine Lösung wie folgt versucht, aber die Optionen im Widget "plotType" werden nicht aktualisiert. Jede Hilfe wird sehr geschätzt. Vielen Dank.Update ipywidget Dropdown-Liste von Funktion in Python

from ipywidgets import * 
import seaborn.apionly as sns 
df = sns.load_dataset('iris') 

#identifies the columns in the dataframe 
df_cols = list(df.columns.values) 
df_cols.insert(0, 'Select') 
str_cols = list(df.select_dtypes(include=['object']).columns.values) 
str_cols.insert(0, 'Select') 

#plot function 
def set_plot(headers_x, headers_y, plotType): 
    data = df 
    #plotting functions to be added 

#function to specify the type of plot based on users input 
def set_plotType(): 
    data = df 
     #If no selection has been made 
    if headers_x.value == 'Select' and headers_y.value == 'Select': 
     init = list(['Make Selection']) 
    else: 
     #if x and y are both numeric 
     if data[headers_x.value].dtype == np.float and data[headers_y.value].dtype == np.float: 
      init = list(['NumericVsNumeric']) 
      #if x is categorical and y is numeric 
     elif data[headers_x.value].dtype == np.object and data[headers_y.value].dtype == np.float: 
      init = list(['CategoricalVsNumeric']) 

    return init 


#define widgets 
headers_x = widgets.Dropdown(
     options=df_cols, 
     value=df_cols[0], 
     description='X' 
    ) 

headers_x.set_title = 'headers_x' 

headers_y = widgets.Dropdown(
     options=df_cols, 
     value=df_cols[0], 
     description='Y' 
    ) 

headers_y.set_title = 'headers_y' 

plotType = widgets.Dropdown(
     options=set_plotType(), 
     #value=df_cols[0], 
     description='Plot Type' 
    ) 

plotType.set_title = 'plotType' 


#interact function 
interact(set_plot, headers_x = headers_x, headers_y = headers_y, plotType = plotType) 

Antwort

1

Ich habe dies erreicht, indem Sie beobachten. Das bedeutet, dass sich die Drop-down-Optionen für die ersten beiden Optionen ändern und die Funktion set_Plottype ausführen.

Ich habe Ihre headers.x UND headers.y zu einem OR geändert, wie Sie beide definiert haben.

Ich gab Ihnen auch eine dritte Option für, wenn x numerisch und y kategorisch ist.

from ipywidgets import * 
import numpy as np 
import seaborn.apionly as sns 
df = sns.load_dataset('iris') 

#identifies the columns in the dataframe 
df_cols = list(df.columns.values) 
df_cols.insert(0, 'Select') 
str_cols = list(df.select_dtypes(include=['object']).columns.values) 
str_cols.insert(0, 'Select') 

#plot function 
def set_plot(headers_x, headers_y, plotType): 
    data = df 
    #plotting functions to be added 

#function to specify the type of plot based on users input 
def set_plotType(_): 
    data = df 
     #If no selection has been made 
    if headers_x.value == 'Select' or headers_y.value == 'Select': 
     plotType.options = list(['Make Selection']) 
    else: 
     #if x and y are both numeric 
     if data[headers_x.value].dtype == np.float and data[headers_y.value].dtype == np.float: 
      plotType.options = list(['NumericVsNumeric']) 
      #if x is categorical and y is numeric 
     elif data[headers_x.value].dtype == np.object and data[headers_y.value].dtype == np.float: 
      plotType.options = list(['CategoricalVsNumeric']) 
     elif data[headers_x.value].dtype == np.float and data[headers_y.value].dtype == np.object: 
      plotType.options = list(['NumericalVsCategoric']) 



#define widgets 
headers_x = widgets.Dropdown(
     options=df_cols, 
     value=df_cols[0], 
     description='X' 
    ) 

headers_x.set_title = 'headers_x' 

headers_y = widgets.Dropdown(
     options=df_cols, 
     value=df_cols[0], 
     description='Y' 
    ) 

headers_y.set_title = 'headers_y' 

plotType = widgets.Dropdown(
     options=[], 
     description='Plot Type' 
    ) 

headers_x.observe(set_plotType) 
headers_y.observe(set_plotType) 


#interact function 
interact(set_plot, headers_x = headers_x, headers_y = headers_y, plotType = plotType) 

enter image description here

+1

Das ist genau das, was ich suchte. Vielen Dank, @ ac24. Ich schätze es sehr. – user3550647