Можете ли вы визуализировать и отображать HTML в окне matplotlib вместо браузера?

#python #html #matplotlib

#python #HTML #matplotlib

Вопрос:

У меня есть программа, которая генерирует графики и отображает их пользователю с помощью matplotlib. Сейчас я добавляю функцию, которая включает HTML, который генерируется из некоторых данных и модифицируется. Я могу отобразить этот измененный HTML с помощью webbrowser.open('file://' htmlFilePath, new=2, autoraise=False) , и он откроется в браузере по умолчанию или любом другом браузере, настроенном для webbrowser.

НО я бы действительно хотел отобразить этот html в окне matplotlib, которое у меня запущено, вместо открытия отдельного окна браузера. Есть ли какой-либо способ отобразить этот HTML в окне matplotlib? Либо в виде отрисованного HTML, либо даже просто изображения HTML-страницы, которое будет отрисовано браузером.

У меня не так много кода для того, что я пробовал, поскольку большая часть исследований по stackoverflow показывает мне, как отображать график matplotlib КАК html для flask / django, что означает ВЫВОД в HTML вместо HTML для ПОСТРОЕНИЯ. Мне не нужно преобразовывать мой график в HTML, мне нужно преобразовать мой HTML в какое-то изображение или массив numpy или что-то в этом роде, чтобы я мог отображать его как ax.imshow(htmlFilePath) . Спасибо.

Комментарии:

1. Что будет отображаться в этом HTML-бите? Поскольку matplotlib не может отрисовывать HTML сам по себе, это звучит как обходной путь, который лучше всего решить совсем по-другому.

2. Я вижу, как я и подозревал. HTML генерируется из PDF с возможностью поиска, который преобразуется в html с помощью pdftohtml . Это одностраничный просмотр, формат pdf должен быть сохранен, поэтому я не хочу просто показывать текст, сгенерированный из pdftotext .

3. У меня все еще нет четкого представления об ожидаемом результате. Будет ли текст отображаться сверху / внутри рисунка matplotlib или рядом с ним? Должен ли график matplotlib быть интерактивным или это просто картинка? Необходимо ли преобразование в HTML или вы могли бы напрямую конвертировать из pdf в изображение png?

4. Преобразование PDF в HTML выполняется для того, чтобы можно было вносить различные изменения (например, найти тег с определенным элементом в нем и выделить его). График не обязательно должен быть интерактивным. Пользователь должен увидеть внесенные изменения и убедиться своими глазами, а также ввести результат проверки на консоли. Я думаю, что если он преобразуется в PNG, я не смог бы найти регионы для изменения (например, найдите регион с текстом «foo» в нем и выделите его желтым).

5. Будет ли это близко к тому, что вам нужно?

Ответ №1:

Вы можете отобразить веб-браузер и рисунок matplotlib рядом друг с другом в одном окне графического интерфейса.

Например, используя PyQt5, следующее создало бы окно и разместило веб-браузер слева, а фигуру matplotlib справа.

 import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5 import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT
from matplotlib.figure import Figure

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QHBoxLayout(self._main)

        self.web = QWebEngineView()

        self.fig = Figure(figsize=(5, 3))
        self.canvas = FigureCanvas(self.fig)

        layout.addWidget(self.web)
        layout.addWidget(self.canvas)
        self.addToolBar(NavigationToolbar2QT(self.canvas, self))

        self.fill_content("<html><div>Some Html</div></html>", [1,3,2])

    def fill_content(self, html, data):
        self.web.setHtml(html)

        self.fig.clear()
        ax = self.fig.add_subplot(111)
        ax.plot(data)
        self.canvas.draw_idle()


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()
  

введите описание изображения здесь

Комментарии:

1. Спасибо. Мне действительно скоро нужно перенести всю программу в графический интерфейс, и, возможно, сейчас самое время сделать это там, где требуется графический интерфейс, чтобы сделать отображение плавным. Я полагаю, что решение с графическим интерфейсом является правильным решением, поскольку моя проблема по своей сути является проблемой окна отображения.