Сюжет: как сделать автономный сюжет в окне? - PullRequest
0 голосов
/ 01 декабря 2018

Есть ли способ использовать plotly, как matplotlib, то есть заставить график появиться во всплывающем окне?Например, существует ли простой эквивалент

plt.plot([1,2,3], [2, 3, 2.5])
plt.show()

Я пробовал различные функции, но все они, похоже, либо создают HTML-файл, либо файл изображения.

Ответы [ 2 ]

0 голосов
/ 01 августа 2019

Вот отдельный класс, созданный на основе ответа ImportanceOfBeingErnest, если кому-то понадобится

import numpy as np
import plotly.graph_objs as go
import plotly.offline

fig = go.Figure()
fig.add_scatter(x=np.random.rand(100), y=np.random.rand(100), mode='markers',
                marker={'size': 30, 'color': np.random.rand(100), 'opacity': 0.6,
                        'colorscale': 'Viridis'});

import os, sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5 import QtWebEngineWidgets


class PlotlyViewer(QtWebEngineWidgets.QWebEngineView):
    def __init__(self, fig, exec=True):
        # Create a QApplication instance or use the existing one if it exists
        self.app = QApplication.instance() if QApplication.instance() else QApplication(sys.argv)

        super().__init__()

        self.file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "temp.html"))
        plotly.offline.plot(fig, filename=self.file_path, auto_open=False)
        self.load(QUrl.fromLocalFile(self.file_path))
        self.setWindowTitle("Plotly Viewer")
        self.show()

        if exec:
            self.app.exec_()

    def closeEvent(self, event):
        os.remove(self.file_path)


win = PlotlyViewer(fig)
0 голосов
/ 01 декабря 2018

Показать в системном средстве просмотра изображений

Вы можете открыть изображение, созданное с помощью графика, в системном средстве просмотра изображений по умолчанию, которое является своего рода автономным окном.

import numpy as np
import plotly.graph_objs as go

fig = go.Figure()
fig.add_scatter(x=np.random.rand(100), y=np.random.rand(100), mode='markers',
                marker={'size': 30, 'color': np.random.rand(100), 'opacity': 0.6, 
                        'colorscale': 'Viridis'});

def show(fig):
    import io
    import plotly.io as pio
    from PIL import Image
    buf = io.BytesIO()
    pio.write_image(fig, buf)
    img = Image.open(buf)
    img.show() 

show(fig)

Недостатокэто, конечно, то, что у вас нет никакого взаимодействия.

Создать окно браузера

Альтернативой может быть создание окна веб-браузера для отображения HTML-страницы, сгенерированной плотно.Для этого вам необходимо использовать инструментарий GUI, который позволяет создавать браузер.PyQt5 будет один.

Таким образом, следующее создает окно PyQt5 с браузером и загружает html-страницу, созданную с помощью графика, внутри которой вы можете взаимодействовать.(Это протестировано с pyqt 5.9, может не работать с более старыми версиями.)

import numpy as np
import plotly.graph_objs as go


fig = go.Figure()
fig.add_scatter(x=np.random.rand(100), y=np.random.rand(100), mode='markers',
                marker={'size': 30, 'color': np.random.rand(100), 'opacity': 0.6, 
                        'colorscale': 'Viridis'});


def show_in_window(fig):
    import sys, os
    import plotly.offline
    from PyQt5.QtCore import QUrl
    from PyQt5.QtWebEngineWidgets import QWebEngineView
    from PyQt5.QtWidgets import QApplication

    plotly.offline.plot(fig, filename='name.html', auto_open=False)

    app = QApplication(sys.argv)
    web = QWebEngineView()
    file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "name.html"))
    web.load(QUrl.fromLocalFile(file_path))
    web.show()
    sys.exit(app.exec_())


show_in_window(fig)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...