web-dev-qa-db-fra.com

Curseur complètement animé en Python

J'essayais de recréer cet exemple dans un cahier Jupyter.

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

mais obtenait 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 l'ajout du curseur dict à la mise en page et le curseur est visible et opérationnel, mais ne modifie pas le graphique. Lorsque je déplace le curseur, l'erreur suivante est générée dans la console:

Uncaught (in promise) undefined
19
Caleb Everett

Mise à jour:

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

Uncaught (en promesse) non défini

Cette erreur peut être due au fait qu'il manque un clic ou un autre événement, mais cela se trouve de manière interne dans le fichier plotly.js. Si vous accédez à Animation du curseur Plotly link et à la section slider animation, cliquez sur Lecture, puis sur le curseur en cours de lecture. est en cours d'exécution, nous obtenons cette erreur, même lorsque je clique sur pause, je reçois cette erreur. Mais l'animation continue de jouer si j'appuie à nouveau sur la pièce, il n'y a donc pas d'impact majeur! C'est juste qu'un événement n'est pas géré correctement.

Donc, comme dans le cas du graphique que vous avez fourni, je peux bien faire fonctionner l’animation, même si j’obtiens l’erreur (Uncaught (in promise) undefined). Je suis toujours capable de jouer l’animation!

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

Réponse:

L'erreur est due au fait que l'objet layout a une propriété appelée sliders not slider. Par conséquent, si vous utilisez slider sous layout, modifiez-le. Ce graphique est également très compliqué et peut comporter d'autres erreurs. Partagez le code pour le débogage. Mais pour l'instant ce sera ma réponse.

Avant:

['layout']['slider'] 

Après:

['layout']['sliders']

Veuillez remplacer toutes les propriétés slider liées à la présentation. Celles-ci doivent être remplacées par sliders.

Références:

J'ai géré les problèmes liés à ce curseur graphique animé de Plotly. S'il vous plaît se référer à eux si besoin, ils peuvent aider à résoudre votre problème!

  1. Graphique à bulles animé de manière graphique Aucune donnée dans le graphique
  2. Plotly Error Figure ou argument de données non valide
  3. Plotly Icreate Animations Offline sur Jupyter Notebook
6
Naren Murali

Vous rencontrez probablement cette erreur à cause d'une faute de frappe dans ce cahier. Ce 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 se déclenche chaque fois que vous déplacez le curseur.

Donc, en dessous de la ligne (et similaires):

figure['layout']['slider']

devrait être corrigé à:

figure['layout']['sliders']

Voici le code pour cet 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()))

Remarque: Étrange, mais le code a bien été exécuté avec la faute de frappe mentionnée ci-dessus!

Démo sortie.

2
0xc0de

Comme d'autres l'ont mentionné, la documentation est incorrecte. Cependant, le simple fait de remplacer toutes les variables slider par sliders générera toujours une erreur. Par conséquent, voici un exemple autonome. 

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

1
user14492

Vous avez besoin de plotly >= 2.0.0 Essayez pip install plotly --upgrade

1
user2147028