Как заменить данные в графе шейдера данных Dash holoviews во время выполнения в рамках обратного вызова?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как заменить данные в графе шейдера данных Dash holoviews во время выполнения в рамках обратного вызова?

Сообщение Anonymous »

Я пытаюсь создать в своем веб-приложении диаграмму, отображающую десятки миллионов точек. Для этой цели я начал с Dash, а для эффективного изображения больших наборов данных я использовал Holoviews в сочетании с datashader.
Дело в том, что если я буду следовать всем руководствам из Dash, я смогу получить график, который является интерактивным и обновляет растр при масштабировании. Разумеется, предполагается, что вы предоставите фрейм данных перед запуском приложения Dash. Однако в моем случае мне нужно было бы указать отображаемые данные на лету, так как я бы отправил запрос на отображение содержимого файла на одной вкладке, а на другой вкладке я мог бы затем загрузить новый файл и отобразить его. Однако, когда вы обновляете макет своего приложения Dash с помощью обратного вызова, вызывая to_dash() и возвращая полученный график, он действительно обновляется с новым графиком, но я теряю все взаимодействия, которые обрабатывались раньше, то есть при масштабировании я только увеличить растровое изображение. Я также проверил оба подхода, и как только я сгенерирую данные в обратном вызове и перезапишу исходные, я больше ничего не вижу на вкладке «Сеть» в своем браузере.
Я пытался поиграться с идентификатор графа и идентификатор магазина, которые Dash прикрепляет к создаваемым компонентам, но без особого успеха. Я думаю, что нарушаю какие-то привязанные обратные вызовы к изначально созданным компонентам, которые приложение обрабатывает самостоятельно. В приведенный ниже код я включаю пример того, как воспроизвести проблему: при загрузке все работает нормально, когда вы нажимаете кнопку «Создать новые данные», взаимодействия больше нет.

Код: Выделить всё

import dash
from dash import dcc, html
import holoviews as hv
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from dash.dependencies import Input, Output
from holoviews.operation.datashader import datashade
from holoviews.plotting.plotly.dash import to_dash

# Enable Holoviews Plotly extension
hv.extension('plotly')

# Generate synthetic dataset
def first_dataset():
np.random.seed(42)
n = 1_000_000  # Number of points
return pd.DataFrame({
'x': np.random.normal(size=n),
'y': np.random.normal(size=n),
'value': np.random.random(size=n),
})

def second_dataset():
np.random.seed(42)
n = 1_000_000  # Number of points
return pd.DataFrame({
'x': np.random.uniform(size=n),
'y': np.random.normal(size=n),
'value': np.random.random(size=n),
})

# Create Holoviews + Datashader plot
def create_hv_plot(data):
points = hv.Points(data, ['x', 'y'])
shaded = datashade(points, cmap=['lightblue', 'blue', 'purple'])
return shaded.opts(width=800, height=400)

# Initialize Dash app
app = dash.Dash(__name__)

# Convert Holoviews plot to Plotly
def holoviews_to_plotly(hv_plot):
# Render the Holoviews plot to a Plotly figure
plotly_fig = to_dash(app, [hv_plot], responsive=False)
return plotly_fig

# Generate the data and create the plot
data = first_dataset()
hv_plot = create_hv_plot(data)
plotly_fig = holoviews_to_plotly(hv_plot)

# Layout for Dash app
app.layout = html.Div([
html.H1("Dash + Plotly + Holoviews + Datashader"),
html.Button('Generate New Data', id='generate-button', n_clicks=0),
html.Div(plotly_fig.children, id='graph'),
])

@app.callback(
Output('graph', 'children'),
[Input('generate-button', 'n_clicks')]
)
def update_graph(n_clicks):
if n_clicks > 0:
# Generate new data on button click
new_data = second_dataset()

# Create a new plot with the new data
new_hv_plot = create_hv_plot(new_data)

# Convert the new Holoviews plot to Plotly figure
new_plotly_fig = holoviews_to_plotly(new_hv_plot)

return new_plotly_fig.children  # Return the updated Plotly figure

return plotly_fig.children  # Return the initial plot if no click yet

# Run the app
if __name__ == "__main__":
app.run_server(debug=True)
Я видел пару человек, которые искали на форумах точно такое же решение, но обычно их игнорируют.
Я также открыт для любых других альтернатив. Я попробовал сохранить макет для каждого сеанса самостоятельно. Это отчасти сработало, это большая работа, но возможная. Головная боль связана с тем, что Dash не имеет состояния, а я все еще пытаюсь работать с сессиями. Таким образом, я могу вставить свой график с помощью , хотя я не могу встроить его в реальное приложение из-за того, что настройки cookie работают через соединение, отличное от https (это еще одна проблема).

Подробнее здесь: https://stackoverflow.com/questions/793 ... within-a-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»