使用pyqt5 chart 绘制动态折线图

在折线图的基础上增加线程动态的获取新的数据来更新折线图上点的坐标,从而实现动态的展示效果。

# coding:utf-8
import time
import sys
import random
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtChart import *
import random

new_data = []
mutex = QMutex()


class DataThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        while True:
            data = random.randint(0, 10)
            mutex.lock()
            new_data.append(data)
            mutex.unlock()
            time.sleep(0.2)
            
class Main_window(QWidget):
    def __init__(self):
        super(Main_window, self).__init__()
        # 开启获取新数据的子线程
        self.threadCtl = DataThread()
        self.threadCtl.start()
		# 定时更新折线图
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(200)
        
        self.init_line()
        self.add_axis()
        
        
    def init_line(self):
        # 实例折线对象
        self.series_1 = QLineSeries()  #定义LineSerise,将类QLineSeries实例化
        # 折线初始数据了列表
        self._1_point_list = []  
        for i in range(10):
            y = random.randint(0,10)
            self._1_point_list.append(QPointF(i,y))
        
        self.series_1.append(self._1_point_list)  #折线添加坐标点清单
        self.series_1.setName("折线名称")
        
    def add_axis(self):
        # 设置x轴
        self.x_Aix = QValueAxis()
        self.x_Aix.setRange(0.00, 10.00)
        self.x_Aix.setLabelFormat("%0.2f")
        self.x_Aix.setTickCount(11) # 将0-10分成11份
        self.x_Aix.setMinorTickCount(4) # 设置每一份的分割数
        
        # 设置y轴
        self.y_Aix = QValueAxis()
        self.y_Aix.setTitleText("轴代表的意义名称")
        self.y_Aix.setRange(0.00, 10.00)
        self.y_Aix.setLabelFormat("%0.2f")
        self.y_Aix.setTickCount(11)
        self.y_Aix.setMinorTickCount(4)
        
        self.charView = QChartView(self)  #定义charView,父窗体类型为 Window

        self.charView.setGeometry(140, 20,
                                  self.width(),
                                  self.height())  #设置charView位置、大小
        
        self.charView.chart().addSeries(self.series_1)  #添加折线实例
        
        # 添加轴,Qt.AlignBottom表示底部,Qt.AlignLeft表示左边,Qt.AlignRight表示右边
        self.charView.chart().addAxis(self.x_Aix, Qt.AlignBottom)
        self.charView.chart().addAxis(self.y_Aix, Qt.AlignLeft)
        
        # 将折线与对应的y轴关联,这里只写了一个y轴,如果有多条折线可以关联不同的y轴
        self.series_1.attachAxis(self.y_Aix)
        
        # 隐藏或者显示折线 setVisible
        # self.series_1.setVisible(False)  # 隐藏折线
        
    def update(self):
        # 更新折线上的点的坐标
        if len(new_data) > 0:
            mutex.lock()
            self.value = new_data[0]
            new_data.pop(0)
            mutex.unlock()
            del self._1_point_list[len(self._1_point_list) - 1]
            self._1_point_list.insert(0, QPointF(0, self.value))
            for i in range(0, len(self._1_point_list)):
                self._1_point_list[i].setX(i)
            self.series_1.replace(self._1_point_list)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    pw = Main_window()
    pw.show()
    sys.exit(app.exec_())

效果如下:
在这里插入图片描述

  • 2
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt控件中显示折线图,需要借助一些Python库来完成,如Matplotlib和PyQt5。 首先,安装这两个库。可以在终端中使用以下命令进行安装: ``` pip install matplotlib pip install PyQt5 ``` 接下来,编写Python代码来绘制折线图并将其显示在Qt控件中。以下是一个简单的例子: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("折线图") self.setGeometry(100, 100, 800, 600) # 创建一个QWidget控件 self.widget = QWidget(self) self.setCentralWidget(self.widget) # 创建折线图并添加到QWidget中 self.layout = QVBoxLayout(self.widget) self.canvas = PlotCanvas(self.widget, width=5, height=4) self.layout.addWidget(self.canvas) # 绘制折线图 self.canvas.plot([1, 2, 3, 4], [0, 1, 0, 1]) class PlotCanvas(FigureCanvas): def __init__(self, parent=None, width=5, height=4, dpi=100): # 创建一个Figure对象 fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) # 调用FigureCanvas的构造函数 FigureCanvas.__init__(self, fig) self.setParent(parent) # 绘制折线图 self.plot([1, 2, 3, 4], [0, 1, 0, 1]) def plot(self, x, y): # 绘制折线图 self.axes.plot(x, y) # 创建Qt应用程序并启动 app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在这个例子中,我们定义了一个MainWindow类来作为应用程序的主窗口。在MainWindow的构造函数中,我们创建了一个QWidget控件,并将折线图添加到其中。折线图的创建和绘制是通过PlotCanvas类实现的。PlotCanvas继承自FigureCanvas和QWidget类,它包含了一个Figure对象和一个Axes对象,用来绘制折线图。 要创建折线图,我们需要调用PlotCanvas的plot函数,并传递x和y轴的数据。在这个例子中,我们绘制了一个简单的折线图,它的x轴数据是[1, 2, 3, 4],y轴数据是[0, 1, 0, 1]。 最后,我们创建了一个Qt应用程序,并启动它。在应用程序中,我们显示了主窗口,并进入Qt的事件循环中,等待用户操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值