繁体   English   中英

Pyqt5 plot 没有更新?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM