how - Plotly animado deslizante en Python
plotly python (4)
Estaba intentando recrear este ejemplo en un cuaderno de Jupyter.
https://plot.ly/python/gapminder-example/
pero estaba recibiendo este error:
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'']
La animación se ejecuta sin el control deslizante agregado al diseño y el control deslizante es visible y operativo, pero no cambia el gráfico. Cuando muevo el control deslizante produce el siguiente error en la consola:
Uncaught (in promise) undefined
Como otros han mencionado, la documentación es incorrecta. Pero simplemente reemplazar todos los sliders
slider
con sliders
aún dará un error. Por lo tanto, aquí hay un ejemplo autónomo.
http://nbviewer.jupyter.org/gist/empet/365cf202391bf7a58021388fadd52004
Necesita plotly >= 2.0.0
intente pip install plotly --upgrade
Probablemente esté golpeando este error debido a un error tipográfico en ese cuaderno. Debería ser sliders
lugar de sliders
slider
, consulte los docs .
El otro error también parece ser causado por este error tipográfico. Parece que este código está en un controlador de eventos que se activa cada vez que mueves el control deslizante.
Así que debajo de la línea (y similares):
figure[''layout''][''slider'']
debe corregirse a:
figure[''layout''][''sliders'']
Aquí está el código para ese ejemplo:
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()))
Nota: ¡Extraño, pero el código se ejecutó correctamente para mí con el error tipográfico mencionado anteriormente también!
Salida de Demo .
Actualizar:
Revisé el gráfico que tienes, a veces observo el error que se muestra a continuación.
Incapacitado (en promesa) indefinido
Este error puede deberse a que falta un clic u otro evento, pero esto se encuentra internamente dentro del archivo plotly.js
, si usted va al enlace de https://plot.ly/python/gapminder-example/ y a la sección de slider animation
del slider animation
, haga clic en reproducir y haga clic en el control deslizante mientras se reproduce. En ejecución obtenemos este error, incluso cuando hago clic en pausa, obtengo este error. Pero la animación sigue reproduciéndose si presiono el juego nuevamente, ¡por lo tanto no hay un gran impacto! Es solo que un evento no se maneja adecuadamente.
Entonces, como en el caso del gráfico que proporcionaste, puedo hacer que la animación funcione bien, aunque recibo el error (Sin Uncaught (in promise) undefined
) ¡Todavía puedo reproducir la animación!
Puedes usar iplot(fig, validate=False)
o plot(fig)
para mostrar los gráficos en Python con la animación.
Responder:
El error se debe a que el objeto de layout
tiene una propiedad llamada sliders
slider
no sliders
slider
, por lo que siempre que esté utilizando el slider
en el diseño, cambie esto, también esta trama es muy complicada y puede tener otros errores, por favor comparta el código para la depuración. Pero por ahora esta será mi respuesta.
Antes de:
[''layout''][''slider'']
Después:
[''layout''][''sliders'']
Reemplace todas las propiedades del slider
que están relacionadas con el diseño, estas deben cambiarse a sliders
.
Referencias:
He manejado problemas relacionados con este particular gráfico deslizante animado de Plotly. Consúltelos si es necesario, ¡pueden ayudar a resolver su problema!