Как настроить виджеты для ссылки на массив для ноутбуков jupytern - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь настроить интерактивный блокнот, который отображает некоторые интерполированные данные GPS. У меня график работает сам по себе, но я пытаюсь использовать виджеты i python, чтобы сделать его более интерактивным для других.

В настоящее время мой график выглядит так

def create_grid(array,spacing=.01):
    '''
    creates evenly spaced grid from the min and max of an array
    '''
    grid = np.arange(np.amin(array), np.amax(array),spacing)
    return grid
def interpolate(x, y, z, grid_spacing = .01, model='spherical',returngrid = False):
    '''Interpolates z value and uses create_grid to create a grid of values based on min and max of x and y'''
    grid_x = create_grid(x,spacing = grid_spacing)
    grid_y = create_grid(y, spacing = grid_spacing)
    OK = OrdinaryKriging(x, y, z, variogram_model=model, verbose = False,\
                    enable_plotting=False, nlags = 20)
    z1, ss1 = OK.execute('grid', grid_x,grid_y,mask = False)
    print('Interpolation Complete')
    vals=np.ma.getdata(z1)
    sigma = np.ma.getdata(ss1)
    if returngrid == False:
        return vals,sigma
    else:
        return vals, sigma, grid_x, grid_y

mesh_x, mesh_y = np.meshgrid(grid_x,grid_y)
plot = plt.scatter(mesh_x, mesh_y, c = z1, cmap = cm.hsv)
cb = plt.colorbar(plot)
cb.set_label('Northing Change')

plt.show()

'' '

Это работает в настоящее время, но я пытаюсь настроить виджет для изменения модели вариограммы в интерполяция кригинга, а также изменение поля для интерполяции.

В настоящее время для этого у меня есть:

def update_plot(zfield,variogram):
    plt.clf()
    z1, ss1, grid_x,grid_y =interpolate(lon,lat,zfield,returngrid= True,model=variogram)
    mesh_x, mesh_y = np.meshgrid(grid_x,grid_y)
    plot = plt.scatter(mesh_x, mesh_y, c = z1, cmap = cm.hsv)
    cb = plot.colorbar(plot)
    cb.set_label('Interpolated Value')


variogram = widgets.Dropdown(options = ['linear',  'power',  'gaussian', 'spherical',  'exponential',  'hole-effect'],
                            value = 'spherical', description = "Variogram model for interpolation")
zfield = widgets.Dropdown(options = {'Delta N':delta_n, 'Delta E': delta_e,'Delta V':delta_v},value = 'Delta N', 
                          description = 'Interpolated value')
widgets.interactive(update_plot, variogram = variogram,zfield =zfield)

Что вызывает ошибку

TraitError: Неверный выбор: значение не найдено

значения delta_n, delta_e и delta_v - это массивы numpy. Я пробовал смотреть документацию, но она не так подробна, как документация по matplotlibs или что-то в этом роде, поэтому мне кажется, что я здесь как бы слепой.

Спасибо

1 Ответ

0 голосов
/ 07 мая 2020

В этой строке вы указываете возможные значения раскрывающегося списка как:

zfield = widgets.Dropdown(options = {'Delta N':delta_n, 'Delta E': delta_e,'Delta V':delta_v}

Когда используется отображение, значения dict интерпретируются как возможные варианты. Таким образом, value = 'Delta N' вызывает ошибку, поскольку это не одно из возможных значений раскрывающегося списка (хотя это один из ключей в сопоставлении dict). Я полагаю, вы хотите вместо этого value = delta_n.

...