Как подать в тире анимированную сюжетно-экспрессивную фигуру?

Я попытался показать этот пример с домашней страницы plotly-exress в тире.

import plotly.express as px
gapminder = px.data.gapminder()
px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
           size="pop", color="continent", hover_name="country",
           log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])

Нравится:

import plotly_express as px
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output

gapminder = px.data.gapminder()

dimensions = []

app = dash.Dash(
    __name__, external_stylesheets=["https://codepen.io/chriddyp/pen/bWLwgP.css"]
)

app.layout = html.Div(
    [
        html.H1("Gapminder data"),
        dcc.Graph(id="graph", style={"width": "75%", "display": "inline-block"}),
    ]
)

@app.callback(Output("graph", "figure"), [])
def make_figure():
    return px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
                      size="pop", color="continent", hover_name="country",
                      log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])


app.run_server(debug=True)

Но появляется только пустая фигура.


person Sören    schedule 25.07.2019    source источник


Ответы (1)


Изменить: вам нужна последняя версия основных компонентов Dash и Dash для рендеринга кадров анимации.

В этом случае это потому, что ваш обратный вызов никогда не срабатывает, потому что второй аргумент является пустым списком (т.е. он не зависит от каких-либо входных данных).

Если вы встроите фигуру в макет, она отобразит:

import plotly_express as px
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output

gapminder = px.data.gapminder()

dimensions = []

app = dash.Dash(
    __name__, external_stylesheets=["https://codepen.io/chriddyp/pen/bWLwgP.css"]
)

app.layout = html.Div(
    [
        html.H1("Gapminder data"),
        dcc.Graph(id="graph", style={"width": "75%", "display": "inline-block"},
        figure=px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
                      size="pop", color="continent", hover_name="country",
                      log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])),
    ]
)


app.run_server(debug=True)

Или вы можете подключить обратный вызов, чтобы он зависел от ввода, который действительно изменяется, и он сработает и заполнит фигуру :)

person nicolaskruchten    schedule 25.07.2019
comment
Вы используете последнюю версию dash, 1.0.x, и соответствующую версию dash_core_components? Все вместе они работают на меня. Несколько недель назад я добавил поддержку фреймов в dcc.Graph. - person nicolaskruchten; 26.07.2019
comment
Нет, я использую «0.39.0», который, кажется, является последней версией, доступной на канале conda ... Почему я должен указывать dash = 1, чтобы получить самую новую версию? Вместо этого установлена ​​устаревшая версия ... - person Sören; 26.07.2019
comment
Я не уверен, почему conda делает это, извините :) может быть, потому что это серьезное изменение версии с 0.x на 1.x? - person nicolaskruchten; 26.07.2019
comment
Если вы не хотите полностью переходить на 1.0, я проверил, и поддержка фреймов была добавлена ​​в dash-core-components в версии 0.48: github.com/plotly/dash-core-components/blob/master/CHANGELOG.md - person nicolaskruchten; 26.07.2019
comment
Большой! Смело примите ответ, если он вам помог :) - person nicolaskruchten; 26.07.2019
comment
Я получаю кадр неупорядоченным образом. Есть ли способ заказать слайдер анимации. Например, я получаю значения на слайдере как (3,2,1,4). Вместо этого я хочу, чтобы (1,2,3 , 4) - person Sample Test; 16.01.2020