Перерисовать фигуру matplotlib после обновления свойств Line2D через PyQt5 GUI - PullRequest
0 голосов
/ 23 апреля 2020

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

Когда я нажимаю кнопку, я получаю ошибку TypeError для команды draw():

Traceback (most recent call last):

  File "minimal_plot.py", line 55, in updatePlot
    self.sc.ax.draw()

TypeError: draw_wrapper() missing 1 required positional argument: 'renderer'

Мне никогда не приходилось передавать аргументы draw() раньше. Что мне там поставить?

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qt import *

import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None):
        fig = Figure(figsize=(10, 10), dpi=100)
        self.ax = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)

class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

    # --- Define layout --- 
        layout1 = QVBoxLayout()
        btn = QPushButton('', self)
        btn.clicked.connect(self.updatePlot)
        layout1.addWidget(btn)

        # Plot section
        self.sc = MplCanvas(self)
        layout1.addWidget(self.sc)
        self.sc.setFixedHeight(600)
        self.sc.setFixedWidth(600)
        self.show()

        widget = QWidget()
        widget.setLayout(layout1)
        self.setCentralWidget(widget)

        # Create some lines
        self.sc.ax.plot([0,1,2,3,4], [10,1,20,3,40])
        self.sc.ax.plot([0,1,2,3,4], [9,0,19,2,39])

    def updatePlot(self):
       lines = self.sc.ax.get_lines()
       for i in range(len(lines)):
           lines[i].set_linewidth(4)

       self.sc.ax.draw()

    # Fix to make PyQt5 close correctly in Spyder    
    def closeEvent(self,event):
        QApplication.quit()       

# Run main code
app = QApplication.instance()
window = MainWindow()
window.show()
app.exec_()

Примечание: код может немного отличаться от обычного приложения PyQt5, потому что я запускаю его в Spyder (поэтому я вызываю app = Qapplication.instance() вместо app = Qapplication([]). Определение closeEvent() также можно удалить, если не использовать Spyder.

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