Python Plotly - несколько раскрывающихся графиков, каждый из которых имеет вложенные участки - PullRequest
0 голосов
/ 24 мая 2018

Проблема

Я пытаюсь объединить две функции Python Plotly.Одним из них является раскрывающееся меню, в котором пользователь может переключаться между графиками ( ссылка на примеры ).Другая функция - это вспомогательные сюжеты.

Моя попытка

У меня есть рабочий код, который использует раскрывающееся меню, но в нем нет вспомогательных сюжетов.Итак, я посмотрел, как создать подзаговоры здесь , и подумал, что могу относиться к фигуре tools.make_subplots так же, как к фигуре go.Box.Извините, если это кажется наивным, я на самом деле довольно плохо знаком с Plotly.

Однако эта попытка не работает вообще, я вижу рост двух исключений, которые я поместил в самом низу..

Мой рабочий код (без дочерних участков)

# NOTE: This code goes in between 'START' and 'END' below
traces = []
for data in datas:
    traces.append(go.Box(
                            x=data.index,
                            y=data.values, 
                            showlegend=False
                        ))

Мой код вспомогательного участка

import plotly.offline as py
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot, plot
from plotly import tools
init_notebook_mode(connected=True)

### Create individual figures
# START
traces = []
for data in datas:
    fig = tools.make_subplots(rows=1, cols=2)

    trace1 = go.Box(
                    x=data.head(10).index,
                    y=data.head(10).values, 
                    showlegend=False
                )
    trace2 = go.Box(
                    x=data.tail(10).index,
                    y=data.tail(10).values, 
                    showlegend=False
                )   
    fig.append_trace(trace1, 1, 1)
    fig.append_trace(trace2, 1, 2)
    traces.append(fig)
# END

### Create buttons for drop down menu
buttons = []
for i, label in enumerate(labels):
    visibility = [i==j for j in range(len(labels))]
    button = dict(
                 label =  label,
                 method = 'update',
                 args = [{'visible': visibility},
                     {'title': label}])
    buttons.append(button)

updatemenus = list([
    dict(active=-1,
         x=-0.15,
         buttons=buttons
    )
])

layout = dict(title='Title', 
              showlegend=False,
              updatemenus=updatemenus)

fig = dict(data=traces, layout=layout)

iplot(fig, filename='dropdown')

Ошибка 1

'layout' isне допускается в 'scatter'

Путь к ошибке: ['data'] [0] ['layout']

Ошибка 2

PlotlyError: Неверный аргумент figure_or_data.Plotly не сможет
правильно проанализировать полученный JSON.Если вы хотите отправить эту 'figure_or_data' в Plotly в любом случае (не рекомендуется), вы можете установить 'validate = False' в качестве опции графика.

Вот почему вы видите эту ошибку:

'layout' не разрешен в 'scatter'

...

ПРИМЕЧАНИЕ. Когда я передаю validate = False в качестве опции графика, все, что я вижу, это пустой график сфункциональность раскрывающегося меню

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Нарен прав, нужно сделать только одну фигуру.И чтобы создать эффект выпадающего меню, вам просто нужно добавить две трассы в одну и ту же позицию следующим образом ..

fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 1)

Рабочий код

import plotly.offline as py
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot, plot
from plotly import tools
init_notebook_mode(connected=True)

x = [i for i in range(100)]
df_1 = pd.DataFrame([(i, 1+i) for i in range(100)], columns=["X", "Y"])
df_2 = pd.DataFrame([(i, i*i) for i in range(100)], columns=["X", "Y"])
labels = ["Plus one", "Square"]

### Create individual figures
# START
fig = tools.make_subplots(rows=1, cols=2)

trace1 = go.Bar(
                x=df_1.head(10).X,
                y=df_1.head(10).Y, 
                showlegend=False
            )
trace2 = go.Bar(
                x=df_2.head(10).X,
                y=df_2.head(10).Y, 
                showlegend=False
            )

fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 1)

trace1 = go.Bar(
                x=df_1.tail(10).X,
                y=df_1.tail(10).Y, 
                showlegend=False
            )
trace2 = go.Bar(
                x=df_2.tail(10).X,
                y=df_2.tail(10).Y, 
                showlegend=False
            )   
fig.append_trace(trace1, 1, 2)
fig.append_trace(trace2, 1, 2)
# END

### Create buttons for drop down menu
buttons = []
for i, label in enumerate(labels):
    visibility = [i==j for j in range(len(labels))]
    button = dict(
                 label =  label,
                 method = 'update',
                 args = [{'visible': visibility},
                     {'title': label}])
    buttons.append(button)

updatemenus = list([
    dict(active=-1,
         x=-0.15,
         buttons=buttons
    )
])

fig['layout']['title'] = 'Title'
fig['layout']['showlegend'] = False
fig['layout']['updatemenus'] = updatemenus

iplot(fig, filename='dropdown')

Спасибо

Так много, чтобы Нарен Мурали за вашу помощь!Небольшое редактирование вашего кода дало мне ответ.

Я хотел создать это .. enter image description here enter image description here

Однако вашКод дал мне эти участки ... enter image description here enter image description here

0 голосов
/ 28 мая 2018

Я думаю, что вы неправильно поняли понятие подзаговоров, причина, по которой вы получаете ошибку, заключается в том, что функция make_subplots() создаст собственный объект layout, следовательно, вы получаете ошибку.

'layout' is not allowed in 'scatter'

Path To Error: ['data'][0]['layout']

Правильный способ изменить компоновку субплота - создать субплот, получить доступ к свойствам отдельного объекта и установить их, как показано ниже.

updatemenus = list([
    dict(active=-1,
         x=-0.15,
         buttons=buttons
    )
])

fig['layout']['title'] = 'Title'
fig['layout']['showlegend'] = False
fig['layout']['updatemenus'] = updatemenus

Также вы создаете новый объект субплотакаждый раз при запуске цикла for, который неправильный .Я говорю о приведенной ниже строке.

traces = []
for data in datas:
    fig = tools.make_subplots(rows=1, cols=2)

Вам нужно назначить его только один раз, пожалуйста, обратитесь к приведенному ниже рабочему примеру и попробуйте реализовать тот же метод в вашем сценарии использования.

import plotly.offline as py
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot, plot
from plotly import tools
init_notebook_mode(connected=True)
df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=["A", "B"])
labels = ["A", "B"]
datas = [df, df]
### Create individual figures
# START
fig = tools.make_subplots(rows=2, cols=2)

for i, data in enumerate(datas):

    trace1 = go.Bar(
                    x=data.head(10).A,
                    y=data.head(10).B, 
                    showlegend=False
                )
    trace2 = go.Bar(
                    x=data.tail(10).A,
                    y=data.tail(10).B, 
                    showlegend=False
                )   
    fig.append_trace(trace1, i + 1, 1)
    fig.append_trace(trace2, i + 1, 2)

### Create buttons for drop down menu
buttons = []
for i, label in enumerate(labels):
    visibility = [i==j for j in range(len(labels))]
    button = dict(
                 label =  label,
                 method = 'update',
                 args = [{'visible': visibility},
                     {'title': label}])
    buttons.append(button)

updatemenus = list([
    dict(active=-1,
         x=-0.15,
         buttons=buttons
    )
])

fig['layout']['title'] = 'Title'
fig['layout']['showlegend'] = False
fig['layout']['updatemenus'] = updatemenus

iplot(fig, filename='dropdown')

Пожалуйста, дайте мне знать, если это решит вашу проблему!

...