Plotly错误:'figure_or_data'参数无效

时间:2017-08-15 18:39:04

标签: python python-2.7 plot jupyter-notebook plotly

来自this plotly tutorial的动画示例无法使用Plotly 2.0.12。我把错误输出放在下面。有什么方法可以解决这个问题吗?我在Jupyter笔记本上使用了情节。

PlotlyError: Invalid 'figure_or_data' argument. Plotly will not be 
able to properly parse the resulting JSON. If you want to send this 
'figure_or_data' to Plotly anyway (not recommended), you can set 
'validate=False' as a plot option.  
Here's why you're seeing this error:

'slider' is not allowed in 'layout'

Path To Error: ['layout']['slider']

Valid attributes for 'layout' at path ['layout'] under parents 
['figure']:

['angularaxis', 'annotations', 'autosize', 'bargap', 'bargroupgap',
'barmode', 'barnorm', 'boxgap', 'boxgroupgap', 'boxmode', 'calendar',
'direction', 'dragmode', 'font', 'geo', 'height', 'hiddenlabels',
'hiddenlabelssrc', 'hidesources', 'hoverlabel', 'hovermode', 
'images',
'legend', 'mapbox', 'margin', 'orientation', 'paper_bgcolor',
'plot_bgcolor', 'radialaxis', 'scene', 'separators', 'shapes',
'showlegend', 'sliders', 'smith', 'ternary', 'title', 'titlefont',
'updatemenus', 'width', 'xaxis', 'yaxis']

Run `<layout-object>.help('attribute')` on any of the above.
'<layout-object>' is the object at ['layout']
编辑:注意到链接已损坏。这是完整的代码:

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

import pandas as pd

init_notebook_mode(connected=True)

url = 'https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv'
dataset = pd.read_csv(url)

years = ['1952', '1962', '1967', '1972', '1977', '1982', '1987', '1992', '1997', '2002', '2007']
# make list of continents
continents = []
for continent in dataset['continent']:
    if continent not in continents:
        continents.append(continent)
# make figure
figure = {
    'data': [],
    'layout': {},
    'frames': [],
    'config': {'scrollzoom': True}
}

# fill in most of layout
figure['layout']['xaxis'] = {'range': [30, 85], 'title': 'Life Expectancy'}
figure['layout']['yaxis'] = {'title': 'GDP per Capita', 'type': 'log'}
figure['layout']['hovermode'] = 'closest'
figure['layout']['slider'] = {
    'args': [
        'slider.value', {
            'duration': 400,
            'ease': 'cubic-in-out'
        }
    ],
    'initialValue': '1952',
    'plotlycommand': 'animate',
    'values': years,
    'visible': True
}
figure['layout']['updatemenus'] = [
    {
        'buttons': [
            {
                'args': [None, {'frame': {'duration': 500, 'redraw': False},
                         'fromcurrent': True, 'transition': {'duration': 300, 'easing': 'quadratic-in-out'}}],
                'label': 'Play',
                'method': 'animate'
            },
            {
                'args': [[None], {'frame': {'duration': 0, 'redraw': False}, 'mode': 'immediate',
                'transition': {'duration': 0}}],
                'label': 'Pause',
                'method': 'animate'
            }
        ],
        'direction': 'left',
        'pad': {'r': 10, 't': 87},
        'showactive': False,
        'type': 'buttons',
        'x': 0.1,
        'xanchor': 'right',
        'y': 0,
        'yanchor': 'top'
    }
]

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': []
}

# make data 
year = 1952
for continent in continents:
    dataset_by_year = dataset[dataset['year'] == year]
    dataset_by_year_and_cont = 
dataset_by_year[dataset_by_year['continent'] == continent]

    data_dict = {
        'x': list(dataset_by_year_and_cont['lifeExp']),
        'y': list(dataset_by_year_and_cont['gdpPercap']),
        'mode': 'markers',
        'text': list(dataset_by_year_and_cont['country']),
        'marker': {
            'sizemode': 'area',
            'sizeref': 200000,
            'size': list(dataset_by_year_and_cont['pop'])
        },
        'name': continent
    }
    figure['data'].append(data_dict)

# make frames
for year in years:
    frame = {'data': [], 'name': str(year)}
    for continent in continents:
        dataset_by_year = dataset[dataset['year'] == int(year)]
        dataset_by_year_and_cont = 
dataset_by_year[dataset_by_year['continent'] == continent]

        data_dict = {
            'x': list(dataset_by_year_and_cont['lifeExp']),
            'y': list(dataset_by_year_and_cont['gdpPercap']),
            'mode': 'markers',
            'text': list(dataset_by_year_and_cont['country']),
            'marker': {
                'sizemode': 'area',
                'sizeref': 200000,
                'size': list(dataset_by_year_and_cont['pop'])
            },
            'name': continent
        }
        frame['data'].append(data_dict)

    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]

iplot(figure)

我不知道是否必须降级版本(以及万一),但我不愿意。

1 个答案:

答案 0 :(得分:1)

我验证了您的代码并发现了一些错误。

  1. 第29行你应该给出
  2. figure['layout']['sliders']代替figure['layout']['slider']

    1. Plotly offline&iplot函数有一个单独的输入配置图的参数。
    2. 所以下面的行

      # make figure
      figure = {
          'data': [],
          'layout': {},
          'frames': [],
          'config': {'scrollzoom': True}
      }
      

      和行

      iplot(figure)
      

      实际上应该写成

      # make figure
      figure = {
          'data': [],
          'layout': {},
          'frames': []
      }
      config = {'scrollzoom': True}
      

      iplot(figure, config=config)
      

      所以最终的工作代码应该是

      from plotly.offline import init_notebook_mode, iplot
      from IPython.display import display, HTML
      
      import pandas as pd
      
      init_notebook_mode(connected=True)
      
      url = 'https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv'
      dataset = pd.read_csv(url)
      
      years = ['1952', '1962', '1967', '1972', '1977', '1982', '1987', '1992', '1997', '2002', '2007']
      # make list of continents
      continents = []
      for continent in dataset['continent']:
          if continent not in continents:
              continents.append(continent)
      # make figure
      figure = {
          'data': [],
          'layout': {},
          'frames': []
      }
      config = {'scrollzoom': True}
      
      # fill in most of layout
      figure['layout']['xaxis'] = {'range': [30, 85], 'title': 'Life Expectancy'}
      figure['layout']['yaxis'] = {'title': 'GDP per Capita', 'type': 'log'}
      figure['layout']['hovermode'] = 'closest'
      figure['layout']['sliders'] = {
          'args': [
              'slider.value', {
                  'duration': 400,
                  'ease': 'cubic-in-out'
              }
          ],
          'initialValue': '1952',
          'plotlycommand': 'animate',
          'values': years,
          'visible': True
      }
      figure['layout']['updatemenus'] = [
          {
              'buttons': [
                  {
                      'args': [None, {'frame': {'duration': 500, 'redraw': False},
                               'fromcurrent': True, 'transition': {'duration': 300, 'easing': 'quadratic-in-out'}}],
                      'label': 'Play',
                      'method': 'animate'
                  },
                  {
                      'args': [[None], {'frame': {'duration': 0, 'redraw': False}, 'mode': 'immediate',
                      'transition': {'duration': 0}}],
                      'label': 'Pause',
                      'method': 'animate'
                  }
              ],
              'direction': 'left',
              'pad': {'r': 10, 't': 87},
              'showactive': False,
              'type': 'buttons',
              'x': 0.1,
              'xanchor': 'right',
              'y': 0,
              'yanchor': 'top'
          }
      ]
      
      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': []
      }
      
      # make data 
      year = 1952
      for continent in continents:
          dataset_by_year = dataset[dataset['year'] == year]
          dataset_by_year_and_cont=dataset_by_year[dataset_by_year['continent'] == continent]
      
          data_dict = {
              'x': list(dataset_by_year_and_cont['lifeExp']),
              'y': list(dataset_by_year_and_cont['gdpPercap']),
              'mode': 'markers',
              'text': list(dataset_by_year_and_cont['country']),
              'marker': {
                  'sizemode': 'area',
                  'sizeref': 200000,
                  'size': list(dataset_by_year_and_cont['pop'])
              },
              'name': continent
          }
          figure['data'].append(data_dict)
      
      # make frames
      for year in years:
          frame = {'data': [], 'name': str(year)}
          for continent in continents:
              dataset_by_year = dataset[dataset['year'] == int(year)]
      
              dataset_by_year_and_cont=dataset_by_year[dataset_by_year['continent'] == continent]
      
              data_dict = {
                  'x': list(dataset_by_year_and_cont['lifeExp']),
                  'y': list(dataset_by_year_and_cont['gdpPercap']),
                  'mode': 'markers',
                  'text': list(dataset_by_year_and_cont['country']),
                  'marker': {
                      'sizemode': 'area',
                      'sizeref': 200000,
                      'size': list(dataset_by_year_and_cont['pop'])
                  },
                  'name': continent
              }
              frame['data'].append(data_dict)
      
          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]
      
      iplot(figure, config=config)
      

      我希望这可以帮助您解决问题,滑块看起来很棒:)