zoukankan      html  css  js  c++  java
  • PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar

    本文目的:展示 PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar。

    本人搜遍所有网络无果,没办法,查看PyQt5源代码,最终才搞明白。。。特此留记。

    〇、PyQt4 与 PyQt5 导入 NavigationToolbar 时的区别(去掉两个agg

    # PyQt4 版本(网传)
    #from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

    # PyQt5 版本 from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar

    一、隐藏 matplotlib 工具条

    import sys
    from PyQt5 import QtWidgets
     
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
     
    import random
     
    class Window(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.figure = plt.figure()
            self.axes = self.figure.add_subplot(111)
            # We want the axes cleared every time plot() is called
            self.axes.hold(False)
            self.canvas = FigureCanvas(self.figure)
     
             
            self.toolbar = NavigationToolbar(self.canvas, self)
            self.toolbar.hide()
     
            # Just some button 
            self.button1 = QtWidgets.QPushButton('Plot')
            self.button1.clicked.connect(self.plot)
     
            self.button2 = QtWidgets.QPushButton('Zoom')
            self.button2.clicked.connect(self.zoom)
             
            self.button3 = QtWidgets.QPushButton('Pan')
            self.button3.clicked.connect(self.pan)
             
            self.button4 = QtWidgets.QPushButton('Home')
            self.button4.clicked.connect(self.home)
     
     
            # set the layout
            layout = QtWidgets.QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            
            btnlayout = QtWidgets.QHBoxLayout()
            btnlayout.addWidget(self.button1)
            btnlayout.addWidget(self.button2)
            btnlayout.addWidget(self.button3)
            btnlayout.addWidget(self.button4)
            qw = QtWidgets.QWidget(self)
            qw.setLayout(btnlayout)
            layout.addWidget(qw)
            
            self.setLayout(layout)
     
        def home(self):
            self.toolbar.home()
        def zoom(self):
            self.toolbar.zoom()
        def pan(self):
            self.toolbar.pan()
             
        def plot(self):
            ''' plot some random stuff '''
            data = [random.random() for i in range(25)]
            self.axes.plot(data, '*-')
            self.canvas.draw()
     
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
     
        main = Window()
        main.setWindowTitle('Simple QTpy and MatplotLib example with Zoom/Pan')
        main.show()
     
        sys.exit(app.exec_())

    二、显示 matplotlib 工具条

    import sys, os, random
    
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    import matplotlib
    matplotlib.use('Qt5Agg')
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.figure import Figure
    
    
    class AppForm(QMainWindow):
        def __init__(self, parent=None):
            QMainWindow.__init__(self, parent)
            self.setWindowTitle('Demo: PyQt with matplotlib')
    
            self.create_menu()
            self.create_main_frame()
            self.create_status_bar()
    
            self.textbox.setText('1 2 3 4')
            self.on_draw()
    
        def save_plot(self):
            file_choices = "PNG (*.png)|*.png"
            
            path = QFileDialog.getSaveFileName(self, 
                            'Save file', '', 
                            file_choices)
            if path:
                self.canvas.print_figure(path, dpi=self.dpi)
                self.statusBar().showMessage('Saved to %s' % path, 2000)
        
        def on_about(self):
            msg = """ A demo of using PyQt with matplotlib:
            
             * Use the matplotlib navigation bar
             * Add values to the text box and press Enter (or click "Draw")
             * Show or hide the grid
             * Drag the slider to modify the width of the bars
             * Save the plot to a file using the File menu
             * Click on a bar to receive an informative message
            """
            QMessageBox.about(self, "About the demo", msg.strip())
        
        def on_pick(self, event):
            # The event received here is of the type
            # matplotlib.backend_bases.PickEvent
            #
            # It carries lots of information, of which we're using
            # only a small amount here.
            # 
            box_points = event.artist.get_bbox().get_points()
            msg = "You've clicked on a bar with coords:
     %s" % box_points
            
            QMessageBox.information(self, "Click!", msg)
        
        def on_draw(self):
            """ Redraws the figure
            """
            #str = unicode(self.textbox.text())
            self.data = list(map(int, self.textbox.text().split()))
            
            x = range(len(self.data))
    
            # clear the axes and redraw the plot anew
            #
            self.axes.clear()        
            self.axes.grid(self.grid_cb.isChecked())
            
            self.axes.bar(
                left=x, 
                height=self.data, 
                width=self.slider.value() / 100.0, 
                align='center', 
                alpha=0.44,
                picker=5)
            
            self.canvas.draw()
        
        def create_main_frame(self):
            self.main_frame = QWidget()
            
            # Create the mpl Figure and FigCanvas objects. 
            # 5x4 inches, 100 dots-per-inch
            #
            self.dpi = 100
            self.fig = Figure((5.0, 4.0), dpi=self.dpi)
            self.canvas = FigureCanvas(self.fig)
            self.canvas.setParent(self.main_frame)
            
            # Since we have only one plot, we can use add_axes 
            # instead of add_subplot, but then the subplot
            # configuration tool in the navigation toolbar wouldn't
            # work.
            #
            self.axes = self.fig.add_subplot(111)
            
            # Bind the 'pick' event for clicking on one of the bars
            #
            self.canvas.mpl_connect('pick_event', self.on_pick)
            
            # Create the navigation toolbar, tied to the canvas
            #
            self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
            
            # Other GUI controls
            # 
            self.textbox = QLineEdit()
            self.textbox.setMinimumWidth(200)
            self.textbox.editingFinished.connect(self.on_draw)
            
            self.draw_button = QPushButton("&Draw")
            self.draw_button.clicked.connect(self.on_draw)
            
            
            self.grid_cb = QCheckBox("Show &Grid")
            self.grid_cb.setChecked(False)
            self.grid_cb.stateChanged.connect(self.on_draw) #int
            
            slider_label = QLabel('Bar width (%):')
            self.slider = QSlider(Qt.Horizontal)
            self.slider.setRange(1, 100)
            self.slider.setValue(20)
            self.slider.setTracking(True)
            self.slider.setTickPosition(QSlider.TicksBothSides)
            self.slider.valueChanged.connect(self.on_draw)#int
            
            #
            # Layout with box sizers
            # 
            hbox = QHBoxLayout()
            
            for w in [  self.textbox, self.draw_button, self.grid_cb,
                        slider_label, self.slider]:
                hbox.addWidget(w)
                hbox.setAlignment(w, Qt.AlignVCenter)
            
            vbox = QVBoxLayout()
            vbox.addWidget(self.mpl_toolbar)
            vbox.addWidget(self.canvas)
            vbox.addLayout(hbox)
            
            self.main_frame.setLayout(vbox)
            self.setCentralWidget(self.main_frame)
        
        def create_status_bar(self):
            self.status_text = QLabel("This is a demo")
            self.statusBar().addWidget(self.status_text, 1)
            
        def create_menu(self):        
            self.file_menu = self.menuBar().addMenu("&File")
            
            load_file_action = self.create_action("&Save plot",
                shortcut="Ctrl+S", slot=self.save_plot, 
                tip="Save the plot")
            quit_action = self.create_action("&Quit", slot=self.close, 
                shortcut="Ctrl+Q", tip="Close the application")
            
            self.add_actions(self.file_menu, 
                (load_file_action, None, quit_action))
            
            self.help_menu = self.menuBar().addMenu("&Help")
            about_action = self.create_action("&About", 
                shortcut='F1', slot=self.on_about, 
                tip='About the demo')
            
            self.add_actions(self.help_menu, (about_action,))
    
        def add_actions(self, target, actions):
            for action in actions:
                if action is None:
                    target.addSeparator()
                else:
                    target.addAction(action)
    
        def create_action(  self, text, slot=None, shortcut=None, 
                            icon=None, tip=None, checkable=False, 
                            signal="triggered()"):
            action = QAction(text, self)
            if icon is not None:
                action.setIcon(QIcon(":/%s.png" % icon))
            if shortcut is not None:
                action.setShortcut(shortcut)
            if tip is not None:
                action.setToolTip(tip)
                action.setStatusTip(tip)
            if slot is not None:
                action.triggered.connect(slot)
            if checkable:
                action.setCheckable(True)
            return action
    
    
    def main():
        app = QApplication(sys.argv)
        form = AppForm()
        form.show()
        app.exec_()
        
    if __name__ == "__main__":
        main()
        
  • 相关阅读:
    事务的特性(ACID)
    网络代理
    防止SpringMVC拦截器拦截js等静态资源文件
    Tomcat配置虚拟目录
    SpringMVC总结(SSM)
    Spring声明式事务总结
    Linux中MySQL忽略表中字段大小写
    MySQL之sql文件的导入导出
    MyBatis总结
    Linux网络
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5189843.html
Copyright © 2011-2022 走看看