在python中从函数更新ipywidget下拉列表

在python中从函数更新ipywidget下拉列表,python,widget,dropdown,ipywidgets,Python,Widget,Dropdown,Ipywidgets,我是Python新手,我想从ipywidget创建一个交互式下拉列表。主要目的是基于其他两个小部件更新下拉列表。在下面的代码中,小部件plotType将根据小部件headers\u x和headers\u y的输入进行更新(两者都指为打印选择的数据框列)。如果标题_x和标题_y都有选择选项,则绘图类型需要显示“进行选择”。但是如果标题x和标题y选择了其他选项(数据框中的列),则需要相应地更改绘图类型。如果标题x和标题y都是数字,则绘图类型需要显示:numericVsNumeric,但如果标题x是

我是Python新手,我想从ipywidget创建一个交互式下拉列表。主要目的是基于其他两个小部件更新下拉列表。在下面的代码中,小部件plotType将根据小部件headers\u xheaders\u y的输入进行更新(两者都指为打印选择的数据框列)。如果标题_x标题_y都有选择选项,则绘图类型需要显示“进行选择”。但是如果标题x标题y选择了其他选项(数据框中的列),则需要相应地更改绘图类型。如果标题x标题y都是数字,则绘图类型需要显示:numericVsNumeric,但如果标题x是分类的,标题y是数字的,然后,plotType需要显示“catergoricalVsNumeric”,我尝试了以下解决方案,但plotType小部件中的选项不更新。非常感谢您的帮助。多谢各位

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)

我通过使用observe实现了这一点。这意味着,无论您的前两个下拉选项何时更改,它们都将运行“设置绘图类型”功能

我将您的headers.x和headers.y更改为OR,因为您需要同时定义它们

我也给了你第三个选择,当x是数字,y是分类的

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)

这正是我想要的。非常感谢,@ac24。我真的很感激。