#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. Спасибо. Мне действительно скоро нужно перенести всю программу в графический интерфейс, и, возможно, сейчас самое время сделать это там, где требуется графический интерфейс, чтобы сделать отображение плавным. Я полагаю, что решение с графическим интерфейсом является правильным решением, поскольку моя проблема по своей сути является проблемой окна отображения.