Виджет IPython, передача аргументов во внутренние функции - PullRequest
0 голосов
/ 24 августа 2018

В качестве минимального примера я просто рисую векторы при использовании pyplot.quiver и хотел бы передать степень вращения в виде ползунка с плавающей точкой:

import numpy as np
import matplotlib.pyplot as plt

def rotvec(vec, deg=0):
    rotmat= np.asarray([[np.cos(deg), -np.sin(deg)],[np.sin(deg), np.cos(deg)]])
    return np.matmul(rotmat,vec)

def drawvec(x,y):
    plt.plot()
    plt.quiver(0,0,x,y,angles='xy', scale_units='xy', scale=1)
    plt.xlim(xmin=-2, xmax=2)
    plt.ylim(ymin=-2, ymax=2)
    plt.show()

Теперь, если мы сделаем: drawvec(*rotvec([1,0], np.pi/4)), мы получимфигура, как и ожидалось.

enter image description here

Есть ли способ сделать что-то вроде ниже, чтобы передать аргумент внутренней функции (ниже не работает):

from ipywidgets import interactive, FloatSlider
from IPython.display import display
from functools import partial

deg = FloatSlider(min=0, max=6.4, value=0)
interactive_plot = interactive(drawvec(*rotvec([1,0])), deg=deg)

Я знаю, что могу написать новую функцию:

def rotndraw(vec, deg=0):
    rotated = rotvec(vec,deg)
    drawvec(*rotated)

и вызвать ее вместо этого с фиксированным вектором и ползунком с плавающей точкой:

enter image description here

Но я хочу избежать дополнительной функции, которая выставляет аргумент .Это возможно?Может быть с functools.partial?Я не смог заставить его работать.

Причина: Я хочу не писать обертку для предоставления этого параметра, потому что в моей реальной задаче я делаю серию преобразований с количеством вызовов функций, но единственным параметром (-ами)Я хочу интерактивно манипулировать, возможно, одним из внутренних вызовов функций.И писать разные обертки для выставления разных параметров каждый раз, когда я исследую это, кажется громоздким.

...