Обновить выпадающий список ipywidget из функции в python

Я новичок в Python и хочу создать интерактивный выпадающий список из ipywidget. Основная цель — обновить выпадающий список на основе двух других виджетов. В приведенном ниже коде виджет plotType будет обновляться на основе ввода из виджетов headers_x и headers_y (оба относятся к выбранным столбцам фрейма данных). для построения). Если и headers_x, и headers_y имеют параметр Выбрать, то plotType должен показывать "Выбрать ". Но если для headers_x и headers_y выбраны другие параметры (столбцы из фрейма данных), то plotType необходимо соответствующим образом изменить. Если headers_x и headers_y являются числовыми, то plotType должен показывать: numericVsNumeric, но если headers_y >headers_x является категориальным, а headers_y является числовым, тогда plotType должен показывать «categoricalVsNumeric». Я попытался решить проблему следующим образом: но параметры в виджете 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)

person user3550647    schedule 26.12.2017    source источник


Ответы (1)


Я достиг этого с помощью наблюдения. Это означает, что всякий раз, когда ваши два верхних параметра раскрывающегося списка меняются, они будут запускать функцию set_Plottype.

Я изменил ваши headers.x AND 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)

введите описание изображения здесь

person ac24    schedule 19.01.2018
comment
Это именно то, что я искал. Большое спасибо, @ac24. Я очень ценю это. - person user3550647; 06.02.2018