环境:windows pyqt5 ,用QCartView画折线图
环境需要提前安装 pip install PyQtChart
折线图随着时间推移会不断移动,主动更新x轴坐标
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
from PyQt5.QtChart import QChart, QChartView ,QDateTimeAxis ,QValueAxis ,QSplineSeries
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import QDateTime ,QTimer
import numpy as np
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QChart Demo示例绘图")
self.initUI()
self.resize(600, 500)
def initUI(self):
layout = QVBoxLayout()
self.setLayout(layout)
self.series1 = QSplineSeries()
self.series1.setName("series1")
self.series2 = QSplineSeries()
self.series2.setName("series2")
self.chart = QChart()
self.chart.setTitle("测试图")
self.chart.setTheme(QChart.ChartTheme.ChartThemeDark)
self.chart_view = QChartView()
self.chart_view.setChart(self.chart)
self.chart_view.setRenderHint(QPainter.Antialiasing)
layout.addWidget(self.chart_view)
self.chart.addSeries(self.series1)
self.chart.addSeries(self.series2)
self.axisXTime = QDateTimeAxis()
self.axisXTime.setFormat("hh:mm:ss")
self.axisXTime.setTickCount(10)
self.axisXTime.setTitleText("time")
self.axisXTime.setRange(QDateTime.currentDateTime(), QDateTime.currentDateTime().addSecs(30*2))
self.axisY = QValueAxis()
self.axisY.setTickCount(5)
# axisY.setLabelFormat("%.2f")
self.axisY.setTitleText("value")
self.axisY.setRange(0, 100)
self.chart.setAxisX(self.axisXTime, self.series1)
self.chart.setAxisY(self.axisY, self.series1)
self.chart.setAxisX(self.axisXTime, self.series2)
self.chart.setAxisY(self.axisY, self.series2)
# 创建定时器
self.timer = QTimer()
self.timer.timeout.connect(self.update_view)
# 设置定时器间隔为1000毫秒(1秒)
self.timer.start(1000)
def update_view(self):
now_time = QDateTime.currentDateTime()
now_time_np = np.int64(now_time.toMSecsSinceEpoch())
self.series1.append(now_time_np , np.random.rand()*100)
self.series2.append(now_time_np , np.random.rand()*100)
if now_time_np > self.axisXTime.max().toMSecsSinceEpoch():
self.axisXTime.setRange(now_time.addSecs(-30), now_time.addSecs(30))
y_data = np.random.rand()
if y_data > self.axisY.max() or self.axisY.min() > y_data :
self.axisY.setMax(max(y_data + 10, self.axisY.max()));
self.axisY.setMin(min(y_data - 10, self.axisY.min()));
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())