【Python_PyQtGraph 学习笔记(五)】基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息

基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息

前言

基于PySide2、PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,并保留全部绘图信息:绘制好的图像既可以显示全部信息,也可以显示最新的50个点信息;因为数据量的增加,折线会因为窗口大小的固定缩成一团,如果有窗口模式这一功能,可以清楚的看到最新绘制的点,保证线与线、点与点之间的距离处于一个合理的范围。

正文

实现该需求的重点是:设置PlotItem图形对象显示的X轴区域范围

1、实现动态绘制数据曲线

如何通过定时器进行绘图可以参考【Python_PyQtGraph 学习笔记】基于PySide2和GraphicsLayoutWidget实现动态绘制数据曲线

2、创建一个QCheckBox()对象,可以选择是否显示窗口模式

        self.ui.ckbWindowMode = QCheckBox()  # 初始化 窗口模式选择框
        self.ui.ckbWindowMode.setText("窗口模式")  # 窗口模式选择框 设置文本

3、窗口模式功能的实现

直接看完整代码:

    def __f_update_plot_data(self):
        """
        function:  更新plot数据函数
              in:  None
             out:  None
          return:  None
          others:  Update Plot Data Function
        """
        now_time = datetime.datetime.now()  # 获取当前时间
        new_time = now_time.strftime('%H:%M:%S')  # 设置时间输出格式

        self.__m_temCurveLst[self.__m_curvePtr] = np.random.rand()  # 数组元素 N维的均匀分布的随机数
        self.__m_humCurveLst[self.__m_curvePtr] = np.random.randn()  # 产生n维的正态分布的随机数
        self.__m_curvePtr += 1  # 曲线指针+1

        if self.__m_curvePtr >= len(self.__m_temCurveLst):  # 如果指针大小 > 温度数据点列表
            tmp = self.__m_temCurveLst
            self.__m_temCurveLst = [0 for i in range(len(self.__m_temCurveLst) + 10)]
            self.__m_temCurveLst[:len(tmp)] = tmp

            hmp = self.__m_humCurveLst
            self.__m_humCurveLst = [0 for i in range(len(self.__m_humCurveLst) + 10)]
            self.__m_humCurveLst[:len(hmp)] = hmp

        # 
        if self.ui.ckbWindowMode.checkState():  # 判断是都是窗口模式
            self.ui.temCurve.setData(self.__m_temCurveLst[:self.__m_curvePtr])
            self.ui.humCurve.setData(self.__m_humCurveLst[:self.__m_curvePtr])
            if self.__m_curvePtr > 50:  # 判断曲线指针是否大于50
                self.ui.Curve.setXRange(self.__m_curvePtr - 50, self.__m_curvePtr)  # 当大于50时,只显示最后50个点
        else:
            self.ui.temCurve.setData(self.__m_temCurveLst[:self.__m_curvePtr])
            self.ui.humCurve.setData(self.__m_humCurveLst[:self.__m_curvePtr])
            self.ui.Curve.setXRange(0, self.__m_curvePtr)
        # 

其中,重点是以下代码段:

		# 
        if self.ui.ckbWindowMode.checkState():  # 判断是都是窗口模式
            self.ui.temCurve.setData(self.__m_temCurveLst[:self.__m_curvePtr])
            self.ui.humCurve.setData(self.__m_humCurveLst[:self.__m_curvePtr])
            if self.__m_curvePtr > 50:  # 判断曲线指针是否大于50
                self.ui.Curve.setXRange(self.__m_curvePtr - 50, self.__m_curvePtr)  # 当大于50时,只显示最后50个点
        else:
            self.ui.temCurve.setData(self.__m_temCurveLst[:self.__m_curvePtr])
            self.ui.humCurve.setData(self.__m_humCurveLst[:self.__m_curvePtr])
            self.ui.Curve.setXRange(0, self.__m_curvePtr)
        # 

self.ui.ckbWindowMode: 创建的QCheckBox()对象
self.__m_curvePtr: 创建的曲线指针,记录了当前绘制的点数量
self.ui.Curve: 创建的PlotItem图形对象
self.ui.temCurve: PlotItem图形对象添加PlotDataItem曲线对象
self.ui.humCurve: PlotItem图形对象添加PlotDataItem曲线对象
setXRange(): 设置PlotItem图形对象显示的X轴区域

4、实现的效果图:

你可能感兴趣的:(Python学习笔记,#,PyQtGraph学习笔记,python,pyqt,ui)