互动式密谋条形图

时间:2019-03-06 14:58:46

标签: python bar-chart plotly plotly-python

我正在尝试将'Adding Sliders to Animations in Python'上的Python Plotly示例改编为条形图,但收到“图形字段无效”消息。

我试图修改输入数据以反映条形图而不是散点图(在示例中使用)。我已经创建了一个网格:

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 个答案:

答案 0 :(得分:1)

我使用了离线绘制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)