figure und pyplot bei Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

Unter pyplot-plots gibt es ja eine Navigations toolbar (z.B Zoom, Speicher-Button etc.). Wie hängen denn die Klassen matplotlib.pyplot und matplotlib.figure überhaupt zusammen und wie kann ich diese toolbar auch unter pyplot auch für figure-Objekte verwenden. Bei meinem Beispiel habe ich 2 plots Example 1 und Example 2 (matplotlibwidget), die nacheinander augerufen werden (Example 2 nach schließen von Example 1). Kann mir jemand erklären ob und wie ich die toolbar von Example 1 auch für Example 2 benutzen kann?

Code: Alles auswählen

from PyQt4 import QtCore, QtGui
import sys
from PyQt4.QtGui import QMainWindow, QApplication
from numpy import linspace

from PyQt4.QtGui import QSizePolicy
from PyQt4.QtCore import QSize

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as Canvas
from matplotlib.figure import Figure
from matplotlib import rcParams
rcParams['font.size'] = 9

import matplotlib.pyplot as plt

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.mplwidget = MatplotlibWidget(self.centralwidget)
        self.mplwidget.setGeometry(QtCore.QRect(190, 90, 400, 300))
        self.mplwidget.setObjectName(_fromUtf8("mplwidget"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))

class MatplotlibWidget(Canvas):
    
    def __init__(self, parent=None, title='', xlabel='', ylabel='',
                 xlim=None, ylim=None, xscale='linear', yscale='linear',
                 width=4, height=3, dpi=100, hold=False):
        self.figure = Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.figure.add_subplot(111)
        self.axes.set_title(title)
        self.axes.set_xlabel(xlabel)
        self.axes.set_ylabel(ylabel)
        if xscale is not None:
            self.axes.set_xscale(xscale)
        if yscale is not None:
            self.axes.set_yscale(yscale)
        if xlim is not None:
            self.axes.set_xlim(*xlim)
        if ylim is not None:
            self.axes.set_ylim(*ylim)
        self.axes.hold(hold)

        Canvas.__init__(self, self.figure)
        self.setParent(parent)

        Canvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        Canvas.updateGeometry(self)

    def sizeHint(self):
        w, h = self.get_width_height()
        return QSize(w, h)

    def minimumSizeHint(self):
        return QSize(10, 10)

class ApplicationWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.mplwidget = MatplotlibWidget(self, title='Example 2',
                                          xlabel='Linear scale',
                                          ylabel='Log scale',
                                          hold=True, yscale='log')
        self.mplwidget.setFocus()
        self.setCentralWidget(self.mplwidget)
        self.plot(self.mplwidget.axes)
        
    def plot(self, axes):
        x = linspace(-10, 10)
        axes.plot(x, x**2)
        axes.plot(x, x**3)
    
app = QApplication(sys.argv)
win = ApplicationWindow()
#zum Vergleich
x2=linspace(0,10)
plt.plot(x2,x2**2)
plt.title('Example 1')
plt.show()

win.show()
sys.exit(app.exec_())

Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Füge den folgenden Code ein, dann hast Du eine Toolbar.

Code: Alles auswählen

# nach Zeile 9
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT 

# nach Zeile 93
self.toolbar = NavigationToolbar2QT(canvas=self.mplwidget, parent=self)
self.addToolBar(self.toolbar)
a fool with a tool is still a fool, www.magben.de, YouTube
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

Du bist der Beste.

Danke
Antworten