我已经看到很多使用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()函数到达轮廓部分。任何关于它为什么是断层错误的见解将不胜感激。
答案 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_()