使用QT Designer的pyplot示例

时间:2014-11-17 13:59:52

标签: matplotlib pyqt4 qt-designer

我已经看到很多使用mplwidget将matplotlib与python2.6和QT4 Designer集成的示例,它们工作正常。我现在需要将一个pyplot与QT4 Designer集成,但找不到任何示例。我整合pyplot图形的所有尝试都以seg故障结束。有人可以使用Designer和pyplot将我引导到一个工作示例吗?

跟进: 好的,所以我尝试了你的解决方案,但我仍然遇到问题。不幸的是,我用于此代码的机器没有连接到互联网,所以下面是我正在使用的代码的相关部分的肥胖手指:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import MatplotlibWidget     # This is the code snippet you gave in your answer

.
.
.
def drawMap(self) :

    fig = plt.figure()  

    map = Basemap(projection='cyl', llcrnrlat = -90.0, urcrnrlat = 90.0, llcrnrlon = -180.0, urcrnrlon = 180.0, resolution = 'c')
    map.drawcoastlines()
    map.drawcountries()
    plt.show()


def drawMap_Qt(self) :

    self.ui.PlotWidget.figure = plt.figure()  # This is the Qt widget promoted to MatplotlibWidget

    map = Basemap(projection='cyl', llcrnrlat = -90.0, urcrnrlat = 90.0, llcrnrlon = -180.0, urcrnrlon = 180.0, resolution = 'c')
    map.drawcoastlines()
    map.drawcountries()
    self.ui.PlotWidget.show()

函数drawMap()工作正常。它会创建一个单独的窗口并绘制地图。 drawMap_Qt()函数导致分段错误,没有其他错误。最终目标是在地图上绘制轮廓。我可以使用drawMap()函数执行此操作。当然,我甚至无法使用drawMap_Qt()函数到达轮廓部分。任何关于它为什么是断层错误的见解将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果你指的是来自Python(x,y)WinPython的mplwidget,我认为它确实使用了pyplot,但我在将它放入python安装时遇到了麻烦,所以我只使用了这个类:

from PyQt4 import QtGui
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

class MatplotlibWidget(QtGui.QWidget):
    def __init__(self, parent=None, *args, **kwargs):
        super(MatplotlibWidget, self).__init__(parent)
        self.figure = Figure(*args, **kwargs)
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        self.setLayout(layout)

另见How to embed matplotib in pyqt - for Dummies

然后在Qt Designer中你需要创建一个提升类,其基类为:QWidget,提升类名:MatplotlibWidget和头文件:包含MatplotlibWidget类的python脚本(不带.py)。您可以在类中添加ax = self.figure.add_subplot(111)line = ax.plt(...)之类的内容,也可以通过调用类实例的figure属性的方法。

修改 所以我以前有点不对,通常使用嵌入式matplotlib小部件你需要使用面向对象的方法而不是pyplot中的函数。 (This解释了它的不同之处。)使用我上面的片段作为mymatplotlibwidget.py,尝试这样的事情。我没有安装底图,所以这有点猜测,但是从示例中你需要告诉Basemap使用哪些轴。

import sys
from PyQt4 import QtGui
from mpl_toolkits.basemap import Basemap
from mymatplotlibwidget import MatplotlibWidget

app = QtGui.QApplication(sys.argv)
widget = MatplotlibWidget()
fig = widget.figure
ax = fig.add_subplot(111)
map = Basemap(..., ax=ax)
fig.canvas.draw()
widget.show()
app.exec_()