Jupyter Lab Интерактивный график: неподдерживаемые типы операндов для *: 'FloatSlider' и 'float' - PullRequest
0 голосов
/ 24 октября 2018

Я слежу за видео, чтобы узнать, как использовать плоттер для создания интерактивных графиков, но я продолжал получать сообщение об ошибке: неподдерживаемые типы операндов для *: 'FloatSlider' и 'float'.

Я почти уверен, что остальные части верны, оригинальный репетитор выполнил его хорошо, но в моей лаборатории на jupyter у него проблемы.

Вот коды:

import plotly as py
import plotly.graph_objs as go
import ipywidgets as widgets
import numpy as np
from scipy import special

py.offline.init_notebook_mode(connected=True)
x = np.linspace(0, np.pi, 1000)

# Then layout the graph object in plotly
# Every object starts in a new line in the layout of plotly graph_objs
layout = go.Layout(
    # The title of the layout
    title = "Simple Example of Plotly",
    # Y axis, everything goes into a dict type, same of X axis
    yaxis = dict(
        title = "volts"
    ),
    xaxis = dict(
        title = "nanoseconds"
    )
)

# Now get a function with widgets using signals and frequency
# Put the trace into the function
def update_plot(signals, frequency):

    # Get a data list to put all traces in
    data = []
    for s in signals:
        # Put traces inside the function's loop
        trace1 = go.Scatter(
            x = x,
            n = freq * x,
            # Update y value using scipy's special's bessel functions
            y = special.jv(s, n),
            # Scatter has three modes, marker, lines, marker+lines
            mode = "lines",
            # Set a name
            name = "bessel {}".format(s),
            # Set up the interpolation, how the dots are connected with lines
            # line is going to be a dict
            line = dict(
                shape = "spline"
            )
        )
        data.append(trace1)

        # Plotting also goes in the function
        fig = go.Figure(data = data, layout=layout)
        # Finally show it
        py.offline.iplot(fig)

# Once the function is done, we create the widget
# Value in signals should be a tuple
signals = widgets.SelectMultiple(options = list(range(6)), value = (0,), 
description="Bessel Order")

# Make a freq
freq = widgets.FloatSlider(min = 1, max = 20, value = 1, description="Freq")

# Finally make the interaction
widgets.interactive(update_plot, signals = signals, frequency = freq)

Кто-нибудь знает, как это решить?Кажется, что функция special.jv (x, y) не принимает операнд *?Но даже если я создал другую переменную n = freq * x, она все равно сообщает об ошибке.Большое спасибо.

1 Ответ

0 голосов
/ 24 октября 2018

Когда вы сообщаете об ошибке в Python, вы должны включить в вопрос трассировку complete (т.е. полное сообщение об ошибке).Во всех этих выходных данных содержится полезная информация, включая информацию о том, какая именно строка вызвала ошибку.

Здесь эта строка выглядит как n = freq * x.Вы создали freq как freq = widgets.FloatSlider(min = 1, max = 20, value = 1, description="Freq"), поэтому freq является FloatSlider объектом.Другой операнд, x, является пустым массивом.Очевидно, для этих операндов не определена операция умножения.То есть Python не знает, как умножить массив FloatSlider и numpy.

Чтобы получить фактическое значение FloatSlider, чтобы вы могли выполнять с ним арифметику, используйте атрибут value.Изменить n = freq * x на

n = freq.value * x
...