В настоящее время я сталкиваюсь с проблемой с matplotlib в сочетании с PyQt5, которую я совсем не понимаю. По сути, я просто хочу построить разные кривые на одном и том же рисунке, вызванные QPushButton. Я воссоздал проблему в минимальном рабочем примере ниже.
Ожидание:
Каждый раз, когда я нажимаю кнопку "сюжет", текущая фигура обновляется новой строкой
Результат:
Первый сюжет работает правильно, однако после этого фигура больше не обновляется с правильными данными. Если фигура закрыта и кнопка снова нажата, сюжет снова начинает работать. Если код изменяется на
fig = plt.figure()
, то есть каждый раз, когда создается новая фигура, она работает, как и ожидалось. Это ошибка или я как-то ошибся?
Для минимального рабочего примера используются следующие пакеты:
matplotlib==3.1.3
PyQt5==5.14.1
pyqt5-tools==5.13.0.1.5
Пример кода:
import matplotlib.pyplot as plt
import numpy as np
import sys
from PyQt5 import QtWidgets
class MaterialBrowser(QtWidgets.QMainWindow):
def __init__(self):
super(MaterialBrowser, self).__init__()
self.setEnabled(True)
self.setGeometry(0, 0, 543, 700)
self.setMinimumSize(543, 400)
self.save_button = QtWidgets.QPushButton(self)
self.save_button.setGeometry(100, 100, 110, 32)
self.save_button.setObjectName("plot_button")
self.save_button.setText("Plot")
self.save_button.clicked.connect(self.plot_bhcurve)
self.show()
def plot_bhcurve(self):
t = np.arange(0.0, 2.0, 0.01)
omega = np.random.randint(2, 50)
s = 1 + np.sin(2 * np.pi * omega* t)
fig = plt.figure(num='MYFIGURE')
ax = fig.gca()
ax.plot(t, s, '.-', label=f'mycurve{omega}')
ax.grid(True, which="both")
ax.set_xlabel('Field Strength (A/m)')
ax.set_ylabel('Flux Density (T)')
ax.set_xlim(left=0)
ax.set_ylim(bottom=0)
plt.legend()
plt.show()
app = QtWidgets.QApplication(sys.argv)
materialbrowser = MaterialBrowser()
sys.exit(app.exec_())