Интерактивный сюжет Barchart - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь адаптировать пример Python Plotly для 'Добавление ползунков к анимации в Python' к диаграмме, но получаю сообщение "Поле рисунка недействительно".

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

grid layout

Который я использую со следующим кодом:

years = ['2007','2008','2009']
items = ['Name_1','Name_2']

col_name_template = '{column}'
for year in years:
    frame = {'data': [], 'name': str(year)}
    x_list = []
    y_list = []

    for item in items:
        x_list.append(grid.get_column_reference(col_name_template.format(column='name')))
        y_list.append(grid.get_column_reference(col_name_template.format(column=year)))

    frame['data'].append(go.Bar(
            x=x_list,
            y=y_list
    ))

    figure['frames'].append(frame)
    slider_step = {'args': [
        [year],
        {'frame': {'duration': 300, 'redraw': False},
         'mode': 'immediate',
       'transition': {'duration': 300}}
     ],
     'label': year,
     'method': 'animate'}
    sliders_dict['steps'].append(slider_step)

figure['layout']['sliders'] = [sliders_dict]

py.icreate_animations(figure, 'barchart example')

При попытке построения я получаю следующую ошибку:

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

Как использовать только привязки к сетке, а также обеспечить построение гистограммы, а не точечной диаграммы?

1 Ответ

1 голос
/ 12 марта 2019

Я использовал автономный метод построения plotly.offline.iplot, который не требует привязки к сетке. Единственный недостаток анимации с помощью гистограмм - это то, что переходы в настоящее время не поддерживаются.

Код ниже (включая кнопки и ползунок):

from plotly.offline import init_notebook_mode, iplot
from IPython.display import display, HTML

init_notebook_mode(connected = True)

years = ['2010', '2011', '2012']
items = ['A', 'B', 'C', 'D']
count = [
  [1, 2, 3, 4],
  [2, 3, 4, 1],
  [3, 4, 1, 2]
]

figure = {
  'data': [{
    'type': 'bar',
    'x': items,
    'y': count[0]
  }],
  'layout': {
    'xaxis': {
      'title': 'X',
      'gridcolor': '#FFFFFF',
      'linecolor': '#000',
      'linewidth': 1,
      'zeroline': False,
      'autorange': False
    },
    'yaxis': {
      'title': 'Y',
      'gridcolor': '#FFFFFF',
      'linecolor': '#000',
      'linewidth': 1,
      'range': [0, 5],
      'autorange': False
    },
    'title': 'Example Title',
    'hovermode': 'closest',
    'updatemenus': [{
      'type': 'buttons',
      'buttons': [{
          'label': 'Play',
          'method': 'animate',
          'args': [None, {
            'frame': {
              'duration': 500,
              'redraw': True
            },
            'fromcurrent': True,
            'transition': {
              'duration': 300,
              'easing': 'quadratic-in-out'
            }
          }]
        },
        {
          'label': 'End',
          'method': 'animate',
          'args': [None, {
            'frame': {
              'duration': 0,
              'redraw': True
            },
            'fromcurrent': True,
            'mode': 'immediate',
            'transition': {
              'duration': 0
            }
          }]
        }
      ],
      'direction': 'left',
      'pad': {
        'r': 10,
        't': 87
      },
      'showactive': False,
      'type': 'buttons',
      'x': 0.1,
      'xanchor': 'right',
      'y': 0,
      'yanchor': 'top'
    }]
  },
  'frames': []
}

sliders_dict = {
  'active': 0,
  'yanchor': 'top',
  'xanchor': 'left',
  'currentvalue': {
    'font': {
      'size': 20
    },
    'prefix': 'Year:',
    'visible': True,
    'xanchor': 'right'
  },
  'transition': {
    'duration': 300,
    'easing': 'cubic-in-out'
  },
  'pad': {
    'b': 10,
    't': 50
  },
  'len': 0.9,
  'x': 0.1,
  'y': 0,
  'steps': []
}

for index, year in enumerate(years):
    frame = {
        'data': [{
          'type': 'bar',
          'x': items,
          'y': count[index]
        }],
        'name': str(year)
        }
    figure['frames'].append(frame)

    slider_step = {
      'args': [
        [year],
        {
          'frame': {
            'duration': 300,
            'redraw': True
          },
          'mode': 'immediate',
          'transition': {
            'duration': 300
          }
        }
      ],
      'label': year,
      'method': 'animate'
    }
    sliders_dict['steps'].append(slider_step)

figure['layout']['sliders'] = [sliders_dict]

iplot(figure)
...