【问题标题】:set figure size (mpl) is not influence canvas and layout设置图形大小(mpl)不影响画布和布局
【发布时间】:2018-08-16 19:51:35
【问题描述】:

我正在尝试将小部件大小调整为图形大小。由于某种原因,画布和小部件的大小没有改变。我尝试设置容器小部件和画布的 SizePolicy,结果相同。

import sys
import matplotlib.pyplot as plt
from PyQt4 import QtGui

class CanvasOnWidget(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self._layout = QtGui.QVBoxLayout(self)
        self._fig = plt.figure()
        self._layout.addWidget(self._fig.canvas)
        plt.plot(range(10),range(10))
        self._fig.canvas.mpl_connect('button_press_event', self._resize)

    def _resize(self, event):
        w,h = self._fig.get_size_inches()
        if event.button == 1: # left click
            h-=1
        elif event.button == 3: # right click
            h+=1
        self._fig.set_size_inches(w, h, forward=True)
        self._fig.canvas.draw()
        self._fig.canvas.flush_events()
        print self.size()
        print self._fig.canvas.size()
        print self._fig.get_size_inches()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = CanvasOnWidget()
    main.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python user-interface matplotlib pyqt4


    【解决方案1】:

    我想您需要通知小部件您希望更改其大小。 这可以使用.resize 来完成。由于画布周围有边框,因此在设置新的小部件大小时需要考虑此边框。

    import sys
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    from PyQt4 import QtGui
    
    
    class CanvasOnWidget(QtGui.QWidget):
    
        def __init__(self):
            QtGui.QWidget.__init__(self)
    
            self._layout = QtGui.QVBoxLayout(self)
            self.setLayout(self._layout)
            self._fig = Figure()
            self.canv = FigureCanvas(self._fig)
            self._layout.addWidget(self.canv)
    
            ax = self._fig.add_subplot(111)
            ax.plot(range(10),range(10))
            self._fig.canvas.mpl_connect('button_press_event', self._resize)
    
        def _resize(self, event):
            w,h = self._fig.get_size_inches()
            dw = self.size().width()-w*self._fig.dpi
            dh = self.size().height()-h*self._fig.dpi
            if event.button == 1: # left click
                h-=1
            elif event.button == 3: # right click
                h+=1
            self._fig.set_size_inches(w, h, forward=True)
    
            self._fig.canvas.draw_idle()
            self.resize(w*100+dw,h*100+dh)
    
            print self.size()
            print self._fig.canvas.size()
            print self._fig.get_size_inches()
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        main = CanvasOnWidget()
        main.show()
        sys.exit(app.exec_())
    

    请注意,为了将Figure 放入FigureCanvasQT,我已更改为代码。在 Qt GUI 中使用 pyplot 会导致问题。

    但是,如果你想使用pyplot,整个代码可以简化很多。

    import matplotlib.pyplot as plt
    
    class Plot():
    
        def __init__(self):
            self._fig = plt.figure()
            ax = self._fig.add_subplot(111)
            ax.plot(range(10),range(10))
            self._fig.canvas.mpl_connect('button_press_event', self._resize)
    
        def _resize(self, event):
            w,h = self._fig.get_size_inches()
            if event.button == 1: # left click
                h-=1
            elif event.button == 3: # right click
                h+=1
            self._fig.set_size_inches(w, h, forward=True)
    
            self._fig.canvas.draw_idle()
            print self._fig.get_size_inches()
    
    if __name__ == '__main__':
        app = Plot()
        plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      相关资源
      最近更新 更多