[英]Pyqt5 plot not updated?
绘图工作正常但是在绘制新信息时它不会更新?
from PyQt5.QtWidgets import*
from PyQt5.uic import loadUi
from PyQt5.QtCore import Qt
from PyQt5 import QtCore,QtWidgets
import pandas as pd
import sqlite3
import matplotlib
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
matplotlib.use("Qt5Agg")
class MplCanvas(FigureCanvasQTAgg):
def __init__(self,parent=None,width=5,height=4,dpi=100):
fig=Figure(figsize=(width,height),dpi=dpi)
self.axes=fig.add_subplot(111)
super().__init__(fig)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super().__init__()
self._data = data
def data(self, index, role):
if role == Qt.DisplayRole:
value = self._data.iloc[index.row(), index.column()]
return str(value)
def rowCount(self, index):
return self._data.shape[0]
def columnCount(self, index):
return self._data.shape[1]
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._data.columns[section])
if orientation == Qt.Vertical:
return str(self._data.index[section])
class MatplotlibWidget(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
loadUi("untitled.ui",self)
self.setWindowTitle("SwarmDynamics Equity Curve Builder")
self.table = QtWidgets.QTableView()
conn=sqlite3.connect('D:\Qt\Test\\GBPUSD.db')
data=pd.read_sql('Select * from Data',conn)
data['Sum']=data['Delta_Equity_Adjusted'].sum()
systems=pd.read_sql('SELECT DISTINCT System from Data',conn)
conn.close()
###########
self.model = TableModel(data)
self.tableView.setModel(self.model)
self.pushButton.pressed.connect(self.add)
##############
self.selected_system.addItems(list(systems['System']))
#self.selected_system.currentIndexChanged.connect(self.index_changed)
self.selected_system.currentTextChanged.connect(self.text_changed)
def index_changed(self, i): # i is an int
print(i)
def text_changed(self, s): # s is a str
print('Plotting new graph :' + s)
conn=sqlite3.connect('D:\Qt\Test\\GBPUSD.db')
data=pd.read_sql('Select Total_Equity from Data where System=\"' + s + '\"',conn)
conn.close()
sc=MplCanvas(self,width=5,height=4,dpi=100)
data['Total_Equity'].plot(ax=sc.axes)
layout=QtWidgets.QVBoxLayout()
layout.addWidget(sc)
self.widget.setLayout(layout)
def update_plot(self):
self.sc.axes.cla()
#self.sc.draw()
#self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))
def add(self):
print ('pish')
#self.textBrowser.insertPlainText('Loading data for symbol ')
app = QApplication([])
app.setStyle('Fusion')
window = MatplotlibWidget()
window.show()
app.exec_()
如果我正确理解了您的代码,您正在尝试通过完全重新创建 MplCanvas 来更新 plot。 只创建一次 canvas 并在使用其绘制方法更新 plot 时保留它会更有效。
我已将您的代码归结为一个最小的工作示例,它应该可以传达这个想法:
from PyQt5.QtWidgets import *
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super().__init__(fig)
class MatplotlibWidget(QMainWindow):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.pushButton = QPushButton("Update Plot")
layout.addWidget(self.pushButton)
# canvas gets created during init once
self.sc = MplCanvas(self, width=5, height=4, dpi=100)
layout.addWidget(self.sc)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.update_plot()
self.pushButton.pressed.connect(self.update_plot)
self.show()
def update_plot(self):
# new data is plotted
self.sc.axes.cla()
data = np.array(np.random.random(3))
self.sc.axes.plot(data)
# canvas gets updated by redrawing (if this line is omitted, nothing gets updated
self.sc.draw()
app = QApplication([])
window = MatplotlibWidget()
app.exec_()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.