Slider Plotly animé en Python

j'essayais de recréer cet exemple dans un carnet Jupyter.

https://plot.ly/python/gapminder-example/

mais a été d'obtenir cette erreur:

PlotlyDictKeyError: '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']

l'animation s'exécute sans le curseur ajouté à la mise en page et le curseur est visible et opérationnel, mais ne change pas le graphe. Quand je bouge le curseur, il produit l'erreur suivante dans la console:

Uncaught (in promise) undefined
19
demandé sur user14492 2017-07-23 18:56:06

4 réponses

mise à Jour:

j'ai vérifié le graphique que vous avez, j'observe parfois l'erreur ci-dessous.

Uncaught (promesse) undefined

cette erreur peut être due à l'absence d'un clic ou d'un autre événement, mais c'est à l'intérieur du plotly.js le fichier, si vous allez à Plotly Curseur animation lien et à l' slider animation section, cliquez sur Jouer et cliquez sur le curseur pendant que le jeu est en cours d'exécution. erreur, même quand je clique sur pause, j'obtiens cette erreur. Mais l'animation continue de jouer si j'appuie à nouveau sur la pièce, donc il n'y a pas d'impact majeur! C'est juste qu'un événement n'est pas manipulé correctement.

comme dans le cas du graphique que vous avez fourni, je peux faire fonctionner l'animation correctement, même si j'obtiens l'erreur (Uncaught (in promise) undefined) je suis encore capable de jouer l'animation!

Vous pouvez utiliser iplot(fig, validate=False) ou plot(fig) pour montrer les graphes en Python avec le l'animation!

Réponse:

L'erreur est parce que le layout objet a une propriété appelée slidersslider, donc où que vous utilisiez slider sous la mise en page, veuillez changer ceci, aussi ce graphique est très compliqué et peut avoir d'autres erreurs aussi, s'il vous plaît partager le code, pour le débogage. Mais pour l'instant ce sera mon réponse.

Avant:

['layout']['slider'] 

Après:

['layout']['sliders']

Veuillez remplacer tous les slider propriétés qui sont liées à layout, celles-ci doivent être changées en sliders.

Références:

j'ai traité des questions liées à ce graphique en forme de traceur animé. S'il vous plaît se référer à eux si besoin, ils peuvent aider à résoudre votre problème!

  1. Plotly Animation Graphique en Bulles Pas de Données dans la Parcelle
  2. Plotly Erreur Invalide la Figure ou de Données de l'Argument
  3. Animations Plotly Icreate Offline on Jupyter Notebook
6
répondu Naren Murali 2017-09-21 18:36:00

Vous êtes probablement frapper cette erreur à cause d'une faute de frappe dans ce bloc-notes. Il devrait être sliders au lieu de slider voir le docs.

l'autre erreur aussi, semble être causée par cette faute de frappe. Il semble que ce code se trouve dans un gestionnaire d'événements qui est déclenché à chaque fois que vous déplacez le curseur.

Donc en dessous de la ligne (et similaires):

figure['layout']['slider']

doit être corrigé:

figure['layout']['sliders']

Voici le code pour que exemple:

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

import pandas as pd
import time

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

table = FF.create_table(dataset.head(10))
py.iplot(table, filename='animations-gapminder-data-preview')


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

# 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}_gapminder_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)

# upload grid
grid = Grid(columns)
url = py.grid_ops.upload(grid, 'gapminder_grid'+str(time.time()), auto_open=False)

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

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}_gapminder_grid'
year = 1952
for continent in continents:
    data_dict = {
        'xsrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='lifeExp'
        )),
        'ysrc': grid.get_column_reference(col_name_template.format(
            year=year, continent=continent, header='gdpPercap'
        )),
        '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='pop'
            )),
            '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='lifeExp'
            )),
            'ysrc': grid.get_column_reference(col_name_template.format(
                year=year, continent=continent, header='gdpPercap'
            )),
            '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='pop'
                )),
                '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]

py.icreate_animations(figure, 'gapminder_example'+str(time.time()))

Note: étrange mais le code exécuté avec succès pour moi avec la typographie mentionnée ci-dessus aussi bien!

Démo sortie.

2
répondu 0xc0de 2017-09-21 09:00:56

vous avez besoin de plotly >= 2.0.0 essayer pip install plotly --upgrade

1
répondu user2147028 2017-09-13 06:07:21
slidersliders donnera toujours une erreur. Donc, voici une exemple.

http://nbviewer.jupyter.org/gist/empet/365cf202391bf7a58021388fadd52004

1
répondu user14492 2018-02-11 18:10:55