Python 如何在我的 GUI 上绘图

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3972158/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 13:37:33  来源:igfitidea点击:

How to plot on my GUI

pythonmatplotlibpyqtpysideqthread

提问by Ricardo Alberto

I'm designing a GUI with PyQtwhere I need to display a matplotlib/pylab window when I click on a button that makes the plot of the data from a function I've created. It's like a runtime used in Matlab. I want to keep the matplotlib/pylab window as my window everytime I press that button.

我正在设计一个 GUI,PyQt当我单击一个按钮时,我需要在其中显示一个 matplotlib/pylab 窗口,该按钮从我创建的函数中绘制数据图。它就像在 Matlab 中使用的运行时。每次按下该按钮时,我都希望将 matplotlib/pylab 窗口保留为我的窗口。

回答by Hans Hermans

Eli Bendersky has written a code example that uses matplotlib within PyQt: http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/

Eli Bendersky 编写了一个在 PyQt 中使用 matplotlib 的代码示例:http: //eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/

回答by Luke

Integrating Matplotlib with PyQt takes a little work. Here's an example: http://sourceforge.net/mailarchive/message.php?msg_id=29086544

将 Matplotlib 与 PyQt 集成需要一些工作。这是一个例子:http: //sourceforge.net/mailarchive/message.php?msg_id=29086544

However, there are a few plotting libraries designed specifically around PyQt:

但是,有一些专门围绕 PyQt 设计的绘图库:

回答by Luke

Here is a basic example that will plot three different samples using a QThread:

这是一个基本示例,它将使用 绘制三个不同的样本QThread

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import random

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from matplotlib.figure import Figure

from PyQt4 import QtGui, QtCore

class MatplotlibWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MatplotlibWidget, self).__init__(parent)

        self.figure = Figure()
        self.canvas = FigureCanvasQTAgg(self.figure)

        self.axis = self.figure.add_subplot(111)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.canvas)

class ThreadSample(QtCore.QThread):
    newSample = QtCore.pyqtSignal(list)

    def __init__(self, parent=None):
        super(ThreadSample, self).__init__(parent)

    def run(self):
        randomSample = random.sample(range(0, 10), 10)

        self.newSample.emit(randomSample)

class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.pushButtonPlot = QtGui.QPushButton(self)
        self.pushButtonPlot.setText("Plot")
        self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked)

        self.matplotlibWidget = MatplotlibWidget(self)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.pushButtonPlot)
        self.layoutVertical.addWidget(self.matplotlibWidget)

        self.threadSample = ThreadSample(self)
        self.threadSample.newSample.connect(self.on_threadSample_newSample)
        self.threadSample.finished.connect(self.on_threadSample_finished)

    @QtCore.pyqtSlot()
    def on_pushButtonPlot_clicked(self):
        self.samples = 0
        self.matplotlibWidget.axis.clear()
        self.threadSample.start()

    @QtCore.pyqtSlot(list)
    def on_threadSample_newSample(self, sample):
        self.matplotlibWidget.axis.plot(sample)
        self.matplotlibWidget.canvas.draw()

    @QtCore.pyqtSlot()
    def on_threadSample_finished(self):
        self.samples += 1
        if self.samples <= 2:
            self.threadSample.start()

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.resize(666, 333)
    main.show()

    sys.exit(app.exec_())

image

图片

回答by leermeester

If I understand you correctly you have an application with a GUI and you want to plot a graph in a separate window than the GUI uses. pyqtgraphcan do this nicely.

如果我理解正确,您有一个带有 GUI 的应用程序,并且您想在一个单独的窗口中绘制图形而不是 GUI 使用的窗口。pyqtgraph可以很好地做到这一点。

first type pip install pyqtgraphin the command prompt to install pyqtgraph

首先pip install pyqtgraph在命令提示符下输入安装pyqtgraph

then

然后

   import pyqtgraph as pg 

    pg.setConfigOption('background', 'w')      # sets background to white                                                 
    pg.setConfigOption('foreground', 'k')      # sets axis color to black

    pw = pg.plot(x, y, pen='g')                # 1st plot (green)                                           
    pw.plot(x2, y2, pen='b')                   # 2nd plot in same figure (blue)

    pw.setLabel('bottom', 'x-label')           # x-label
    pw.setLabel('left', 'y-label')             # y-label

more info here: http://www.pyqtgraph.org/documentation/how_to_use.html

更多信息在这里:http: //www.pyqtgraph.org/documentation/how_to_use.html

回答by drgrujic

This is code from user1006989 (best answer) adapted to PyQt5, hopefully it will be useful to someone:

这是来自 user1006989(最佳答案)的代码,适用于PyQt5,希望它对某人有用:

Here is a basic example that will plot three different samples using a QThread:

这是一个使用 QThread 绘制三个不同样本的基本示例:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import random

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure

from PyQt5 import QtCore #conda install pyqt
from PyQt5 import QtWidgets

class MatplotlibWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MatplotlibWidget, self).__init__(parent)

        self.figure = Figure()
        self.canvas = FigureCanvasQTAgg(self.figure)

        self.axis = self.figure.add_subplot(111)

        self.layoutVertical = QtWidgets.QVBoxLayout(self)#QVBoxLayout
        self.layoutVertical.addWidget(self.canvas)

class ThreadSample(QtCore.QThread):
    newSample = QtCore.pyqtSignal(list)

    def __init__(self, parent=None):
        super(ThreadSample, self).__init__(parent)

    def run(self):
        randomSample = random.sample(range(0, 10), 10)

        self.newSample.emit(randomSample)

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.pushButtonPlot = QtWidgets.QPushButton(self)
        self.pushButtonPlot.setText("Plot")
        self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked)

        self.matplotlibWidget = MatplotlibWidget(self)

        self.layoutVertical = QtWidgets.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.pushButtonPlot)
        self.layoutVertical.addWidget(self.matplotlibWidget)

        self.threadSample = ThreadSample(self)
        self.threadSample.newSample.connect(self.on_threadSample_newSample)
        self.threadSample.finished.connect(self.on_threadSample_finished)

    @QtCore.pyqtSlot()
    def on_pushButtonPlot_clicked(self):
        self.samples = 0
        self.matplotlibWidget.axis.clear()
        self.threadSample.start()

    @QtCore.pyqtSlot(list)
    def on_threadSample_newSample(self, sample):
        self.matplotlibWidget.axis.plot(sample)
        self.matplotlibWidget.canvas.draw()

    @QtCore.pyqtSlot()
    def on_threadSample_finished(self):
        self.samples += 1
        if self.samples <= 2:
            self.threadSample.start()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.resize(666, 333)
    main.show()

    sys.exit(app.exec_())