使用外部数据使用 pyqtgraph 进行绘图

2024-01-03

我正在尝试实时绘制不同传感器的数据,因此我决定使用 PyQt 中的 PyQtGraph 绘制数据,以便使其能够处理来自不同来源的多个传感器的数据。 在互联网上搜索示例,我找到了一个并尝试对其进行修改, 因为 QtGui.QApplication.instance().exec_() 带来了阻止其后其余代码执行的不方便的副作用。我尝试使用多处理来管理使用的线程。我可以使其余的代码工作,但是我如何使用外部数据(Plo2D.update2)更新绘图,我尝试使用 multiprocessing.Queue ,但我没有工作,而是出现窗口的按摩必须关闭。

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
from numpy import arange
import pyqtgraph as pg
import sys
import multiprocessing

class Plot2D():
    def __init__(self,):
        self.traces = dict()
        self.app = QtGui.QApplication([])
        self.win = pg.GraphicsWindow(title="Dibujar")
        self.win.resize(1000, 600)
        self.win.setWindowTitle('Ejemplo')
        pg.setConfigOptions(antialias=True)
        #self.canvas = self.win.addPlot(title="Pytelemetry")
        self.waveform1 = self.win.addPlot(title='WAVEFORM1', row=1, col=1)
        self.waveform2 = self.win.addPlot(title='WAVEFORM2', row=2, col=1)

    def start(self):
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()

    def set_plotdata(self, name, datax, datay):
        if name in self.traces:
            self.traces[name].setData(datax, datay)
        else:
            if name == '910D':
                self.traces[name] = self.waveform1.plot(pen='c', width=3)
            if name == 'MPU':
                self.traces[name] = self.waveform2.plot(pen='c', width=3)

    def update2(self):
        # Trying to get external data
        ptm1 = globals()['DatExt1']
        ptm2 = globals()['DatExt2']
        while ptm1.empty() is False:
            self.data1 = ptm1.get()
            self.set_plotdata('MPU', self.data1[0], self.data1[1])
            # csvWriterG910D.writerows(Informa)
            # file1.flush()
        while ptm2.empty() is False:
            self.data2 = ptm2.get()
            self.set_plotdata('910D', self.data1[0], self.data1[1])

    def animation(self):
        timer = QtCore.QTimer()
        timer.timeout.connect(self.update2)
        timer.start(60)
        self.start()

# It is thread started from main.py
def ShowData(Data1, Data2): # Data1,Data2 : multiprocessing.Queue
    DatExt1 = Data1
    DatExt2 = Data2
    p = Plot2D()
    p.animation()

主要.py:

    if __name__ == '__main__':

    Data1 = multiprocessing.Queue()
    Data2 = multiprocessing.Queue()

    Plottingdata = Process(target=PlotData.ShowData, args=(Data1, Data2, ))
    Plottingdata.start()

    t = np.arange(-3.0, 2.0, 0.01)
    i = 0.0
    while True:
        s = np.sin(2 * 2 * 3.1416 * t) / (2 * 3.1416 * t + i)
        time.sleep(1)
        Data1.put([t, s])
        i = i + 0.1

预先感谢您的帮助


您应该使用多线程,而不是使用多处理,即创建负责收集数据的线程(在您的示例中模拟数据),然后通过信号将数据发送到 GUI。

绘图数据.py

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import sys

class Plot2D(pg.GraphicsWindow):
    def __init__(self):
        pg.GraphicsWindow.__init__(self, title="Dibujar")
        self.traces = dict()
        self.resize(1000, 600)
        pg.setConfigOptions(antialias=True)
        #self.canvas = self.win.addPlot(title="Pytelemetry")
        self.waveform1 = self.addPlot(title='WAVEFORM1', row=1, col=1)
        self.waveform2 = self.addPlot(title='WAVEFORM2', row=2, col=1)

    def set_plotdata(self, name, x, y):
        if name in self.traces:
            self.traces[name].setData(x, y)
        else:
            if name == "910D":
                self.traces[name] = self.waveform1.plot(x, y, pen='y', width=3)
            elif name == "MPU":
                self.traces[name] = self.waveform2.plot(x, y, pen='y', width=3)

    @QtCore.pyqtSlot(str, tuple)
    def updateData(self, name, ptm):
        x, y = ptm
        self.set_plotdata(name, x, y)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    plot = Plot2D()
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

main.py

import sys

from pyqtgraph.Qt import QtCore, QtGui
import threading
import numpy as np
import time

from PlotData import Plot2D

class Helper(QtCore.QObject):
    changedSignal = QtCore.pyqtSignal(str, tuple)

def create_data1(helper, name):
    t = np.arange(-3.0, 2.0, 0.01)
    i = 0.0
    while True:
        s = np.sin(2 * 2 * 3.1416 * t) / (2 * 3.1416 * t + i)
        time.sleep(.1)
        helper.changedSignal.emit(name, (t, s))
        i = i + 0.1

def create_data2(helper, name):
    t = np.arange(-3.0, 2.0, 0.01)
    i = 0.0
    while True:
        s = np.cos(2 * 2 * 3.1416 * t) / (2 * 3.1416 * t - i)
        time.sleep(.1)
        helper.changedSignal.emit(name, (t, s))
        i = i + 0.1

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    helper = Helper()
    plot = Plot2D()
    helper.changedSignal.connect(plot.updateData, QtCore.Qt.QueuedConnection)
    threading.Thread(target=create_data1, args=(helper, "910D"), daemon=True).start()
    threading.Thread(target=create_data2, args=(helper, "MPU"), daemon=True).start()
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用外部数据使用 pyqtgraph 进行绘图 的相关文章

  • Python:由于 OSError 无法安装软件包:[Errno 2] 没有这样的文件或目录

    我尝试使用pip安装sklearn 并且我收到以下错误消息 错误 由于 OSError 无法安装软件包 Errno 2 没有这样的文件或目录 C Users 13434 AppData Local Packages PythonSoftwa
  • 使用 Poetry 创建的 Python 项目:如何在 Visual Studio Code 中调试它?

    我有一个根据基本 Poetry 创建的 Python 项目指示 https python poetry org docs basic usage 项目文件夹是这样的 my project my project my project py F
  • FastAPI UploadFile 与 Flask 相比慢

    我创建了一个端点 如下所示 app post report upload def create upload files files UploadFile File try with open files filename wb as wf
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • matplotlib - 将文本包装在图例中

    我目前正在尝试绘制一些pandas数据通过matplotlib seaborn 然而我的一个专栏标题特别长 拉长了情节 考虑以下示例 import random import pandas as pd import matplotlib p
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • pandas DataFrame 中行的高效成对比较

    我目前正在处理一个较小的数据集 大约 900 万行 不幸的是 大多数条目都是字符串 即使强制类别 框架在内存中也只有几 GB 我想做的是将每一行与其他行进行比较 并对内容进行直接比较 例如 给定 A B C D 0 cat blue old
  • Python:处理图像并保存到文件流

    我需要使用 python 处理图像 应用过滤器和其他转换 然后使用 HTTP 将其提供给用户 现在 我正在使用 BaseHTTPServer 和 PIL 问题是 PIL 无法直接写入文件流 因此我必须写入临时文件 然后读取该文件 以便将其发
  • python os.fork 使用相同的 python 解释器吗?

    据我所知 Python 中的线程使用相同的 Python 解释器实例 我的问题是与创建的流程相同os fork 或者每个进程创建的os fork有自己的翻译吗 每当你 fork 时 整个 Python 进程都会在内存中复制 包括Python
  • 在 Python 中引发异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这是简单的代码 import sys class EmptyArgs StandardError pass if name main The first way to raise an exception if
  • Parallel.ForEach - 优雅取消

    关于等待任务完成和线程同步的主题 我目前有一个迭代 我已将其包含在 Parallel ForEach 中 在下面的示例中 我在评论中提出了一些关于如何最好地处理循环的优雅终止的问题 NET 4 0 private void myFuncti
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 根据标签位置计算 Pandas DataFrame 的索引

    我正在尝试计算标签的索引Pandas https pandas pydata org DataFrame在每一列中 基本上我有以下内容DataFrame d col1 label1 label2 label3 col2 label2 lab
  • 将整数转换为特定格式的十六进制字符串

    我是 python 新手 有以下问题 我需要将整数转换为 6 个字节的十六进制字符串 例如 281473900746245 gt xFF xFF xBF xDE x16 x05 十六进制字符串的格式很重要 int 值的长度是可变的 格式 0
  • 如何将另一整列作为参数传递给 pandas fillna()

    我想用另一列中的值填充一列中的缺失值 使用fillna方法 我读到循环遍历每一行将是非常糟糕的做法 最好一次完成所有事情 但我不知道如何使用fillna 之前的数据 Day Cat1 Cat2 1 cat mouse 2 dog eleph
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • 从 HDF5 文件中删除信息

    我意识到 SO 用户以前曾问过这个问题question https stackoverflow com questions 1124994 removing data from a hdf5 file rq 1但它是在 2009 年被问到的

随机推荐

  • 在 Windows Phone 8 中获取 UI 调度程序

    我一直在开发一个使用 Windows 运行时组件 WRC 的 Windows Phone 应用程序 由非 UI 线程访问的函数需要使用访问 Windows Phone 应用程序的回调 void WControlPointCallback O
  • Woocommerce:获取当前产品类别

    如何获取用户当前正在浏览的产品类别 我正在尝试使用get the terms post gt ID product cat 但这给了我页面上列出的每个产品的类别 我想得到当前类别用户正在浏览当前产品列表页面 这是一个内衬 wp query
  • 在 Azure 应用程序网关卸载时如何需要 SSL?

    我正在将 ASP Net 网站迁移到 Azure 托管 我正在使用具有 SSL 卸载功能的应用程序网关 因此我的个人负载平衡 Web 服务器没有安装 SSL 证书 由于 SSL 是在应用程序网关上处理的 我如何向客户端请求 SSL 并将其从
  • Docker 数据库容器正在运行。另一个带有 pid 的进程正在使用 unix 套接字文件

    我正在尝试根据此消息中提供的说明运行带有初始化数据库的 docker mysql 容器https stackoverflow com a 29150538 6086816 https stackoverflow com a 29150538
  • 追加到 Bash 中的同一行

    文件 letter csv 包含 b a c 文件numbers csv包含 32 34 25 13 我想将numbers csv 附加到letters csv 如下所示 b a c 32 34 25 13 我已经尝试过这个 sed e a
  • 暂停角度动画

    Angular 2 中可以暂停动画吗 我想在鼠标悬停在元素上时暂停动画 并在鼠标移出时从停止的位置恢复动画 我创建了一个简单的脚本来演示 https stackblitz com edit scrolling text https stac
  • PIWIK GeoIP (PECL) 给出未知位置

    我已经在我的系统上成功安装了 piwik 但 geoIP 定位不起作用 我已遵循 piwik 的指南FAQ http piwik org faq how to faq 164 通过 PECL 扩展配置 Geo IP 地理定位 但总是显示 根
  • 一个变量的多个比较运算符?

    我需要对一个变量进行多次检查 我在这里看到了一个 等于 的例子 w3学校 http www w3schools com php php operators asp 但它们是两个不同的变量 现在我有 if color blue do some
  • strcmp() 的不明确行为

    请注意 我已经检查了与该标题相关的问题 但从我的角度来看 它们与该问题无关 最初我认为program1和program2会给我相同的结果 Program 1 char a abcd char b efgh printf d strcmp a
  • 从后面的代码调用jquery

    您好 我有一个 jquery 函数 单击按钮时执行该函数 我还需要根据项目是否附加注释从后面的代码执行此函数 这是jquery Comments Slide commentsnr live click function up to pare
  • 有效地在列表中查找唯一的向量元素

    我有一个数值向量列表 我需要创建一个仅包含每个向量的一个副本的列表 没有相同函数的列表方法 因此我编写了一个函数来应用来检查每个向量 F1 lt function x to remove lt c for i in 1 length x f
  • 句柄到窗口句柄

    我尝试过使用 获取桌面枚举的所有进程 ID 方法 但这不起作用 有没有办法将句柄转换为窗口句柄 或者 有没有办法获取进程 ID 并找出该进程生成的所有子窗口 我不想使用FindWindow由于多个流程问题 你可以打电话枚举Windows h
  • Grep 匹配之前和之后的字符?

    使用这个 grep A1 B1 test pattern file 将在文件中匹配的模式之前和之后生成一行 有没有办法不显示行而是显示指定数量的字符 我的文件中的行非常大 因此我对打印整行不感兴趣 而只是观察上下文中的匹配 关于如何执行此操
  • 如何获取运行 Node.js 的服务器名称?

    我想添加一行 该行将指向不同的数据库 具体取决于我运行 node js 的服务器 localhost 与 test com 等 如何获取node js中的服务器名称 即服务器端相当于location host的是什么 var os requ
  • 为什么Thread.sleep(0)可以阻止rocketmq中的gc?

    最近我阅读了RocketMQ的源代码 但我无法理解这段代码 为什么这段代码可以阻止gc呢 https github com apache rocketmq blob master store src main java org apache
  • 是什么导致 .Attach() 在 EF4 中运行缓慢?

    我们的代码中有一个通用的更新方法 它执行以下操作 foreach var entity in entityList Context GetIDbSet
  • 未应用 Azure AD 可配置令牌生命周期

    我想更改 Azure AD 中的默认令牌生命周期如图所示 https learn microsoft com en us azure active directory active directory configurable token
  • 谷歌电子表格脚本,为一个单元格提供多个超链接选择

    我有一个谷歌电子表格 在某些单元格中 它有多个名称 字符串 我想将它们与各个超链接关联起来 例如 如果我有一个像 Charles Darwin 这样的单元格 我可以很容易地通过执行以下操作来创建该名称的超链接 Hyperlink VLOOK
  • 宏扩展和字符串化:如何使用另一个宏将宏名称(而不是其值)字符串化?

    不感兴趣 define ACD 5 5 5 30 define DEFAULT NETWORK TOKEN KEY CLASS ACD define DEFAULT NETWORK TOKEN KEY DEFAULT NETWORK TOK
  • 使用外部数据使用 pyqtgraph 进行绘图

    我正在尝试实时绘制不同传感器的数据 因此我决定使用 PyQt 中的 PyQtGraph 绘制数据 以便使其能够处理来自不同来源的多个传感器的数据 在互联网上搜索示例 我找到了一个并尝试对其进行修改 因为 QtGui QApplication