QWebEngineView медленно отображает визуализацию боке с большими данными (~ 18000 точек).Python

Программы на Python
Anonymous
QWebEngineView медленно отображает визуализацию боке с большими данными (~ 18000 точек).

Сообщение Anonymous »

Я пытаюсь включить холст визуализации на основе Bokeh в приложение Qt, написанное на Python (с использованием PySide6). Поэтому я создаю визуализацию, сохраняю ее в файле HTML и читаю в виджете QWebEngineView. Он отлично визуализируется, но взаимодействует с ним крайне медленно; например попробуйте выбрать инструмент масштабирования и увеличить масштаб или панорамировать. Удивительно то, что когда я открываю тот же HTML-код в Firefox, он происходит довольно быстро, как я и ожидал.
На графике есть два временных ряда по 8760 точек данных каждый. Что здесь происходит?

Минимальный пример

from argparse import ArgumentParser
from pathlib import Path

from PySide6.QtCore import QUrl, QSize
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWebEngineWidgets import QWebEngineView

class MainWindow(QMainWindow):
def __init__(self, path: str = "", *args, **kwargs):
super().__init__(*args, **kwargs)

if path:
self.browser = QWebEngineView()
self.browser.setUrl(QUrl.fromLocalFile(Path(path).absolute()))
self.setCentralWidget(self.browser)
self.resize(QSize(800, 500))

if __name__ == "__main__":
# HTML example produced using Bokeh: dump-viz.html
parser = ArgumentParser()
parser.add_argument("file")
opts = parser.parse_args()

app = QApplication()
window = MainWindow(opts.file)
window.show()
app.exec()

Приведенный выше сценарий и пример HTML доступны в этом списке.
Вы можете запустить его с помощью штрих-кода pyside-qwebengine-slow.py. qwebengine-ex-viz.html или создайте виртуальную среду, затем установите PySide6 и запустите ее в обычном режиме.

Дополнительная информация

Код, который я использую для создания этого графика, более или менее эквивалентен:
def make_plot(data_list)
"""`data_list`: list of dataclasses representing a time series;
data.y, data.labels, etc.
"""
palette = TolRainbow[10]
cds = ColumnDataSource(data=pd.DataFrame({data.labels[0]: data.y for data in data_list}))
legend_items = {}
fig = figure(x_axis_label="x_label", y_axis_label="y_label", title="title", height=400, width=800)
for idx, data in enumerate(data_list):
line = fig.line("index", data.labels[0], source=cds, color=palette[idx])
point = fig.scatter("index", data.labels[0], source=cds, color=palette[idx], size=7)
legend_items[data.labels[0]] = [line, point]

legend = Legend(items=list(legend_items.items()))
fig.add_layout(legend, "right")
fig.legend.click_policy = "hide"
return fig

fig = make_plot(data_list)
html = file_html(fig, INLINE, title)


Подробнее здесь: https://stackoverflow.com/questions/790 ... points-slo

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