当前位置: 首页 > news >正文

《PyQtGraph:Python绘图领域的“超级引擎”》

一、PyQtGraph 初相识

在 Python 的广阔数据可视化天地中,PyQtGraph 宛如一颗璀璨的明星,占据着极为重要的地位。随着数据量的爆炸式增长以及对可视化交互性需求的日益提升,传统绘图库在某些场景下逐渐显得力不从心,而 PyQtGraph 凭借其独特优势脱颖而出。

PyQtGraph 的核心作用主要体现在以下几个关键方面:它构建于强大的 PyQt 和 PySide 框架之上,结合了 NumPy 高效的数据处理能力,为开发者提供了高性能的绘图功能。无论是处理科研领域中动辄成千上万的数据点,还是在工业监控场景下需要实时更新的数据,PyQtGraph 都能轻松应对,确保绘图的流畅性和高效性,这是许多其他绘图库难以企及的。例如,在金融数据分析中,需要实时绘制股票价格走势、成交量等多组数据的动态图表,PyQtGraph 可以快速处理大量的金融数据,并以直观的图表形式呈现,帮助分析师及时捕捉市场变化趋势 。

交互性是 PyQtGraph 的又一核心亮点。它赋予用户与图形进行深度交互的能力,通过简单的鼠标操作,如缩放、平移、选择和标注等,用户可以从不同角度、不同层次探索数据,挖掘数据背后隐藏的信息。以地理信息系统(GIS)应用为例,用户可以利用 PyQtGraph 的交互功能,在地图上自由缩放,查看不同区域的详细地理数据,还能通过标注功能标记出感兴趣的地点,极大地提高了数据的可探索性和分析效率。

PyQtGraph 还提供了丰富多样的绘图选项,涵盖了曲线图、散点图、图像绘制、三维曲面图等多种类型,几乎可以满足任何可视化需求。在医学图像处理中,它能够展示 MRI、CT 等医学影像数据,支持在任意角度对多维图像进行切片显示,帮助医生更全面、准确地观察患者的身体状况 。

此外,PyQtGraph 支持多平台运行,无论是 Windows、macOS 还是 Linux 系统,都能完美适配,这使得它在不同的开发环境和应用场景中都能发挥重要作用,进一步拓展了其应用范围。

二、为何选择 PyQtGraph

(一)与 Matplotlib 对比

在 Python 绘图领域,Matplotlib 堪称元老级的存在,拥有庞大的用户群体和丰富的文档资源,功能完备且成熟稳定,几乎能满足各种常规绘图需求,其社区生态圈极为庞大,开发者在使用过程中遇到问题能轻松找到大量的解决方案和教程 。例如,在学术论文的图表绘制中,Matplotlib 凭借其强大的定制功能,可以生成符合出版标准的高质量图形,从简单的折线图、柱状图到复杂的多子图组合,都能完美驾驭。

然而,Matplotlib 在某些场景下也暴露出一些性能瓶颈。当处理大数据量时,其绘图速度会明显下降,这在实时绘图场景中表现得尤为明显。在实时监控系统中,需要每秒更新多次数据并绘制图表,如果使用 Matplotlib,可能会出现卡顿现象,无法满足实时性要求。而 PyQtGraph 则在这些方面展现出显著优势。

PyQtGraph 基于 Qt 的 Graphics View Framework 开发,并结合了 NumPy 高效的数据处理能力,在大数据量的绘图性能上远超 Matplotlib。它采用了更高效的内存管理和图形渲染机制,能够快速处理和显示大量数据点。在金融领域,绘制股票价格的实时走势时,可能需要实时更新上千个数据点,PyQtGraph 可以流畅地完成这一任务,保证图表的实时性和交互性,让投资者能够及时了解股票价格的变化。

在动态更新图的性能方面,PyQtGraph 同样表现出色。它可以快速响应数据的变化并更新图表,无需像 Matplotlib 那样进行复杂的重绘操作。在科学实验数据采集与分析中,实验数据不断产生并需要实时绘制,PyQtGraph 能够实时将新数据添加到图表中,并迅速更新显示,帮助科研人员及时观察实验数据的变化趋势 。

虽然 PyQtGraph 在功能丰富度上可能略逊于 Matplotlib,但其常用的绘图功能足以满足大部分科学计算和工程应用的需求,而且在与 Qt 图形界面框架的融合方面,PyQtGraph 具有天然的优势,能够无缝集成到基于 Qt 开发的应用程序中,为用户提供更加一体化的交互体验。

(二)与其他绘图库比较

除了 Matplotlib,Python 生态系统中还有许多优秀的绘图库,如 Seaborn 和 Pyecharts,它们各自有着独特的特点和适用场景,与 PyQtGraph 形成了鲜明的对比。

Seaborn 是基于 Matplotlib 的统计可视化库,它专注于统计图表的绘制,提供了一系列美观且易于使用的接口,使得创建复杂的统计图形变得更加简单。Seaborn 内置了许多统计绘图函数,像箱线图、回归图、热力图等,对于数据科学家和科研人员进行数据分析和探索性数据分析(EDA)非常友好。在进行数据分布分析时,Seaborn 可以轻松绘制出漂亮的直方图和核密度估计图,帮助用户直观地了解数据的分布特征 。

不过,Seaborn 的交互性相对较弱,主要用于静态数据分析,不太适合需要实时交互和动态更新的场景。而 PyQtGraph 则以其强大的交互性和实时绘图能力弥补了这一不足,更适合在需要用户与图表进行频繁交互的场景中使用,如工业监控系统、实时数据分析工具等。

Pyecharts 是一个用于生成 Echarts 图表的 Python 库,Echarts 是百度开源的数据可视化 JS 库,具有非常好的可视化效果。Pyecharts 主要用于 Web 可视化和大屏数据看板的开发,它可以生成交互式的 HTML 图表,支持多种炫酷的图表类型,如地图、柱状图、饼图等,并且能够与 Django、Flask 等后端框架无缝集成 。在制作数据大屏展示时,Pyecharts 可以通过丰富的图表类型和交互效果,将大量的数据以直观、美观的方式呈现出来,吸引观众的注意力。

然而,Pyecharts 主要面向 Web 应用,在桌面应用开发方面,其与 Qt 的集成度远不如 PyQtGraph。PyQtGraph 可以方便地嵌入到基于 Qt 的桌面应用程序中,成为应用程序的一部分,为用户提供本地化的绘图体验,而无需依赖 Web 浏览器。

三、开启 PyQtGraph 之旅

(一)安装指南

在正式开启 PyQtGraph 的数据可视化之旅前,首先需要将其成功安装到开发环境中。安装 PyQtGraph 的方式丰富多样,每种方式都有其独特的优势和适用场景,以下将详细介绍几种常见的安装方法以及在安装过程中可能遇到的问题与对应的解决方法。

1、pip 安装:pip 作为 Python 最常用的包管理工具,使用它来安装 PyQtGraph 是最为便捷的方式之一 。在确保已经正确安装 Python 并且 pip 工具可用的前提下,只需在命令行中输入以下命令,即可轻松完成安装:

pip install pyqtgraph

在某些情况下,使用上述常规命令安装可能会遇到问题。如果网络连接不稳定,可能导致下载过程中断或速度极慢。此时,可以尝试更换 pip 源,例如使用国内的镜像源,如清华大学的镜像源。具体操作是在安装命令中添加 -i 参数指定镜像源,如下所示:

pip install pyqtgraph -i https://pypi.tuna.tsinghua.edu.cn/simple

如果在安装过程中提示权限不足,这通常是因为没有足够的权限将包安装到系统默认的 Python 环境中。对于这种情况,在 Linux 或 macOS 系统中,可以在命令前加上 sudo 以管理员权限运行安装命令,但要注意使用 sudo 时需谨慎操作,避免对系统环境造成不必要的影响;在 Windows 系统中,可以以管理员身份运行命令提示符或 PowerShell,然后再执行安装命令 。

2、官网下载 exe 安装(适用于 Windows 系统):对于不太熟悉命令行操作的 Windows 用户来说,从 PyQtGraph 官网下载 exe 安装程序进行安装是一个直观且简单的选择。首先,打开浏览器,访问 PyQtGraph 的官方网站,在官网页面的顶部通常可以找到下载链接。根据自己计算机的系统架构(32 位或 64 位),下载对应的 exe 安装文件,例如 pyqtgraph-0.10.0.win32.exe 或 pyqtgraph-0.10.0.win - amd64.exe 。下载完成后,双击运行该 exe 文件,按照安装向导的提示逐步完成安装过程。在安装过程中,可能会遇到杀毒软件的警告提示,这是因为杀毒软件对未知来源的程序进行常规检测。如果确认该安装程序是从官方正规渠道下载的,可以选择信任并继续安装 。

3、conda 安装(适用于 Anaconda 环境):如果你的开发环境是基于 Anaconda 搭建的,那么使用 conda 命令来安装 PyQtGraph 是一个不错的选择,conda 能够更好地管理 Python 环境和依赖包。在 Anaconda Prompt 中输入以下命令即可开始安装:

conda install pyqtgraph

conda 会自动处理包的依赖关系,并将 PyQtGraph 安装到当前激活的 conda 环境中。有时候,conda 安装可能会因为环境冲突或版本不兼容等问题而失败。例如,当前 conda 环境中已经安装了与 PyQtGraph 不兼容的其他库版本,或者 conda 源中没有所需版本的 PyQtGraph。遇到这种情况,可以尝试更新 conda 到最新版本,然后重新执行安装命令;也可以通过指定 conda 源来获取更多的包版本选择,比如使用 conda-forge 源:

conda install -c conda-forge pyqtgraph

4、从源码安装:对于一些对软件版本有特定需求,或者想要获取最新开发版本的用户,可以选择从 PyQtGraph 的 GitHub 仓库下载源代码进行安装。首先,确保系统中已经安装了 Git 工具,然后在命令行中执行以下命令克隆 PyQtGraph 的仓库:

git clone https://github.com/pyqtgraph/pyqtgraph.git

克隆完成后,进入克隆下来的 pyqtgraph 目录,执行安装命令:

python setup.py install

从源码安装可能会遇到一些编译相关的问题,特别是在缺少某些依赖库的情况下。例如,可能会提示缺少 Cython 库,此时需要先使用 pip 或 conda 安装 Cython:

pip install Cython

或者

conda install Cython

(二)快速上手示例

在成功安装 PyQtGraph 后,接下来通过几个简单的代码示例,让你快速了解如何使用 PyQtGraph 绘制常见的基础图形,感受其简洁高效的绘图风格。

1、绘制折线图:折线图是一种非常常见的数据可视化方式,用于展示数据随时间或其他连续变量的变化趋势。以下是使用 PyQtGraph 绘制折线图的简单代码示例:

import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph绘制折线图示例')# 创建PlotWidget对象,这是PyQtGraph中用于绘图的主要部件self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)# 设置图表标题,颜色为蓝色,字体大小为12ptself.pw.setTitle("气温趋势", color='b', size='12pt')# 设置Y轴标签为“气温(摄氏度)”self.pw.setLabel("left", "气温(摄氏度)")# 设置X轴标签为“时间”self.pw.setLabel("bottom", "时间")# 设置背景色为白色self.pw.setBackground('w')# 定义X轴数据,这里表示时间(小时)hour = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 定义Y轴数据,这里表示气温(摄氏度)temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]# 使用plot方法绘制折线图,pen参数设置线条颜色为蓝色self.pw.plot(hour, temperature, pen=pg.mkPen('b'))if __name__ == '__main__':app = QApplication(sys.argv)main = MainWindow()main.show()sys.exit(app.exec_())

在上述代码中,首先创建了一个 QMainWindow 作为主窗口,并在其中添加了一个 pg.PlotWidget 用于绘制图形。然后,对绘图部件进行了一些基本设置,包括图表标题、坐标轴标签和背景颜色。最后,定义了 X 轴和 Y 轴的数据,并使用 plot 方法将数据绘制为折线图,通过 pen 参数设置了折线的颜色为蓝色 。运行这段代码,将会弹出一个窗口,显示绘制好的气温趋势折线图。

2、绘制散点图:散点图常用于展示两个变量之间的关系,通过将数据点绘制在二维平面上,可以直观地观察数据的分布和趋势。以下是使用 PyQtGraph 绘制散点图的代码示例:

import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass ScatterPlot(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph绘制散点图示例')# 创建PlotWidget对象作为中心部件self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)# 生成100个服从正态分布的随机数据作为X轴坐标x = np.random.normal(size=100)# 生成100个服从正态分布的随机数据作为Y轴坐标y = np.random.normal(size=100)# 使用plot方法绘制散点图,pen参数设置为None表示不绘制线条,symbol参数设置散点形状为圆形self.graphWidget.plot(x, y, pen=None, symbol='o')if __name__ == '__main__':app = QApplication(sys.argv)window = ScatterPlot()window.show()sys.exit(app.exec_())

在这个示例中,首先创建了一个继承自 QMainWindow 的 ScatterPlot 类。在类的初始化方法中,创建了 pg.PlotWidget 并将其设置为中心部件。接着,使用 numpy 库生成了两组随机数据,分别作为散点图的 X 轴和 Y 轴坐标。最后,通过 plot 方法将这些数据点绘制为散点图,其中 pen=None 表示不绘制连接数据点的线条,symbol='o' 表示将散点显示为圆形 。运行该代码后,将会看到一个展示随机数据分布的散点图窗口。

四、深入探索 PyQtGraph 功能

(一)强大的 2D 绘图功能

1、丰富图形类型

  • 折线图:在时间序列分析、趋势展示等场景中广泛应用。例如在分析股票价格走势时,以时间为横轴,股票价格为纵轴,通过折线图可以清晰地看到股票价格随时间的变化趋势,帮助投资者捕捉价格波动规律。使用 PyQtGraph 绘制折线图非常简单,示例代码如下:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph折线图示例')self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)time = [1, 2, 3, 4, 5]stock_price = [100, 105, 110, 108, 115]self.pw.plot(time, stock_price, pen=pg.mkPen('r'))if __name__ == '__main__':app = QApplication(sys.argv)main = MainWindow()main.show()sys.exit(app.exec_())
  • 柱状图:常用于比较不同类别数据的大小。在市场份额分析中,不同公司的市场份额可以用柱状图直观展示,柱子的高度代表市场份额的大小,便于快速比较各公司之间的市场地位。以下是绘制柱状图的代码示例:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass BarChart(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph柱状图示例')self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)companies = ['A公司', 'B公司', 'C公司']market_share = [30, 40, 30]x = np.arange(len(companies))bar = pg.BarGraphItem(x=x, height=market_share, width=0.6, brush='g')self.graphWidget.addItem(bar)self.graphWidget.setXRange(-0.5, len(companies) - 0.5)self.graphWidget.setYRange(0, 50)self.graphWidget.setTicks([[(i, name) for i, name in enumerate(companies)]])if __name__ == '__main__':app = QApplication(sys.argv)window = BarChart()window.show()sys.exit(app.exec_())
  • 直方图:主要用于展示数据的分布情况。在分析学生考试成绩分布时,将成绩划分为不同的分数段,通过直方图可以直观地看到每个分数段的学生人数分布,了解成绩的集中趋势和离散程度。绘制直方图的示例代码如下:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass Histogram(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph直方图示例')self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)scores = np.random.normal(70, 10, 1000)bins = np.arange(0, 101, 10)hist, _ = np.histogram(scores, bins=bins)width = np.diff(bins)bar = pg.BarGraphItem(x=bins[: - 1], height=hist, width=width, brush='b')self.graphWidget.addItem(bar)self.graphWidget.setXRange(0, 100)self.graphWidget.setYRange(0, 150)if __name__ == '__main__':app = QApplication(sys.argv)window = Histogram()window.show()sys.exit(app.exec_())
  • 散点图:用于展示两个变量之间的关系,判断数据的分布和趋势。在研究身高与体重的关系时,以身高为横轴,体重为纵轴,每个数据点代表一个人的身高和体重,通过散点图可以直观地观察到身高与体重之间是否存在某种线性或非线性关系。绘制散点图的代码如下:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass ScatterPlot(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph散点图示例')self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)height = np.random.normal(170, 10, 100)weight = np.random.normal(65, 10, 100)self.graphWidget.plot(height, weight, pen=None, symbol='o', symbolSize=5, symbolBrush='r')if __name__ == '__main__':app = QApplication(sys.argv)window = ScatterPlot()window.show()sys.exit(app.exec_())
  1. 交互操作实现
    • 鼠标平移:PyQtGraph 的绘图区域默认支持鼠标平移操作。当用户在绘图区域按下鼠标左键并拖动时,绘图内容会随之移动。这一功能在查看较大范围的数据时非常实用,比如在地理信息系统中查看地图时,通过鼠标平移可以浏览不同区域的地理数据 。在代码层面,无需额外编写大量代码来实现平移功能,只需创建绘图部件并显示即可默认支持。例如:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass InteractivePlot(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph交互绘图示例')self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]self.pw.plot(x, y)if __name__ == '__main__':app = QApplication(sys.argv)main = InteractivePlot()main.show()sys.exit(app.exec_())
  • 缩放:用户可以通过鼠标滚轮或在绘图区域按下鼠标右键并拖动来实现缩放功能。在分析大数据集时,缩放功能可以帮助用户聚焦到感兴趣的数据区域,查看数据的细节。比如在分析股票价格走势时,通过缩放可以查看某一特定时间段内股价的详细波动情况。如果需要对缩放功能进行更精细的控制,可以通过设置 ViewBox 的相关属性来实现。例如,限制缩放的范围:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass InteractivePlot(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph交互绘图示例')self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]self.pw.plot(x, y)self.pw.getViewBox().setLimits(xMin=0, xMax=10, yMin=0, yMax=50)if __name__ == '__main__':app = QApplication(sys.argv)main = InteractivePlot()main.show()sys.exit(app.exec_())
  • 选择数据:可以通过 ScatterPlotItem 等图形项的 sigClicked 信号来实现数据选择功能。当用户点击散点图中的某个数据点时,会触发该信号,从而获取点击的数据点信息。在数据探索和分析中,这一功能可以帮助用户快速定位和查看感兴趣的数据。例如:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass DataSelection(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph数据选择示例')self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)x = np.random.normal(size = 100)y = np.random.normal(size = 100)self.scatter = pg.ScatterPlotItem(x, y, pen=None, symbol='o', symbolSize=5, symbolBrush='r')self.graphWidget.addItem(self.scatter)self.scatter.sigClicked.connect(self.handle_click)def handle_click(self, plot, points):for point in points:pos = point.pos()print(f'点击的数据点坐标: x={pos.x()}, y={pos.y()}')if __name__ == '__main__':app = QApplication(sys.argv)window = DataSelection()window.show()sys.exit(app.exec_())
  1. 绘图属性定制
  • 设置线条颜色、粗细:在绘制折线图时,可以通过 pen 参数来设置线条的颜色和粗细。例如,将线条颜色设置为蓝色,粗细设置为 3:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass CustomPlot(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph绘图属性定制示例')self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]pen = pg.mkPen(color='b', width = 3)self.pw.plot(x, y, pen = pen)if __name__ == '__main__':app = QApplication(sys.argv)main = CustomPlot()main.show()sys.exit(app.exec_())
  • 标记样式:对于散点图或折线图上的数据点,可以通过 symbol、symbolSize、symbolBrush 和 symbolPen 等参数来设置标记的样式。比如将散点标记设置为三角形,大小为 8,填充颜色为绿色,边框颜色为黑色:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowimport numpy as npclass CustomSymbol(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph标记样式定制示例')self.graphWidget = pg.PlotWidget()self.setCentralWidget(self.graphWidget)x = np.random.normal(size = 100)y = np.random.normal(size = 100)self.graphWidget.plot(x, y, pen=None, symbol='t', symbolSize=8, symbolBrush='g', symbolPen='k')if __name__ == '__main__':app = QApplication(sys.argv)window = CustomSymbol()window.show()sys.exit(app.exec_())
  • 背景颜色:可以通过 setBackground 方法来设置绘图区域的背景颜色。将背景颜色设置为浅黄色:
import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowclass CustomBackground(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQtGraph背景颜色定制示例')self.pw = pg.PlotWidget()self.setCentralWidget(self.pw)x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]self.pw.plot(x, y)self.pw.setBackground('y')if __name__ == '__main__':app = QApplication(sys.argv)main = CustomBackground()main.show()sys.exit(app.exec_())

(二)精彩的 3D 绘图功能

  1. 3D 图形绘制基础
  • 3D 曲面绘制:在科学计算、地理信息系统等领域有广泛应用。比如在绘制地形高度图时,通过 3D 曲面可以直观地展示地形的起伏变化。使用 PyQtGraph 绘制 3D 曲面,需要导入 pyqtgraph.opengl 模块。示例代码如下:
import sysimport pyqtgraph as pgimport pyqtgraph.opengl as glimport numpy as npfrom PyQt5.QtWidgets import QApplicationapp = QApplication(sys.argv)w = gl.GLViewWidget()w.show()w.setWindowTitle('PyQtGraph 3D曲面示例')w.setCameraPosition(distance = 40)n = 100x = np.linspace(-5, 5, n)y = np.linspace(-5, 5, n)x, y = np.meshgrid(x, y)z = np.sin(np.sqrt(x ** 2 + y ** 2))g = gl.GLSurfacePlotItem(x = x, y = y, z = z, shader='shaded', color=(0.5, 0.5, 1, 1))w.addItem(g)if __name__ == '__main__':if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):QApplication.instance().exec_()
  • 3D 散点图绘制:常用于展示三维空间中的数据分布。在分析分子结构时,原子的位置可以用 3D 散点图表示,每个散点代表一个原子的坐标位置。以下是绘制 3D 散点图的代码示例:
import sysimport pyqtgraph as pgimport pyqtgraph.opengl as glimport numpy as npfrom PyQt5.QtWidgets import QApplicationapp = QApplication(sys.argv)w = gl.GLViewWidget()w.show()w.setWindowTitle('PyQtGraph 3D散点图示例')w.setCameraPosition(distance = 40)pos = np.random.normal(size=(1000, 3))scatter = gl.GLScatterPlotItem(pos = pos, color=(1, 1, 1), size = 5)w.addItem(scatter)if __name__ == '__main__':if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):QApplication.instance().exec_()
  • 3D 网格图绘制:可以用于展示三维空间中的结构或数据关系。在建筑设计中,建筑结构的框架可以用 3D 网格图表示。绘制 3D 网格图的示例代码如下:
import sysimport pyqtgraph as pgimport pyqtgraph.opengl as glimport numpy as npfrom PyQt5.QtWidgets import QApplicationapp = QApplication(sys.argv)w = gl.GLViewWidget()w.show()w.setWindowTitle('PyQtGraph 3D网格图示例')w.setCameraPosition(distance = 40)g = gl.GLGridItem()g.setSize(10, 10)g.setSpacing(1, 1)w.addItem(g)if __name__ == '__main__':if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):QApplication.instance().exec_()
  1. 3D 场景交互控制
  • 鼠标旋转:在 3D 场景中,用户可以通过按住鼠标右键并拖动来实现场景的旋转,从不同角度观察 3D 图形。这在查看复杂的 3D 模型时非常有用,比如在查看机械零件的 3D 模型时,可以通过旋转全方位了解零件的结构。PyQtGraph 的 GLViewWidget 类默认支持这一交互操作,无需额外编写复杂代码来实现。例如,在上述绘制 3D 曲面的代码中,运行程序后即可通过鼠标右键拖动来旋转 3D 曲面 。
  • 缩放:与 2D 绘图类似,在 3D 场景中可以通过鼠标滚轮来实现缩放操作,调整 3D 图形的显示大小。在查看大型 3D 场景时,缩放功能可以帮助用户聚焦到感兴趣的区域。比如在查看城市的 3D 模型时,通过缩放可以查看城市中某一建筑的细节。同样,这一功能在 GLViewWidget 中是默认支持的 。
  • 平移:用户可以通过按住鼠标左键并拖动来平移 3D 场景,改变 3D 图形在视野中的位置。在展示大型 3D 地图时,平移功能方便用户浏览不同区域的地图信息。在代码层面,这些交互操作都是由 GLViewWidget 类内部实现,开发者只需创建相应的 3D 图形项并添加到 GLViewWidget 中,用户就可以直接使用这些交互功能 。

五、PyQtGraph 在 GUI 中的应用

(一)与 PyQt 结合

1、在 PyQt 界面嵌入 PyQtGraph:在基于 PyQt 开发的图形用户界面(GUI)中,将 PyQtGraph 嵌入其中可以为应用程序增添强大的数据可视化功能,为用户提供更加直观的数据展示方式。以下是在 PyQt 窗口中添加绘图区域的详细步骤与代码实现。

步骤

  • 首先,确保已经安装了 PyQt5 和 PyQtGraph 库。如果尚未安装,可以使用 pip 命令进行安装:
pip install PyQt5 pyqtgraph
  • 导入必要的模块,包括 PyQt5 中的相关类以及 PyQtGraph。
  • 创建一个 PyQt 的主窗口类,通常继承自QMainWindow。
  • 在主窗口类的初始化方法中,创建一个QWidget作为中心部件,并为其设置布局(例如QVBoxLayout),用于容纳其他控件。
  • 创建一个 PyQtGraph 的PlotWidget对象,这是用于绘制图形的核心部件。
  • 将PlotWidget添加到之前创建的布局中,从而将其嵌入到 PyQt 窗口中。
  • 可以根据需求对PlotWidget进行一些初始化设置,如设置背景颜色、添加坐标轴标签等。
  • 最后,在if __name__ == '__main__':代码块中创建应用程序实例并显示主窗口。
  • 代码实现
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidgetimport pyqtgraph as pgclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('PyQt与PyQtGraph结合示例')self.setGeometry(100, 100, 800, 600)central_widget = QWidget()self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)self.plot_widget = pg.PlotWidget()self.plot_widget.setBackground('w')self.plot_widget.setLabel('left', 'Y轴数据')self.plot_widget.setLabel('bottom', 'X轴数据')layout.addWidget(self.plot_widget)x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]self.plot_widget.plot(x, y, pen=pg.mkPen('r'))if __name__ == '__main__':app = QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_())

在上述代码中,首先导入了所需的模块。然后创建了MainWindow类,在其初始化方法中设置了窗口标题和大小,并创建了一个QWidget作为中心部件,为其设置了垂直布局QVBoxLayout。接着创建了pg.PlotWidget并进行了一些基本设置,如背景颜色和坐标轴标签。最后将PlotWidget添加到布局中,并在窗口中绘制了一条简单的折线图。运行这段代码,将会看到一个包含绘图区域的 PyQt 窗口,其中显示了绘制的折线图 。

2、 信号与槽机制应用:信号与槽机制是 Qt 框架的核心特性之一,它提供了一种对象间通信的方式,使得不同的对象可以在事件发生时进行交互。在 PyQtGraph 与 PyQt 结合的应用中,利用信号与槽机制可以实现 GUI 与绘图的丰富交互,提升用户体验。

  • 信号与槽的概念:信号是对象在发生特定事件时发出的通知,而槽是用于接收信号并执行相应操作的函数。例如,在 PyQtGraph 中,当用户在绘图区域进行鼠标点击、缩放、平移等操作时,会发出相应的信号;在 PyQt 的 GUI 中,当用户点击按钮、改变下拉框选择等操作时,也会发出信号。我们可以将这些信号与相应的槽函数连接起来,实现 GUI 与绘图之间的交互 。
  • 实现 GUI 与绘图的交互:以一个简单的例子来说明,假设在 PyQt 的 GUI 中有一个按钮,点击该按钮后,PyQtGraph 的绘图区域会更新显示新的数据。
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButtonimport pyqtgraph as pgimport numpy as npclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('信号与槽机制应用示例')self.setGeometry(100, 100, 800, 600)central_widget = QWidget()self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)self.plot_widget = pg.PlotWidget()self.plot_widget.setBackground('w')self.plot_widget.setLabel('left', 'Y轴数据')self.plot_widget.setLabel('bottom', 'X轴数据')layout.addWidget(self.plot_widget)self.update_button = QPushButton('更新数据')layout.addWidget(self.update_button)self.update_button.clicked.connect(self.update_plot)self.initial_plot()def initial_plot(self):x = np.linspace(0, 10, 100)y = np.sin(x)self.plot_widget.plot(x, y, pen=pg.mkPen('b'))def update_plot(self):x = np.linspace(0, 10, 100)y = np.cos(x)self.plot_widget.clear()self.plot_widget.plot(x, y, pen=pg.mkPen('r'))if __name__ == '__main__':app = QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_())

在上述代码中,创建了一个QPushButton按钮,并将其clicked信号连接到update_plot槽函数。当用户点击按钮时,update_plot函数会被调用,该函数会清除绘图区域原来的数据,然后绘制新的余弦函数曲线。通过这种方式,实现了 GUI 中按钮操作与 PyQtGraph 绘图区域数据更新的交互 。

(二)Qt Designer 的巧用

1、提升组件为 PyQtGraph 控件:Qt Designer 是 Qt 提供的一个可视化设计工具,它允许开发者通过拖放的方式快速创建 GUI 界面。在使用 Qt Designer 设计界面时,将普通组件提升为 PyQtGraph 控件,可以方便地在设计好的界面中集成 PyQtGraph 的绘图功能。以下是详细的操作步骤:

  • 打开 Qt Designer,并创建一个新的 Qt Widgets Application 项目,或者打开已有的项目。
  • 在 Qt Designer 的组件面板中,选择一个合适的容器组件,如QWidget,将其拖放到主窗口中,作为要提升为 PyQtGraph 控件的基础组件。这个容器组件将用于承载 PyQtGraph 的绘图功能 。
  • 右键点击添加的QWidget组件,在弹出的菜单中选择 “提升为...” 选项。这将打开 “提升为” 对话框,在这个对话框中进行提升组件的设置 。
  • 在 “提升的类名称” 输入框中,填入要提升为的 PyQtGraph 控件类名,例如,如果要提升为用于绘制二维图形的PlotWidget,则填入PlotWidget;如果是用于 3D 绘图的GLViewWidget,则填入GLViewWidget。在 “头文件” 输入框中,填入对应的 PyQtGraph 模块头文件名,通常为pyqtgraph 。
  • 点击 “添加” 按钮,将设置添加到列表中,然后点击 “提升” 按钮,完成组件的提升操作。此时,原来的QWidget组件就被提升为了指定的 PyQtGraph 控件,可以在属性编辑器中看到该控件的属性发生了变化,显示为 PyQtGraph 控件特有的属性 。

2、生成代码与运行:完成组件提升后,需要将设计好的 UI 文件转换为 Python 代码,并运行程序来查看效果。

  • 生成 Python 代码:使用pyuic5工具将 UI 文件(通常以.ui结尾)转换为 Python 代码文件。在命令行中,进入 UI 文件所在的目录,然后执行以下命令:
pyuic5 -o output_file.py input_file.ui

其中,output_file.py是生成的 Python 代码文件名,input_file.ui是设计好的 UI 文件名。执行该命令后,会在当前目录下生成一个 Python 文件,该文件包含了根据 UI 设计生成的代码,其中已经包含了提升后的 PyQtGraph 控件相关代码 。

  • 运行程序:创建一个主 Python 脚本,在脚本中导入生成的 Python 代码文件,并创建应用程序实例来显示界面。以下是一个简单的示例:
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom output_file import Ui_MainWindowclass MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)# 可以在这里对PyQtGraph控件进行进一步的初始化和操作x = [1, 2, 3, 4, 5]y = [10, 20, 15, 25, 30]self.plot_widget.plot(x, y, pen='r')if __name__ == '__main__':app = QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_())

在上述代码中,首先导入了必要的模块和生成的 UI 代码文件。然后创建了MainWindow类,继承自QMainWindow和生成的Ui_MainWindow类。在MainWindow类的初始化方法中,调用setupUi方法设置界面,并对提升后的plot_widget(假设提升的是PlotWidget控件)进行了简单的绘图操作。最后,创建应用程序实例并显示主窗口 。运行这个脚本,就可以看到在 Qt Designer 中设计的界面,并且其中的 PyQtGraph 控件已经可以正常使用,显示绘制的图形。

六、实战项目演练

(一)项目背景与目标

在当今数字化时代,工业自动化生产中的数据监测与分析对于提高生产效率、保障产品质量起着至关重要的作用。我们以一个模拟的工业生产线温度监测系统为例,该生产线在生产过程中,多个关键设备的温度变化直接影响着产品的质量和生产的稳定性。为了实时掌握设备的运行状态,及时发现潜在的故障隐患,我们决定开发一个基于 PyQtGraph 的温度监测系统。

这个项目的主要目标是实现对工业生产线中多个设备的温度进行实时采集、监测和可视化展示。具体来说,要完成以下功能:

  • 实时数据采集:与生产线中的温度传感器建立通信,实时获取各个设备的温度数据。
  • 数据存储:将采集到的温度数据存储到本地数据库中,以便后续进行数据分析和历史数据查询。
  • 实时绘图:利用 PyQtGraph 强大的绘图功能,将实时采集到的温度数据以折线图的形式展示在界面上,让操作人员能够直观地看到温度的变化趋势。
  • 交互功能:提供交互功能,例如允许操作人员通过鼠标缩放和平移图表,以便更详细地查看特定时间段内的温度变化;当温度超出预设的正常范围时,能够及时发出警报提醒操作人员采取相应措施 。

(二)项目实施步骤

1、数据准备:在这个项目中,我们假设温度传感器通过串口通信将数据传输到计算机。首先,需要使用 Python 的pyserial库来实现与串口的通信,获取温度数据。安装pyserial库可以使用以下命令:

pip install pyserial

在代码中,实现串口通信并读取温度数据的示例如下:

import serialser = serial.Serial('COM1', 9600, timeout=1) # 根据实际情况修改串口和波特率while True:if ser.in_waiting:data = ser.readline().decode('utf-8').strip()try:temperature = float(data)# 这里可以添加将温度数据存储到数据库的代码print(f'读取到温度数据: {temperature}')except ValueError:print('数据格式错误')

上述代码打开指定的串口,设置波特率为 9600,超时时间为 1 秒。在循环中,不断检查串口是否有数据可读,如果有数据,则读取一行数据并进行解码和转换为浮点数。如果数据格式不正确,会打印错误信息。

对于数据存储,我们可以使用 SQLite 数据库,它是一个轻量级的嵌入式数据库,非常适合小型项目。使用sqlite3库来操作 SQLite 数据库,该库是 Python 标准库的一部分,无需额外安装。以下是将温度数据存储到 SQLite 数据库的示例代码:

import sqlite3conn = sqlite3.connect('temperature_data.db')cursor = conn.cursor()cursor.execute('CREATE TABLE IF NOT EXISTS temperatures (id INTEGER PRIMARY KEY AUTOINCREMENT, temperature REAL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')def save_temperature(temperature):cursor.execute('INSERT INTO temperatures (temperature) VALUES (?)', (temperature,))conn.commit()

在上述代码中,首先连接到名为temperature_data.db的 SQLite 数据库,如果数据库不存在则会创建。然后创建一个名为temperatures的表,用于存储温度数据和时间戳。save_temperature函数用于将温度数据插入到表中。

2、界面设计:我们使用 Qt Designer 来设计项目的界面,它提供了直观的可视化设计方式,能够大大提高开发效率。

  • 打开 Qt Designer,创建一个新的 Qt Widgets Application 项目。
  • 在组件面板中,选择一个QWidget作为主窗口的中心部件,并为其设置QVBoxLayout布局,以便容纳其他控件。
  • 从组件面板中拖放一个PlotWidget到布局中,用于显示温度变化的折线图。
  • 拖放一个QPushButton按钮到布局中,用于启动和停止数据采集。
  • 再拖放一个QLabel标签到布局中,用于显示当前的温度值和警报信息。
  • 为各个控件设置合适的属性,例如为PlotWidget设置背景颜色为白色,为按钮设置文本为 “开始采集”,为标签设置初始文本为空。
  • 完成界面设计后,将 UI 文件保存为temperature_monitor.ui。

3、绘图功能实现:使用 PyQtGraph 实现温度数据的实时绘图功能。首先,将 Qt Designer 生成的 UI 文件转换为 Python 代码,使用pyuic5工具,在命令行中执行以下命令:

pyuic5 -o temperature_monitor_ui.py temperature_monitor.ui

然后,创建一个主 Python 脚本,在脚本中导入生成的 UI 代码文件,并实现绘图功能。示例代码如下:

import sysimport pyqtgraph as pgfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom temperature_monitor_ui import Ui_MainWindowimport sqlite3import timeclass MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.conn = sqlite3.connect('temperature_data.db')self.cursor = self.conn.cursor()self.is_running = Falseself.start_button.clicked.connect(self.start_stop_collection)self.timer = pg.QtCore.QTimer()self.timer.timeout.connect(self.update_plot)self.plot_widget.setBackground('w')self.plot_widget.setLabel('left', '温度(℃)')self.plot_widget.setLabel('bottom', '时间')def start_stop_collection(self):if not self.is_running:self.is_running = Trueself.start_button.setText('停止采集')self.timer.start(1000) # 每秒更新一次数据else:self.is_running = Falseself.start_button.setText('开始采集')self.timer.stop()def update_plot(self):self.cursor.execute('SELECT temperature, timestamp FROM temperatures ORDER BY id DESC LIMIT 100')data = self.cursor.fetchall()if data:temperatures = [row[0] for row in data]timestamps = [time.mktime(time.strptime(row[1], '%Y-%m-%d %H:%M:%S')) for row in data]self.plot_widget.clear()self.plot_widget.plot(timestamps, temperatures, pen=pg.mkPen('r'))current_temperature = temperatures[-1]self.temperature_label.setText(f'当前温度: {current_temperature}℃')if current_temperature > 80 or current_temperature < 20: # 假设正常温度范围是20 - 80℃self.temperature_label.setStyleSheet('color: red')self.temperature_label.setText(f'当前温度: {current_temperature}℃ 警报:温度异常!')else:self.temperature_label.setStyleSheet('color: black')if __name__ == '__main__':app = QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_())

在上述代码中,MainWindow类继承自QMainWindow和生成的Ui_MainWindow类。在初始化方法中,连接到数据库,设置按钮的点击事件处理函数,初始化定时器,并对绘图区域进行设置。start_stop_collection函数用于控制数据采集的开始和停止。update_plot函数从数据库中获取最近 100 条温度数据及其时间戳,然后在绘图区域中绘制折线图,并更新当前温度显示和警报信息。

4、交互功能开发:为了实现用户与绘图区域的交互功能,利用 PyQtGraph 自带的交互功能。例如,默认情况下,用户可以通过鼠标滚轮进行缩放,按下鼠标左键并拖动进行平移。

# 可以进一步添加其他交互功能,比如点击获取数据点信息self.plot_widget.scene().sigMouseClicked.connect(self.handle_mouse_click)def handle_mouse_click(self, event):pos = event.scenePos()item = self.plot_widget.itemAt(pos)if item:x = self.plot_widget.vb.mapSceneToView(pos).x()y = self.plot_widget.vb.mapSceneToView(pos).y()print(f'点击位置: x={x}, y={y}')

在上述代码中,将绘图区域的鼠标点击信号sigMouseClicked连接到handle_mouse_click函数。在handle_mouse_click函数中,获取鼠标点击的位置,并将其转换为绘图区域中的坐标,然后打印出点击位置的坐标信息。这样,用户在绘图区域点击时,就可以获取到点击位置的数据信息,实现了更丰富的交互功能。

(三)项目总结与优化

在项目实施过程中,我们成功地实现了工业生产线温度监测系统的基本功能,包括实时数据采集、存储、绘图以及交互功能。通过与串口通信获取温度传感器的数据,并将其存储到 SQLite 数据库中,再利用 PyQtGraph 在 Qt 界面中实时绘制温度变化折线图,同时提供了用户与图表的交互功能和温度异常警报功能。

在数据处理和存储方面,对于大量的温度数据,当前的 SQLite 数据库可能在性能上存在一定的瓶颈。可以考虑使用更强大的关系型数据库,如 MySQL 或 PostgreSQL,它们在处理大规模数据和高并发读写方面具有更好的性能。也可以引入缓存机制,例如使用 Redis 缓存最近的温度数据,减少数据库的读取压力,提高数据获取的速度。

在绘图性能方面,当数据量不断增加时,实时绘图可能会出现卡顿现象。可以采用数据降采样技术,在不影响数据趋势的前提下,减少绘制的数据点数量,提高绘图效率。也可以对 PyQtGraph 的绘图参数进行优化,如调整绘图的刷新率、优化图形渲染方式等,以提升绘图的流畅性 。

在用户界面方面,可以进一步优化界面的布局和设计,使其更加美观和易用。添加更多的功能按钮,如数据导出、图表切换(例如切换为柱状图展示不同设备的温度对比)等,以满足用户更多的需求。还可以考虑添加多语言支持,方便不同地区的操作人员使用 。通过这些优化措施,可以使温度监测系统更加完善,更好地服务于工业生产。

七、未来展望

(一)PyQtGraph 发展趋势

随着技术的不断进步和用户需求的日益多样化,PyQtGraph 在未来有望在多个关键方面取得显著发展。

在功能扩展方面,预计将进一步丰富图形类型和绘图选项。随着各行业对数据可视化需求的不断细化,PyQtGraph 可能会引入更多新颖的图形类型,以满足不同领域的特定需求。在生物信息学领域,可能会开发专门用于展示基因序列、蛋白质结构等数据的图形类型;在金融领域,或许会新增能够直观展示复杂金融衍生品价格波动和风险指标的绘图选项 。

对大数据处理能力的提升也将是一个重要发展方向。随着数据量呈指数级增长,如何高效处理和可视化大规模数据成为关键挑战。PyQtGraph 未来可能会深度优化其数据处理算法,采用更先进的数据存储和索引技术,以实现对海量数据的快速加载、处理和绘制。这将使得在处理工业物联网中产生的大量传感器数据、天文学中的大规模天体观测数据等场景时,PyQtGraph 能够更加游刃有余,为用户提供流畅的可视化体验 。

在性能优化方面,PyQtGraph 有望进一步提升绘图的速度和效率。通过对底层渲染引擎的持续优化,充分利用现代计算机硬件的多核处理器和 GPU 加速能力,减少绘图过程中的资源消耗和时间开销。在实时绘图场景中,能够实现更高的帧率和更快速的响应,确保数据的实时变化能够及时、准确地呈现在用户面前 。

(二)对 Python 绘图领域影响

PyQtGraph 的持续发展对 Python 绘图领域将产生深远的推动作用。它的不断完善和创新将激励其他绘图库进行技术升级和功能改进,形成一个良性竞争的生态环境。Matplotlib、Seaborn 等绘图库可能会借鉴 PyQtGraph 在性能优化、交互性设计等方面的经验,推动整个 Python 绘图领域的技术进步,从而为开发者提供更多优质的绘图选择 。

随着 PyQtGraph 功能的日益强大和应用场景的不断拓展,将吸引更多开发者投身于 Python 绘图领域。它的简单易用和丰富的功能文档,使得初学者能够快速上手,降低了数据可视化的门槛;对于有经验的开发者来说,PyQtGraph 提供的高性能和定制化能力,能够满足他们在复杂项目中的需求。这将促进 Python 绘图社区的繁荣发展,推动更多优秀的绘图相关项目和工具的诞生 。

在跨学科应用方面,PyQtGraph 的发展将助力 Python 在科学研究、工程设计、数据分析等多个领域发挥更大的作用。通过与其他科学计算库和工具的深度融合,如 NumPy、SciPy 等,为各领域的研究人员和工程师提供更加全面、高效的数据处理和可视化解决方案,加速科研成果的转化和工程实践的推进 。

http://www.dtcms.com/a/274442.html

相关文章:

  • [ARC195E] Random Tree Distance
  • 完全和零一背包
  • 游戏开发日记
  • nginx 负载均衡配置(加解决重复登录问题)
  • Reading and Writing to a State Variable
  • stm32-modbus-rs485程序移植过程
  • gRPC服务注册和故障恢复
  • AI技术重塑工业制造:从智能应用到大型模型落地
  • AMTS AHTE | 具身智能成制造升级新引擎 灵途科技助力更强感知
  • 八股训练--RabbitMQ
  • LVS-NAT模式配置
  • 《Java 虚拟机内幕:从垃圾回收到类加载的深度解析》
  • 微积分核心考点全解析
  • pnpm 的 resolution-mode 配置 ( pnpm 的版本解析)
  • 上位机知识篇---Docker
  • 静态路由综合实验报告册
  • HashMap简介
  • 五星出东方洛老师:gma绘制的洛阳市瀍河回族区的地图和兴趣点
  • 高精加法-P1601 A+B Problem(高精)
  • intellij idea的重命名shift+f6不生效(快捷键被微软输入法占用)
  • 决策树算法在医学影像诊断中的广泛应用
  • 知识科普丨详述agent含义
  • 【深度学习系列】ResNet网络原理与mnist手写数字识别实现
  • 浏览器重绘与重排
  • JAVA ---Excel高效导入(去重1000万数据对比)
  • 聊聊微服务架构中的双token
  • Junit多线程的坑
  • Python爬虫动态IP代理报错全解析:从问题定位到实战优化
  • 【牛客刷题】超级圣诞树(递归法和分形复制法)
  • 实时数仓和离线数仓还分不清楚?看完就懂了