Puply icreate_animations在Jupyter Notebook上脱机

时间:2017-08-20 10:04:23

标签: python python-2.7 jupyter-notebook plotly

我正在尝试使用与示例中给出的数据集匹配的Jupyter Notebook复制this plotly tutorial,我只需要更改一列的名称。这里的问题是离线命令

py.icreate_animations(figure)

在离线笔记本模式下变为

icreate_animations(figure)

无法识别。此外,如果我只是尝试     IPLOT(图) 命令,我用于静态图,引发了很长的错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-b81a66612f63> in <module>()
     38 figure['layout']['sliders'] = [sliders_dict]
     39 
---> 40 iplot(figure)

//anaconda/lib/python2.7/site-packages/plotly/offline/offline.pyc in iplot(figure_or_data, show_link, link_text, validate, image, filename, image_width, image_height, config)
    330     config.setdefault('linkText', link_text)
    331 
--> 332     figure = tools.return_figure_from_figure_or_data(figure_or_data, validate)
    333 
    334     # Though it can add quite a bit to the display-bundle size, we include

//anaconda/lib/python2.7/site-packages/plotly/tools.pyc in return_figure_from_figure_or_data(figure_or_data, validate_figure)
   1383 
   1384         try:
-> 1385             graph_objs.Figure(figure)
   1386         except exceptions.PlotlyError as err:
   1387             raise exceptions.PlotlyError("Invalid 'figure_or_data' argument. "

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
   1159 
   1160     def __init__(self, *args, **kwargs):
-> 1161         super(Figure, self).__init__(*args, **kwargs)
   1162         if 'data' not in self:
   1163             self.data = Data(_parent=self, _parent_key='data')

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
    375         d = {key: val for key, val in dict(*args, **kwargs).items()}
    376         for key, val in d.items():
--> 377             self.__setitem__(key, val, _raise=_raise)
    378 
    379     def __dir__(self):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __setitem__(self, key, value, _raise)
    430 
    431         if self._get_attribute_role(key) == 'object':
--> 432             value = self._value_to_graph_object(key, value, _raise=_raise)
    433             if not isinstance(value, (PlotlyDict, PlotlyList)):
    434                 return

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in _value_to_graph_object(self, key, value, _raise)
    541         # this can be `None` when `_raise == False`
    542         return GraphObjectFactory.create(key, value, _raise=_raise,
--> 543                                          _parent=self, _parent_key=key)
    544 
    545     def help(self, attribute=None, return_help=False):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in create(object_name, *args, **kwargs)
    791         class_name = graph_reference.OBJECT_NAME_TO_CLASS_NAME.get(object_name)
    792         if class_name in ['Figure', 'Data', 'Frames']:
--> 793             return globals()[class_name](*args, **kwargs)
    794         else:
    795             kwargs['_name'] = object_name

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
    156 
    157         for index, value in enumerate(list(*args)):
--> 158             value = self._value_to_graph_object(index, value, _raise=_raise)
    159 
    160             if isinstance(value, PlotlyBase):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in _value_to_graph_object(self, index, value, _raise)
   1291             return value
   1292         return super(Frames, self)._value_to_graph_object(index, value,
-> 1293                                                           _raise=_raise)
   1294 
   1295     def to_string(self, level=0, indent=4, eol='\n',

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in _value_to_graph_object(self, index, value, _raise)
    221                 return GraphObjectFactory.create(item, _raise=_raise,
    222                                                  _parent=self,
--> 223                                                  _parent_key=index, **value)
    224             except exceptions.PlotlyGraphObjectError:
    225                 if i == len(items) and _raise:

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in create(object_name, *args, **kwargs)
    797                 return PlotlyList(*args, **kwargs)
    798             else:
--> 799                 return PlotlyDict(*args, **kwargs)
    800 
    801 

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
    375         d = {key: val for key, val in dict(*args, **kwargs).items()}
    376         for key, val in d.items():
--> 377             self.__setitem__(key, val, _raise=_raise)
    378 
    379     def __dir__(self):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __setitem__(self, key, value, _raise)
    430 
    431         if self._get_attribute_role(key) == 'object':
--> 432             value = self._value_to_graph_object(key, value, _raise=_raise)
    433             if not isinstance(value, (PlotlyDict, PlotlyList)):
    434                 return

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in _value_to_graph_object(self, key, value, _raise)
    541         # this can be `None` when `_raise == False`
    542         return GraphObjectFactory.create(key, value, _raise=_raise,
--> 543                                          _parent=self, _parent_key=key)
    544 
    545     def help(self, attribute=None, return_help=False):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in create(object_name, *args, **kwargs)
    791         class_name = graph_reference.OBJECT_NAME_TO_CLASS_NAME.get(object_name)
    792         if class_name in ['Figure', 'Data', 'Frames']:
--> 793             return globals()[class_name](*args, **kwargs)
    794         else:
    795             kwargs['_name'] = object_name

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
    156 
    157         for index, value in enumerate(list(*args)):
--> 158             value = self._value_to_graph_object(index, value, _raise=_raise)
    159 
    160             if isinstance(value, PlotlyBase):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in _value_to_graph_object(self, index, value, _raise)
   1059         return GraphObjectFactory.create(item, _raise=_raise,
   1060                                          _parent=self,
-> 1061                                          _parent_key=index, **value)
   1062 
   1063     def get_data(self, flatten=False):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in create(object_name, *args, **kwargs)
    797                 return PlotlyList(*args, **kwargs)
    798             else:
--> 799                 return PlotlyDict(*args, **kwargs)
    800 
    801 

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __init__(self, *args, **kwargs)
    375         d = {key: val for key, val in dict(*args, **kwargs).items()}
    376         for key, val in d.items():
--> 377             self.__setitem__(key, val, _raise=_raise)
    378 
    379     def __dir__(self):

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs.pyc in __setitem__(self, key, value, _raise)
    400         if key.endswith('src'):
    401             if key in self._get_valid_attributes():
--> 402                 value = graph_objs_tools.assign_id_to_src(key, value)
    403                 return super(PlotlyDict, self).__setitem__(key, value)
    404 

//anaconda/lib/python2.7/site-packages/plotly/graph_objs/graph_objs_tools.pyc in assign_id_to_src(src_name, src_value)
    254     if src_id == '':
    255         err = exceptions.COLUMN_NOT_YET_UPLOADED_MESSAGE
--> 256         err.format(column_name=src_value.name, reference=src_name)
    257         raise exceptions.InputError(err)
    258     return src_id

AttributeError: 'str' object has no attribute 'name'

那么,有没有人知道如何在离线模式下制作该剧情?

编辑:我上传了整个代码:

import pandas as pd
import numpy as np
from __future__ import division
import plotly.plotly as py
from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
from plotly.graph_objs import *
init_notebook_mode()

from plotly.grid_objs import Grid, Column
from plotly.tools import FigureFactory as FF 

dataset=pd.read_csv('gdp_mod_copia.csv')

years_from_col = set(dataset['year'])
years_ints = sorted(list(years_from_col))
years = [str(year) for year in years_ints]


# make list of continents
continents = []
for continent in dataset['continent']:
    if continent not in continents: 
        continents.append(continent)

columns = []
# make grid
for year in years:
    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]
        for col_name in dataset_by_year_and_cont:
            # each column name is unique
            column_name = '{year}+{continent}+{header}_grid'.format(
                year=year, continent=continent, header=col_name
            )
            a_column = Column(list(dataset_by_year_and_cont[col_name]), column_name)
            columns.append(a_column)

grid = Grid(columns)



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

# fill in most of layout
figure['layout']['xaxis'] = {'range': [30, 85], 'title': 'Life Expectancy', 'gridcolor': '#FFFFFF'}
figure['layout']['yaxis'] = {'title': 'GDP per Capita', 'type': 'log', 'gridcolor': '#FFFFFF'}
figure['layout']['hovermode'] = 'closest'
figure['layout']['plot_bgcolor'] = 'rgb(223, 232, 243)'
figure['layout']['slider'] = {
    'args': [
        'slider.value', {
            'duration': 400,
            'ease': 'cubic-in-out'
        }
    ],
    'initialValue': '2007',
    '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': []
}


custom_colors = {
    'Asia': 'rgb(171, 99, 250)',
    'Europe': 'rgb(230, 99, 250)',
    'Africa': 'rgb(99, 110, 250)',
    'Americas': 'rgb(25, 211, 243)',
    #'Oceania': 'rgb(9, 255, 255)' 
    'Oceania': 'rgb(50, 170, 255)'
}

col_name_template = '{year}+{continent}+{header}_grid'
year = 2007
for continent in continents:
    data_dict = {
        'xsrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='GDP_per_capita'
        )),
        'ysrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='Life_satisfaction'
        )),
        'mode': 'markers',
        'textsrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='country'
        )),
        'marker': {
            'sizemode': 'area',
            'sizeref': 200000,
            'sizesrc': grid.get_column_reference(col_name_template.format(
                 year=year, continent=continent, header='Total_population'
            )),
            'color': custom_colors[continent]
        },
        'name': continent
    }
    figure['data'].append(data_dict)


for year in years:
    frame = {'data': [], 'name': str(year)}
    for continent in continents:
        data_dict = {
            'xsrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='GDP_per_capita'
            )),
            'ysrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='Life_satisfaction'
            )),
            'mode': 'markers',
            'textsrc': grid.get_column_reference(col_name_template.format(
                year=year, continent=continent, header='country'
                )),
            'marker': {
                'sizemode': 'area',
                'sizeref': 200000,
                'sizesrc': grid.get_column_reference(col_name_template.format(
                    year=year, continent=continent, header='Total_population'
                )),
                'color': custom_colors[continent]
            },
            '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]

icreate_animations(figure)

以及数据集中的示例:

,country,continent,year,Country_code,Total_population,Life_satisfaction,GDP_per_capita
62,Afghanistan,Asia,2008,AFG,29839994.0,3.723589897,1298.14315888
63,Afghanistan,Asia,2009,AFG,30577756.0,4.401778221,1531.17399272
64,Afghanistan,Asia,2010,AFG,31411743.0,4.75838089,1614.25500126
65,Afghanistan,Asia,2011,AFG,32358260.0,3.83171916,1660.73985618
66,Afghanistan,Asia,2012,AFG,33397058.0,3.782937527,1839.27357928
67,Afghanistan,Asia,2013,AFG,34499915.0,3.572100401,1814.15582533
167,Albania,Europe,2007,ALB,3169665.0,4.634251595,8447.88228539
169,Albania,Europe,2009,ALB,3192723.0,5.485469818,9524.60981095
170,Albania,Europe,2010,ALB,3204284.0,5.268936634,9927.13514733
171,Albania,Europe,2011,ALB,3215988.0,5.867421627,10207.7006745
172,Albania,Europe,2012,ALB,3227373.0,5.510124207,10369.7616592
173,Albania,Europe,2013,ALB,3238316.0,4.550647736,10504.0930888
242,Algeria,Africa,2010,DZA,35468208.0,5.46356678,12870.2162376
243,Algeria,Africa,2011,DZA,35980193.0,5.317194462,12989.9549601
244,Algeria,Africa,2012,DZA,36485828.0,5.604595661,13161.566464
451,Angola,Africa,2011,AGO,19618432.0,5.589000702,5911.25433387
452,Angola,Africa,2012,AGO,20162517.0,4.360249996,5998.63860099

2 个答案:

答案 0 :(得分:8)

让我们从代码中的问题开始。

  1. 您正在使用from plotly.grid_objs import Grid, Column制作图表,但这是一个在线绘图的功能,我已经用简单的数据帧替换了网格逻辑,这基本上做了同样的事情。

  2. 其次,我注意到图表没有显示数据,经过分析后我终于发现你已经将X轴的范围设置为[30, 85],但是1-15k之间的X轴值。 1}}。

  3. 请在下面找到我的更新代码。我希望这能解决你的问题。

    代码:

    import pandas as pd
    import numpy as np
    from __future__ import division
    import plotly.plotly as py
    from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
    from plotly.graph_objs import *
    init_notebook_mode()
    
    from plotly.grid_objs import Grid, Column
    from plotly.tools import FigureFactory as FF 
    
    dataset=pd.read_csv('god_mod_copia.csv')
    
    years_from_col = set(dataset['year'])
    years_ints = sorted(list(years_from_col))
    years = [str(year) for year in years_ints]
    # make list of continents
    continents = []
    for continent in dataset['continent']:
        if continent not in continents: 
            continents.append(continent)
    df = pd.DataFrame()
    # make grid
    for year in years:
        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]
            for col_name in dataset_by_year_and_cont:
                # each column name is unique
                temp = '{year}+{continent}+{header}_grid'.format(
                    year=year, continent=continent, header=col_name
                )
                #if dataset_by_year_and_cont[col_name].size != 0:
                df = df.append({'value': list(dataset_by_year_and_cont[col_name]), 'key': temp}, ignore_index=True)
    
    figure = {
        'data': [],
        'layout': {},
        'frames': []
    }
    figure['layout']['xaxis'] = {'title': 'GDP per Capita', 'type': 'log', 'autorange': True} #was not set properly
    figure['layout']['yaxis'] = {'title': 'Life Expectancy', 'autorange': True} #was not set properly
    figure['layout']['hovermode'] = 'closest'
    figure['layout']['showlegend'] = True
    figure['layout']['sliders'] = {
        'args': [
            'slider.value', {
                'duration': 400,
                'ease': 'cubic-in-out'
            }
        ],
        'initialValue': '2007',
        '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': []
    }
    
    
    
    custom_colors = {
        'Asia': 'rgb(171, 99, 250)',
        'Europe': 'rgb(230, 99, 250)',
        'Africa': 'rgb(99, 110, 250)',
        'Americas': 'rgb(25, 211, 243)',
        #'Oceania': 'rgb(9, 255, 255)' 
        'Oceania': 'rgb(50, 170, 255)'
    }
    
    col_name_template = '{year}+{continent}+{header}_grid'
    year = 2007
    for continent in continents:
        data_dict = {
            'x': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='GDP_per_capita'
            ), 'value'].values[0],
            'y': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='Life_satisfaction'
            ), 'value'].values[0],
            'mode': 'markers',
            'text': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='country'
            ), 'value'].values[0],
            'marker': {
                'sizemode': 'area',
                'sizeref': 200000,
                'size': df.loc[df['key']==col_name_template.format(
                    year=year, continent=continent, header='Total_population'
                ), 'value'].values[0],
                'color': custom_colors[continent]
            },
            'name': continent
        }
        figure['data'].append(data_dict)
    
    for year in years:
        frame = {'data': [], 'name': str(year)}
        for continent in continents:
            data_dict = {
                'x': df.loc[df['key']==col_name_template.format(
                    year=year, continent=continent, header='GDP_per_capita'
                ), 'value'].values[0],
                'y': df.loc[df['key']==col_name_template.format(
                    year=year, continent=continent, header='Life_satisfaction'
                ), 'value'].values[0],
                'mode': 'markers',
                'text': df.loc[df['key']==col_name_template.format(
                    year=year, continent=continent, header='country'
                ), 'value'].values[0],
                'marker': {
                    'sizemode': 'area',
                    'sizeref': 200000,
                    'size': df.loc[df['key']==col_name_template.format(
                        year=year, continent=continent, header='Total_population'
                    ), 'value'].values[0],
                    'color': custom_colors[continent]
                },
                'name': continent
            }
            frame['data'].append(data_dict)
    
        figure['frames'].append(frame) #this block was indented and should not have been.
        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={'scrollzoom': True})
    

答案 1 :(得分:1)

这是Naren Murali的代码的编辑版本(他的代码已不再可用)。

需要进行一些更正,以使其与OP所引用教程中的公开数据集兼容。一些绘图库/功能必须进行更新才能与最新的绘图(4.7.1)一起使用。

from __future__ import division
import pandas as pd
import numpy as np
import chart_studio.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
init_notebook_mode()

from chart_studio.grid_objs import Grid, Column
from plotly import figure_factory as FF 

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

years_from_col = set(dataset['year'])
years_ints = sorted(list(years_from_col))
years = [str(year) for year in years_ints]
# make list of continents
continents = []
for continent in dataset['continent']:
    if continent not in continents: 
        continents.append(continent)
df = pd.DataFrame()
# make grid
for year in years:
    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]
        for col_name in dataset_by_year_and_cont:
            # each column name is unique
            temp = '{year}+{continent}+{header}_grid'.format(
                year=year, continent=continent, header=col_name
            )
            #if dataset_by_year_and_cont[col_name].size != 0:
            df = df.append({'value': list(dataset_by_year_and_cont[col_name]), 'key': temp}, ignore_index=True)

figure = {
    'data': [],
    'layout': {},
    'frames': []
}
figure['layout']['xaxis'] = {'title': 'GDP per Capita', 'type': 'log', 'autorange': True} #was not set properly
figure['layout']['yaxis'] = {'title': 'Life Expectancy', 'autorange': True} #was not set properly
figure['layout']['hovermode'] = 'closest'
figure['layout']['showlegend'] = True
figure['layout']['sliders'] = {
    'args': [
        'slider.value', {
            'duration': 400,
            'ease': 'cubic-in-out'
        }
    ],
    'initialValue': '2007',
    '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': []
}



custom_colors = {
    'Asia': 'rgb(171, 99, 250)',
    'Europe': 'rgb(230, 99, 250)',
    'Africa': 'rgb(99, 110, 250)',
    'Americas': 'rgb(25, 211, 243)',
    #'Oceania': 'rgb(9, 255, 255)' 
    'Oceania': 'rgb(50, 170, 255)'
}

col_name_template = '{year}+{continent}+{header}_grid'
year = 1952
for continent in continents:
    data_dict = {
        'x': df.loc[df['key']==col_name_template.format(
            year=year, continent=continent, header='gdpPercap'
        ), 'value'].values[0],
        'y': df.loc[df['key']==col_name_template.format(
            year=year, continent=continent, header='lifeExp'
        ), 'value'].values[0],
        'mode': 'markers',
        'text': df.loc[df['key']==col_name_template.format(
            year=year, continent=continent, header='country'
        ), 'value'].values[0],
        'marker': {
            'sizemode': 'area',
            'sizeref': 200000,
            'size': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='pop'
            ), 'value'].values[0],
            'color': custom_colors[continent]
        },
        'name': continent
    }
    figure['data'].append(data_dict)

for year in years:
    frame = {'data': [], 'name': str(year)}
    for continent in continents:
        data_dict = {
            'x': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='gdpPercap'
            ), 'value'].values[0],
            'y': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='lifeExp'
            ), 'value'].values[0],
            'mode': 'markers',
            'text': df.loc[df['key']==col_name_template.format(
                year=year, continent=continent, header='country'
            ), 'value'].values[0],
            'marker': {
                'sizemode': 'area',
                'sizeref': 200000,
                'size': df.loc[df['key']==col_name_template.format(
                    year=year, continent=continent, header='pop'
                ), 'value'].values[0],
                'color': custom_colors[continent]
            },
            'name': continent
        }
        frame['data'].append(data_dict)

    figure['frames'].append(frame) #this block was indented and should not have been.
    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={'scrollZoom': True})