Как оптимально передать данные в Plotly Dash Scattermapbox? - PullRequest
0 голосов
/ 24 мая 2019

Производительность очень низкая, когда я передаю сотни точек scattermapbox, используя черту plotly, из запроса sqlite.

Каков наилучший способ передачи данных в scattermapbox в dash-приложении?

Я видел примеры (https://github.com/plotly/dash-uber-rides-demo) с гораздо большим количеством точек данных, которые работают гораздо лучше.

Я не уверен, если это из-за структуры данных (nd.array, dataframe, результаты запроса sqlalchemy) или используемого интерфейса (graph_objs.scattermapbox vs dcc.graph).

Примеры в документации Dash передают данные по-разному и используют другой импорт / интерфейс. dcc vs. graph_objs.

Я использую dcc.graph, понимание из результатов запроса:

s = session

surveys = s.query(Survey).all()
locations = [s.location for s in surveys if s.location]

figure = {
    'data': [
        {
            'type': 'scattermapbox',
            'lat': [l.lat],
            'lon': [l.lon],
            "mode": "markers",
        } for l in [s.location for s in surveys if s.location]
    ],
    'layout': {
        'mapbox': {...}
    }
}

app.layout = html.Div([
    dcc.Graph(
        id='map',
        figure=figure,
    )
])

# Remap based on zip of any clicked point
@app.callback(
    [Output('map', 'figure'),
     Output('click-data', 'children')],
    [Input('map', 'clickData'), Input('button', 'n_clicks')],
    # [State('dropdown', 'value')],
)
def on_click(clickData, n_clicks):
    data = clickData
    point = data['points'][0]

    # Use lat, lon to query the database
    loc = s.query(Location).filter((Location.lat == point['lat']) & (Location.lon == point['lon'])).first()
    locations = s.query(Location).filter(Location.zip == loc.zip)
    figure = {
        'data': [
            {
                'type': 'scattermapbox',
                'lat': [l.lat],
                'lon': [l.lon],
                "mode": "markers",
            } for l in locations
        ]
    }
    return figure

Ожидаемые результаты: Производительность аналогична Uber Rides Dash

Фактические результаты: Для загрузки нового запроса на карту требуется около 30 секунд

...