PyQt6+pyqtgraph折線圖繪制顯示功能
1、實(shí)現(xiàn)效果

2、環(huán)境:
確認(rèn)已經(jīng)安裝pyqtgraph的模塊,如果沒有安裝,使用命令安裝:
pip install pyqtgraph
3、代碼實(shí)現(xiàn):
繪制折線函數(shù):
import sys
import random
from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem
from PySide6.QtCore import Qt, QPointF, QRectF, QTimer
from PySide6.QtGui import QPainter, QPen, QColor, QFont
class ScrollableLineGraph(QGraphicsItem):
def __init__(self, data):
"""
初始化線圖項(xiàng),設(shè)置初始顯示范圍和數(shù)據(jù)
:param data: 要顯示的數(shù)據(jù)列表
"""
super().__init__()
self.data = data
self.current_start = 0 # 當(dāng)前顯示的起始索引
self.bounding_rect = QRectF(0, 0, 900, 200) # 線圖的邊界矩形
def boundingRect(self):
"""
返回線圖的邊界矩形,用于確定繪制區(qū)域
:return: 矩形邊界
"""
return self.bounding_rect
def paint(self, painter, option, widget):
"""
繪制線圖,包括坐標(biāo)軸、刻度和數(shù)據(jù)線
:param painter: 繪制工具
:param option: 繪制選項(xiàng)
:param widget: 關(guān)聯(lián)的窗口部件
"""
painter.setRenderHint(QPainter.Antialiasing) # 開啟抗鋸齒
axis_pen = QPen(QColor(255, 255, 255)) # 坐標(biāo)軸線顏色
line_pen = QPen(QColor(255, 0, 0)) # 數(shù)據(jù)線顏色
text_font = QFont() # 字體設(shè)置
# 繪制x軸
painter.setPen(axis_pen)
painter.drawLine(0, 200, 900, 200)
# 繪制x軸刻度和標(biāo)簽
for i in range(0, 20, 1):
x = (i - self.current_start) * 45
if 0 <= x < 900:
painter.drawLine(x, 200, x, 210)
painter.drawText(x - 5, 220, str(i + self.current_start))
# 繪制y軸
painter.drawLine(0, 0, 0, 200)
# 繪制y軸刻度和標(biāo)簽
for i in range(0, 5):
y = 200 - 45 * i
painter.drawLine(-5, y, 0, y)
painter.drawText(-20, y - 5, str(i * 20)) #10:表示Y坐標(biāo)值間隔大小
# 繪制y軸刻度和標(biāo)簽,給每個標(biāo)簽添加上橫向網(wǎng)格,網(wǎng)格為點(diǎn)狀虛線
for i in range(0, 5):
y = 200 - 45 * i
# 網(wǎng)格為點(diǎn)狀虛線
painter.setPen(QPen(QColor(128, 128, 128), 0.5, Qt.DashLine))
# painter.drawLine(-5, y, 0, y)
# painter.drawText(-20, y - 5, str(i * 10))
painter.drawLine(0, y, 900, y)
# 假設(shè)已經(jīng)初始化了painter對象等必要的準(zhǔn)備工作
# 定義一些常量,提高代碼的可讀性
CANVAS_HEIGHT = 200
SCALE_FACTOR = 45
LABEL_OFFSET = -20
GRID_LINE_WIDTH = 0.5
GRID_LINE_COLOR = QColor(128, 128, 128)
GRID_LINE_STYLE = Qt.DashLine
MAX_LABELS = 10
# 新增:封裝繪制網(wǎng)格線和刻度標(biāo)簽的函數(shù)
def draw_scale_and_grid(painter, y_position, label):
"""
繪制y軸刻度和標(biāo)簽以及對應(yīng)的橫向網(wǎng)格線
:param painter: QPainter對象,用于繪制
:param y_position: y軸位置
:param label: 刻度標(biāo)簽的文本
"""
try:
# 繪制網(wǎng)格線
painter.setPen(QPen(GRID_LINE_COLOR, GRID_LINE_WIDTH, GRID_LINE_STYLE))
painter.drawLine(-5, y_position, 0, y_position)
# 繪制刻度標(biāo)簽
painter.drawText(-LABEL_OFFSET, y_position - 5, label)
# 繪制右側(cè)網(wǎng)格線
painter.drawLine(0, y_position, 900, y_position)
except Exception as e:
print(f"Error during drawing scale and grid: {e}")
# 主繪制邏輯
try:
for i in range(MAX_LABELS + 1): # 由于范圍是從0到10,因此循環(huán)次數(shù)應(yīng)為MAX_LABELS + 1
y = CANVAS_HEIGHT - SCALE_FACTOR * i
# 檢查y位置是否在畫布內(nèi),若不在則跳過
if y < 0:
break
label = str(i * 10)
# draw_scale_and_grid(painter, y, label)
except Exception as e:
print(f"Unexpected error occurred: {e}")
# 假設(shè)在這段代碼的末尾,有適當(dāng)?shù)馁Y源釋放邏輯,例如painter對象的銷毀等
# 設(shè)置字體
painter.setFont(text_font)
# 繪制x軸和y軸標(biāo)簽
painter.drawText(900, 205, "Time")
painter.rotate(-90)
painter.drawText(-30,10, "Value")
painter.rotate(90)
# 繪制數(shù)據(jù)線
painter.setPen(line_pen)
painter.setRenderHint(QPainter.SmoothPixmapTransform)
last_point = QPointF(0, 200 - self.data[self.current_start])
for i in range(self.current_start, min(self.current_start + 50, len(self.data))):
x = (i - self.current_start) * 45
y = 200 - self.data[i]
painter.drawLine(last_point, QPointF(x, y))
last_point = QPointF(x, y)在QT Designer的Widget頁面添加Graphics View,命名為graphicsView
在頁面類中定義圖表初始化和數(shù)據(jù)更新方法:
def GraphWidget_uiInit(self):
data = []
scene = QGraphicsScene(self.graphicsView)
self.graphicsView.setScene(scene)
self.data_graph = ScrollableLineGraph(data)
scene.addItem(self.data_graph)
scene.setBackgroundBrush
self.graphicsView.setRenderHint(QPainter.Antialiasing)
self.graphicsView.setFixedSize(960, 240)
self.graphicsView.setSceneRect(0, 0, 900, 220)
self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
# # 設(shè)置定時器,用于動態(tài)更新數(shù)據(jù)
# self.timer = QTimer(self)
# self.timer.timeout.connect(self.update_data)
# self.timer.start(60) # 每500毫秒觸發(fā)一次
def update_data(self):
#隨機(jī)數(shù)據(jù)
# new_data = random.randint(0, 100)
# self.data_graph.data.append(new_data)
#將字符串?dāng)?shù)據(jù)轉(zhuǎn)換成int類型的列表數(shù)據(jù)
dataStr8 = "100 30 178 100 69 60 98 98 79 50 30 20 29 58 69 39 98 29 32"
list_from_string8 = dataStr8.split()
number_list8 = list(map(int, list_from_string8))
self.data_graph.data = number_list8
self.data_graph.current_start = max(0, len(self.data_graph.data) - 50)
self.data_graph.update()參考資料:
https://blog.csdn.net/hyd_csdn/article/details/140644014
到此這篇關(guān)于PyQt6+pyqtgraph折線圖繪制顯示的文章就介紹到這了,更多相關(guān)PyQt6 pyqtgraph折線圖繪制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mac OS X10.9安裝的Python2.7升級Python3.3步驟詳解
Mac OS X10.9默認(rèn)帶了Python2.7,不過現(xiàn)在Python3.3.3出來了,如果想使用最新版本,趕緊升級下吧?;静襟E如下2013-12-12
python中g(shù)etsizeof和asizeof的區(qū)別小結(jié)
本文詳細(xì)的介紹了getsizeof和asizeof的區(qū)別,這兩個函數(shù)都用于獲取對象的內(nèi)存占用大小,它們來自不同的庫,下面就來詳細(xì)的介紹一下兩者的區(qū)別,感興趣的可以了解一下2025-09-09
Python合并多個Excel文件的方法實(shí)現(xiàn)與對比
在日常工作中,處理多個 Excel 文件并將它們合并為一個文件,本文將介紹兩種使用 Python 合并 Excel 文件的方法,文中的示例代碼講解詳細(xì), 感興趣的小伙伴可以了解下2026-01-01
pyqt5實(shí)現(xiàn)按鈕添加背景圖片以及背景圖片的切換方法
今天小編就為大家分享一篇pyqt5實(shí)現(xiàn)按鈕添加背景圖片以及背景圖片的切換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Django 路由層URLconf的實(shí)現(xiàn)
這篇文章主要介紹了Django 路由層URLconf的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
python如果快速判斷數(shù)字奇數(shù)偶數(shù)
這篇文章主要介紹了python如果快速判斷數(shù)字奇數(shù)偶數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11

