Я пытаюсь создать один слайдер, который управляет двумя трассировками, используя Python 3 и Plotly.Я использую Spyder, хотя я также попробовал тот же код, измененный для Jupyter, но безуспешно
Это пример кода:
import numpy as np
#import pandas as pd
#import matplotlib.pyplot as plt
import plotly as py
import plotly.graph_objs as go
#import ipywidgets as widgets
py.offline.init_notebook_mode(connected=True)
'''
Plot traces
'''
trace1 = [dict(
type = 'scatter',
visible = False,
name='Demand',
x = np.arange(0,365,1),
y = np.sin(step*np.arange(0,365,1))) for step in range(0,365,1)]
trace2 = [dict(
type = 'scatter',
visible = False,
name='Demand',
x = np.arange(0,365,1),
y = np.sin(step*np.arange(0,365,1)) + 5) for step in range(0,365,1)]
#data = trace2
data = [list(a) for a in zip(trace1, trace2)]
steps = []
for i in range(len(data)):
step = dict(
method = 'restyle',
args = ['visible', [False] * len(data)],
label = ""
)
step['args'][1][i] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders = [dict(
active = 10,#What's happening here?
currentvalue = {"prefix": "Day: "}, #????
#pad = {"t": 50},
steps = steps
)]
#Add styling
layout = go.Layout(sliders=sliders,
title='Sample slider plot',
xaxis=dict(
title=‘Test’,
titlefont=dict(
family='Courier New, monospace',
size=18,
color='#7f7f7f'
)
),
yaxis=dict(
title=‘Unit’,
titlefont=dict(
family='Courier New, monospace',
size=18,
color='#7f7f7f'
)
)
)
fig = go.Figure(data=data, layout=layout)
py.offline.plot(fig, filename='Test3')
Если я строю одну из трасс отдельно, то есть
data = trace1
, она работает.Однако, как только я объединяю trace1 и trace2, то есть
data = [list(a) for a in zip(trace1, trace2)]
, я получаю следующую ошибку:
The 'data' property is a tuple of trace instances
that may be specified as:
- A list or tuple of trace instances
(e.g. [Scatter(...), Bar(...)])
- A list or tuple of dicts of string/value properties where:
- The 'type' property specifies the trace type
One of: ['area', 'bar', 'barpolar', 'box',
'candlestick', 'carpet', 'choropleth', 'cone',
'contour', 'contourcarpet', 'heatmap',
'heatmapgl', 'histogram', 'histogram2d',
'histogram2dcontour', 'mesh3d', 'ohlc',
'parcats', 'parcoords', 'pie', 'pointcloud',
'sankey', 'scatter', 'scatter3d',
'scattercarpet', 'scattergeo', 'scattergl',
'scattermapbox', 'scatterpolar',
'scatterpolargl', 'scatterternary', 'splom',
'streamtube', 'surface', 'table', 'violin']
- All remaining properties are passed to the constructor of
the specified trace type
(e.g. [{'type': 'scatter', ...}, {'type': 'bar, ...}])
Проверка типа (trace1) показывает, что каждая трасса представляет собой список из 365 объектов dict,с которым сюжетно справиться.Однако, как только я объединяю трассировки в объект «данные», как описано выше, я получаю список списков, которые он не может.
Итак, мой вопрос: как мне скомбинировать trace1 и trace2 в объект, который имеет правильную длину для шагов ползунка (т.е. 365) и с которым может плотно работать - например, список диктов илиэкземпляры трассировки, а не список списков?
Я смотрел на сюжетно - несколько трассировок с использованием общей переменной ползунка , а также Plot.ly.Использование ползунка с несколькими участками .К сожалению, успеха не было.Первая ссылка работает, если объекты трассировки являются диктатами, но не в том случае, если вам нужно заключить их в квадратные скобки, чтобы создать список для цикла for.Вторая ссылка просто добавляет trace1 + trace2 для создания объекта с длиной индекса 730, то есть последовательно соединяет две трассы, а не отображает их вместе.
Заранее большое спасибо за помощь!