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
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!
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.
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
Vous avez besoin de plotly >= 2.0.0
Essayez
pip install plotly --upgrade