Skalierung embedded-matplotlib widgets in qt geschriebene Anwendung in python-problem
Schreibe ich eine einfache digital-image-processing-Programm. Dazu habe ich eingebettet eine mpl-widget in meine qt-Anwendung. Die Benutzer können führen Sie einige einfache Analysen auf dem Bild wie box-Auto-filter, FFT etc. Jedes Ding ist in Ordnung, bis ich Sie wechseln möchten, aus der Anzeige eines Bildes zur Darstellung einer Handlung.
Wenn ich ein Grundstück zuerst die Achse sind in Ordnung (siehe unten plot im Bild). Aber wenn ich ein Bild zuerst, gefolgt von einem Grundstück (Obere Diagramm im Bild), der Skala komprimiert.
https://picasaweb.google.com/105163945296073520628/Temp <-- sorry ich kann keine Bilder hochladen noch
Den code gehostet wird, ist hier https://code.launchpad.net/~marrabld/pymi/trunk
Bin ich mit imshow (), um das Bild anzuzeigen. und plot(x,y) für die Grundstücke.
Dies ist die Haupt-update-Methode
def updateImage(self):
self.ui.mplWidget.canvas.PlotTitle = self.plotTitle
self.ui.mplWidget.canvas.xtitle = self.xTitle
self.ui.mplWidget.canvas.ytitle = self.yTitle
#self.ui.mplWidget.canvas.ax.visible(False)
self.ui.mplWidget.canvas.format_labels()
if self.projectProperty == globals.IMAGE:
if self.lastProjectProperty == globals.PLOT:
self.myImage = imageFuncs.basic(self.imageFileName)
self.imPlot = self.ui.mplWidget.canvas.ax.imshow(self.myImage.image,cmap=matplotlib.cm.gray,origin='upper')
elif self.projectProperty == globals.PLOT:
if self.lastProjectProperty == globals.IMAGE: # we need to reload the GUI
self.ui.mplWidget.canvas.ax.hold(False)
self.ui.mplWidget.canvas.ax.plot(self.xData,self.yData)
self.ui.mplWidget.canvas.draw()
- Und mpl-widget bin ich mit
#!/usr/bin/env python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
#from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backend_bases import NavigationToolbar2
from matplotlib.figure import Figure
from matplotlib import rc
import numpy as N
class MyMplCanvas(FigureCanvas):
def __init__(self, parent=None, width = 10, height = 12, dpi = 125, sharex = None, sharey = None):
rc('text', usetex=True)
rc('font', family='sans-serif')
rc('legend',fontsize='small' )
rc('legend',shadow='true')
self.fig = Figure(figsize = (width, height), dpi=dpi, facecolor = '#FFFFFF')
self.ax = self.fig.add_subplot(111, sharex = sharex, sharey = sharey)
self.fig.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
self.fig.add_axes(yscale='symlog')
self.xtitle=r"x-Axis"
self.ytitle=r"y-Axis"
self.PlotTitle = r"Title"
self.grid_status = True
self.xaxis_style = 'linear'
self.yaxis_style = 'linear'
#self.fig.yscale = 'log'
self.format_labels()
self.ax.hold(True)
FigureCanvas.__init__(self, self.fig)
#self.fc = FigureCanvas(self.fig)
#FigureCanvas.setSizePolicy(self,
# QSizePolicy.Expanding,
# QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
def format_labels(self):
self.ax.set_title(self.PlotTitle)
self.ax.title.set_fontsize(5)
self.ax.set_xlabel(self.xtitle, fontsize = 4)
self.ax.set_ylabel(self.ytitle, fontsize = 4)
labels_x = self.ax.get_xticklabels()
labels_y = self.ax.get_yticklabels()
for xlabel in labels_x:
xlabel.set_fontsize(4)
for ylabel in labels_y:
ylabel.set_fontsize(4)
ylabel.set_color('b')
def sizeHint(self):
w, h = self.get_width_height()
return QSize(w, h)
def minimumSizeHint(self):
return QSize(10, 10)
def sizeHint(self):
w, h = self.get_width_height()
return QSize(w, h)
def minimumSizeHint(self):
return QSize(10, 10)
#mouseClick = pyqtProperty("QPoint",mouseClick,click)
class mplWidget(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self, parent)
self.canvas = MyMplCanvas()
#self.toolbar = MyNavigationToolbar(self.canvas, self.canvas, direction = 'v')
self.hbox = QHBoxLayout()
#self.hbox.addWidget(self.toolbar)
self.hbox.addWidget(self.canvas)
self.setLayout(self.hbox)
def savePlot(self,filePath):
self.canvas.fig.savefig(filePath)
def setLegend(self,handle, label):
self.canvas.fig.legend(handle,label,'upper right')
def clearPlot(self):
self.canvas.fig.clear()
width = 10
height = 12
dpi = 125
sharex = None
sharey = None
self.canvas.fig = Figure(figsize = (width, height), dpi=dpi, facecolor = '#FFFFFF')
self.canvas.ax = self.canvas.fig.add_subplot(111, sharex = sharex, sharey = sharey)
self.canvas.fig.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
self.canvas.fig.add_axes(yscale='symlog')
self.canvas.xtitle=r"x-Axis"
self.canvas.ytitle=r"y-Axis"
self.canvas.PlotTitle = r"Title"
self.canvas.grid_status = True
self.canvas.xaxis_style = 'linear'
self.canvas.yaxis_style = 'linear'
#self.fig.yscale = 'log'
self.canvas.format_labels()
self.canvas.ax.hold(True)
FigureCanvas.__init__(self.canvas, self.canvas.fig)
#self.fc = FigureCanvas(self.fig)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
Jegliche Hilfe würde sehr geschätzt werden.
InformationsquelleAutor Caustic | 2011-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie Aspekt-parameter von imshow() um das Verhältnis zwischen der Höhe & Gewicht:
aber es wird das Bild dehnen.
oder Sie können xlim(), ylim() die Menge der Bereich der x-y-Achse.
EDIT:
imshow() setzt den Aspekt Eigenschaft von axe zu "gleich". Sie müssen es zurücksetzen, vor dem Aufruf von plot():
Es ist das problem über den Aspekt der Eigenschaft, aber ich wusste nicht Lesen Sie Ihren code sorgfältig. Nachdem überprüft Ihren code, bearbeitete ich die Antwort. Bitte überprüfen Sie es erneut.
Meister!!!! Dank
InformationsquelleAutor HYRY