我正在开发一个GUI应用程序,它使用Matplotlib包生成图形,对于gui设计我正在使用PyQt5。 在这个应用程序中,用户从一行加载数据,然后在按下生成按钮时,生成一个已处理的图形,现在的问题是,在关闭图形时,当用户加载新数据时,按下生成按钮,图形为不再显示。
代码
import sys
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
plt.subplots_adjust(hspace=0)
class window(QMainWindow):
def __init__(self):
super(window, self).__init__()
self.setGeometry(50, 50, 100, 100)
self.setWindowTitle('Generate Graph')
self.home()
def home(self):
btn = QPushButton('Generate', self)
btn.clicked.connect(self.generate_graph)
#btn.resize(100, 100)
#btn.move(100, 100)
self.show()
def generate_graph(self):
# In real application these points gets updated
x = [0,1,2,3,4,5,6,7,8,9]
y1 = [0,1,2,3,4,5,6,7,8,9]
y2 = [0,1,2,3,4,5,6,7,8,9]
ax1.plot(x,y1)
ax2.plot(x,y2)
plt.show()
def run():
app = QApplication(sys.argv)
Gui = window()
sys.exit(app.exec_())
run()
所以我发布了可以显示我的问题的示例程序,在此我创建了一个按钮并生成了两个图。 (注意:这是两个子图,我创建了两个子图,因为,我需要在相邻的轴上写ylabel,所以这是一个我无法改变的要求,它必须是这样的)
我按了生成按钮,图表生成了。 我关闭了图表,然后再次按下生成按钮,但没有重新生成。 请建议我可以添加什么来实现这一目标。
是否有可能在每次用户按下生成按钮时生成新图形,我认为这也可以解决问题。 请提前建议并提前致谢。
我在这个论坛上搜索了这个主题,并尝试过清理轴等各种事情,但我认为我做错了,因为我对这一切都是新手。
答案 0 :(得分:1)
您正在将matplotlib.pyplot
show
GUI与另一个PyQt GUI混合使用。问题是matplotlib GUI中显示的图只创建一次。一旦关闭,它就会丢失。
简单的解决方案是在generate_graph
函数中创建它。因此,每次按下按钮时都会创建并显示一个新图形。
import sys
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import matplotlib.pyplot as plt
class window(QMainWindow):
def __init__(self):
super(window, self).__init__()
self.setGeometry(50, 50, 100, 100)
self.setWindowTitle('Generate Graph')
self.home()
def home(self):
btn = QPushButton('Generate', self)
btn.clicked.connect(self.generate_graph)
self.show()
def generate_graph(self):
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
plt.subplots_adjust(hspace=0)
x = [0,1,2,3,4,5,6,7,8,9]
y1 = [0,1,2,3,4,5,6,7,8,9]
y2 = [0,1,2,3,4,5,6,7,8,9]
ax1.plot(x,y1)
ax2.plot(x,y2)
plt.show()
def run():
app = QApplication(sys.argv)
Gui = window()
sys.exit(app.exec_())
run()