[英]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.