如何在qt小部件中显示matplotlib.pyplot?

时间:2018-06-18 08:11:57

标签: python python-3.x matplotlib pyqt pyqt5

我想在widget(QWidget)中显示我在QtDesigner中设计的gui中的pyplot图像:

enter image description here

当我按下Çiz按钮时,我希望显示我可以使用该代码在python中创建的图像:

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

x = points[:,0]
y = points[:,1]
# calculate polynomial
z = np.polyfit(x, y, 2)
f = np.poly1d(z)

x_fit = np.linspace(min(x), max(x), 10000)
y_fit = [f(_x) for _x in x_fit]

plt.plot(x, y)
plt.plot(x_fit, y_fit)
plt.show()

enter image description here

修改

我根据answer进行了一些更改,但我遇到了新问题。

我推广之后:

enter image description here

我重新安排了下面的代码:

# calculate polynomial and r
self.x_fit = np.linspace(min(self.itemX), max(self.itemY), 10000)
self.y_fit = [f(_x) for _x in self.x_fit]

self._dlg.plotwidget.plot(self.itemX, self.itemY)
self._dlg.plotwidget.plot(self.x_fit, self.y_fit)

self.itemX是列表中的x值。

self.itemY是列表中的y值。

self._dlg是您看到的MainWindow。

当我尝试打开该窗口时,收到以下错误消息:

enter image description here

2 个答案:

答案 0 :(得分:0)

抱歉,我没有完全回答这个问题,但我没有将matplotlib.pyplot与pyqt一起使用。我建议使用pyqtgraph(http://pyqtgraph.org),它非常方便和强大。使用Qt Designer:

  • 您只需插入一个'图形视图'在你的GUI中
  • 你右键点击它并将其推广到" plotwidget"使用pyqtgraph。我想英文标签是这样的:基类' QGraphicsView&#39 ;;推广课程' PlotWidget&#39 ;;标题文件' pyqtgraph',然后'添加',然后'推广'
  • 然后你可以制作plotwidget.plot(x,y,...),plotwidget.clear()和co。它将使用一堆相互作用的可能性绘制plotwidget内的所有内容

答案 1 :(得分:0)

我刚测试下面的代码对我有用:

import sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui, uic
uifilename = 'test.ui'
form_class = uic.loadUiType(uifilename)[0] #dirty reading of the ui file. better to convert it to a '.py'

class MyWindowClass(QtGui.QMainWindow, form_class):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.onInit()

    def onInit(self):
#usually a lot of connections here
        self.x_fit = np.linspace(1,10000, 10000)
        self.y_fit = [f(_x) for _x in self.x_fit]
        self.plotwidget.plot(self.x_fit,self.y_fit,symbol='o',pen=None)
        self.plotwidget.setLabel('left',text='toto',units='')
        self.plotwidget.setLabel('top',text='tata',units='')

def f(x):
    return x**2+1

if __name__ == '__main__':
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        app = QtGui.QApplication([])
        pg.setConfigOption('background', 'w') 
        win = MyWindowClass()
        win.show()
        app.exec_()

使用此test.ui:https://github.com/steph2016/profiles/blob/master/test.ui。 请注意,plotwidget封装在布局中。我认为它只适用于主窗口,但我不确定......