Matplotlib Pyqt4 resizeEvent -> kein 3D drehen mehr moegl

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ich versuche gerade ein bisschen mit pyqt4, matplotlib rumzuspielen und habe mal einen kleinen 3D-Plot gebastelt(hier).
Leider kann ich den 3D-Plot nur drehen und vergroessern, solange nicht resizeEvent aufgerufen wurde.

Irgendwas fehlt also noch, aber ich komme einfach nicht drauf was.

Wenn es hilft, kann ich die 80 Zeilen auch noch ein wenig "eindampfen".
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Es scheint irgendwo hier zu haken:

Code: Alles auswählen

self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self)
Leider resized ohne diese beiden Zeilen nur der Plot nutzlos im Hintergrund, der Vordergrund bleibt grau.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ok, das Problem scheint irgendwie mehr ein grundsaetzliches zu sein. Ich hab jetzt mal alle absoluten Groessen herausgelassen, aber ich kann noch immer nicht vernuenftig resizen. Konkret: Ich kann nur bis 583x459 Pixel korrekt resizen, danach vergroessert sich zwar noch der Plot an sich, aber im Qt Fenster bleibt die gezeigte Flaeche auf dieser Groesse (der Plot wird also vom grau ueberdeckt)

Kann das mal jemand auf einem anderen Rechner ueberpruefen?

Code: Alles auswählen

#!/usr/bin/env python

from __future__ import division
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from numpy import *
from scipy.integrate import odeint
import mpl_toolkits.mplot3d as p3
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class MyForm(QMainWindow):
    def __init__(self, parent = None):
        super(MyForm, self).__init__(parent)
        self.plot = LorenzPlot()
        self.setCentralWidget(self.plot)

class LorenzPlot(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        
        self.fig = Figure()
        self.ax = p3.Axes3D(self.fig)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self)
    
    def resizeEvent(self, ev):
        self.ax.clear()
        self.canvas.draw()
        self.fig.set_size_inches(self.size().width()/self.fig.get_dpi(),
                self.size().height()/self.fig.get_dpi())
        self.draw_plot()
        print self.fig.get_size_inches()*self.fig.get_dpi()
        print self.size()

    def Lorenz(self, w, t, s, r, b):
        x, y, z = w
        return array([s*(y-x), r*x-y-x*z, x*y-b*z])

    def draw_plot(self, s=8.0, r=28.1, b=8/3.0):
        # Parameters
        self.s, self.r, self.b = s, r, b
        
        self.w_0 = array([0., 0.8, 0.])         # initial condition
        self.time = arange(0., 100., 0.01)      # time vector 
        #integrate a system of ordinary differential equations
        self.trajectory = odeint(self.Lorenz, self.w_0, self.time, args=(self.s, self.r, self.b))
        
        self.x = self.trajectory[:, 0]
        self.y = self.trajectory[:, 1]
        self.z = self.trajectory[:, 2]
        
        self.ax = p3.Axes3D(self.fig)
        self.ax.plot3D(self.x, self.y, self.z)
        self.canvas.draw()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = MyForm()
    form.show()
    sys.exit(app.exec_())
Antworten