2014-11-17 3 views
0

Я видел множество примеров интеграции matplotlib с python2.6 и QT4 Designer с использованием mplwget, и они отлично работают. Теперь мне нужно интегрировать pyplot с QT4 Designer, но не могу найти никаких примеров. Все мои попытки интегрировать графику pyplot закончились сбоем seg. Может кто-нибудь, пожалуйста, направить меня к рабочему примеру с помощью Designer и pyplot?Пример pyplot с QT Designer

Последующие действия: Хорошо, поэтому я попробовал ваше решение, но у меня все еще есть проблемы. К сожалению, машина я использую для этого кода не подключен к Интернету, поэтому ниже толстый палец из соответствующих частей коды я использую:

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(). Будем очень благодарны за любые идеи относительно того, почему это происходит.

ответ

3

Если вы имеете в виду mplwidget от Python(x,y) и WinPython, я думаю, что это делает использование pyplot, но у меня была проблема положить его в моем питона установить так что я просто использовал этот класс:

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 и заголовочный файл: скрипт python, содержащий класс MatplotlibWidget (без .py). Вы можете добавить в класс такие вещи, как ax = self.figure.add_subplot(111), line = ax.plt(...) или путем вызова методов атрибута figure экземпляра класса.

Edit: Так что я был немного не так, прежде чем, в общем со встроенными Matplotlib виджетов необходимо использовать объектно-ориентированные методы, а не функции в pyplot. (This объясняет, в чем разница.) Используя мой фрагмент выше как mymatplotlibwidget.py, попробуйте что-то вроде этого. У меня нет базовой карты, поэтому это несколько догадка, но из примеров вам нужно указать Basemap, какие оси использовать.

+0

Спасибо! Я дам это попробовать – mlbrink

+0

Хорошо, поэтому я не мог получить это, чтобы работать - см. Обновление исходного вопроса – mlbrink

+0

См. Мое редактирование выше, и вы не должны вызывать plt.figure(), потому что виджет уже имеет фигура внутри него. – firescape