《PyQtGraph例子库:Python数据可视化的宝藏地图》

探索 PyQtGraph:Python 数据可视化的新视野

在 Python 的数据可视化领域,PyQtGraph 宛如一颗耀眼的明星,以其独特的魅力和强大的功能,为开发者们开辟了全新的视野。随着数据量的爆发式增长以及对可视化交互性需求的日益提升,传统绘图库在某些场景下逐渐显得力不从心,而 PyQtGraph 凭借其独特优势脱颖而出。它构建于强大的 PyQt 和 PySide 框架之上,结合了 NumPy 高效的数据处理能力,为开发者提供了高性能的绘图功能。无论是处理科研领域中动辄成千上万的数据点,还是在工业监控场景下需要实时更新的数据,PyQtGraph 都能轻松应对,确保绘图的流畅性和高效性,这是许多其他绘图库难以企及的。

交互性是 PyQtGraph 的又一核心亮点。它赋予用户与图形进行深度交互的能力,通过简单的鼠标操作,如缩放、平移、选择和标注等,用户可以从不同角度、不同层次探索数据,挖掘数据背后隐藏的信息。以地理信息系统(GIS)应用为例,用户可以利用 PyQtGraph 的交互功能,在地图上自由缩放,查看不同区域的详细地理数据,还能通过标注功能标记出感兴趣的地点,极大地提高了数据的可探索性和分析效率。此外,PyQtGraph 还提供了丰富多样的绘图选项,涵盖了曲线图、散点图、图像绘制、三维曲面图等多种类型,几乎可以满足任何可视化需求。在医学图像处理中,它能够展示 MRI、CT 等医学影像数据,支持在任意角度对多维图像进行切片显示,帮助医生更全面、准确地观察患者的身体状况 。同时,PyQtGraph 支持多平台运行,无论是 Windows、macOS 还是 Linux 系统,都能完美适配,这使得它在不同的开发环境和应用场景中都能发挥重要作用,进一步拓展了其应用范围。

而 PyQtGraph 的例子库更是其精华所在,它犹如一座丰富的宝藏,里面包含了各种各样的示例代码,从简单的折线图绘制到复杂的三维场景渲染,从基本的信号处理展示到高级的交互式数据分析,这些例子涵盖了 PyQtGraph 的各种功能和应用场景,为开发者们提供了宝贵的学习资源和实践参考,让我们能够更直观地理解和掌握 PyQtGraph 的强大功能。接下来,就让我们一起深入探索 PyQtGraph 例子库的精彩世界。

一、PyQtGraph 库初相识

(一)PyQtGraph 是什么

PyQtGraph 是一个基于 Python 的强大图形和 GUI 库,它构建于 PyQt4/PySide 和 numpy 之上,为数学、科学和工程等领域的应用提供了高效的数据可视化解决方案 。PyQtGraph 的底层依赖于 Qt 的 GraphicsView 框架,这一框架赋予了它强大的图形渲染能力,能够高效地处理复杂的图形场景。同时,结合 numpy 在数值计算方面的卓越性能,PyQtGraph 在数据处理和绘图速度上表现出色,能够快速地将大量数据转化为直观的图形展示。

PyQtGraph 不仅适用于传统的桌面应用程序开发,在科研领域,它被广泛用于实验数据的可视化分析,帮助科研人员快速洞察数据中的规律和趋势;在工业自动化中,能够实时展示传感器采集的数据,为设备监控和故障诊断提供直观依据;在教育领域,可用于开发交互式的教学演示程序,让学生更直观地理解抽象的数学和科学概念。例如,在物理实验数据的分析中,科研人员可以使用 PyQtGraph 快速绘制出实验数据的折线图、散点图等,通过对图形的交互操作,深入分析数据的变化规律,从而验证物理理论或发现新的物理现象。

(二)为何选择 PyQtGraph

在 Python 的数据可视化领域,有众多优秀的库可供选择,如 matplotlib、seaborn 等,然而 PyQtGraph 凭借其独特的优势在众多库中脱颖而出。

与 matplotlib 相比,matplotlib 是一个非常经典且功能全面的绘图库,拥有丰富的文档和广泛的用户基础,能够生成高质量出版级别的图形,在学术论文、报告等场景中应用广泛。但在面对大规模数据或实时数据绘制时,matplotlib 的性能表现往往不尽人意,绘图速度较慢,难以满足实时性要求较高的应用场景。而 PyQtGraph 在绘图速度上具有明显优势,它经过了高度的优化,能够快速处理和绘制大量数据,即使在数据量达到数十万甚至数百万个点时,依然能够保持流畅的绘图表现,非常适合实时数据采集和动态图形绘制场合。例如在股票交易数据的实时监控系统中,需要实时更新股价走势、成交量等数据的图表,PyQtGraph 能够快速响应数据的变化,以流畅的动画效果展示数据的实时变化,让投资者能够及时掌握市场动态。

seaborn 是基于 matplotlib 开发的高级数据可视化库,它默认提供了更美观的图形样式,简化了常见统计图表的绘制,在统计分析和数据探索方面表现出色。但 seaborn 主要侧重于静态图表的绘制,交互性相对较弱。PyQtGraph 则在交互性方面表现卓越,它提供了丰富的交互功能,用户可以通过鼠标进行平移、缩放、选择、标注等操作,与图形进行深度交互,更直观地探索数据。在地理信息系统(GIS)中,使用 PyQtGraph 可以创建交互式地图,用户能够通过鼠标缩放和平移地图,查看不同区域的详细地理信息,还可以通过点击地图上的标记获取相关地点的具体数据,大大提高了数据的可探索性和分析效率。

(三)安装与环境配置

在不同的操作系统下,安装 PyQtGraph 的方法略有不同,但总体来说都较为简便。

在 Windows 系统下,推荐使用 pip 进行安装,只需在命令提示符中输入 “pip install pyqtgraph”,pip 会自动下载并安装 PyQtGraph 及其依赖项。安装过程中可能会遇到依赖库版本冲突的问题,例如 PyQt 或 numpy 的版本不符合要求。此时,可以先使用 “pip uninstall” 命令卸载冲突的库,然后重新安装指定版本的依赖库,再尝试安装 PyQtGraph。例如,如果提示 PyQt 版本过低,可以先卸载现有的 PyQt 库(“pip uninstall PyQt5” 或 “pip uninstall PyQt4” ),然后安装符合要求的版本(“pip install PyQt5==5.15.4” 或 “pip install PyQt4==4.12.3” ,具体版本号根据需求而定),最后再安装 PyQtGraph。

在 Linux 系统中,对于基于 Debian 或 Ubuntu 的系统,可以使用 apt-get 命令进行安装,首先更新包列表(“sudo apt-get update”),然后输入 “sudo apt-get install python3-pyqtgraph” (如果使用 Python 2,则是 “sudo apt-get install python-pyqtgraph” )。如果遇到 “unable to locate package PyQtGraph” 的错误,可能是因为包源中没有该软件包,可以尝试使用 pip 安装,确保已激活相应的 Python 环境(比如 conda、virtualenv 或者直接使用系统的 Python),然后执行 “pip install pyqtgraph” 。另外,也可以从源码安装,访问 PyQtGraph 的 GitHub 页面(https://github.com/pyqtgraph/pyqtgraph)下载源代码,按照文档说明进行编译和安装 。

在 Mac 系统下,同样可以使用 pip 安装,在终端中输入 “pip install pyqtgraph” 即可。如果安装过程中出现权限问题,可以在命令前加上 “sudo” 获取管理员权限,但要注意使用 sudo 安装可能会对系统环境产生影响,建议在虚拟环境中进行安装。若遇到依赖库安装失败的情况,可参考 Windows 和 Linux 系统下解决依赖问题的方法,检查和调整依赖库的版本。

二、打开 PyQtGraph 例子库的大门

(一)查看例子库的方法

想要深入探索 PyQtGraph 的功能和用法,其自带的例子库是绝佳的学习资源。通过几行简单的代码,我们就能轻松打开这个充满宝藏的例子库。在 Python 脚本中,只需要导入pyqtgraph.examples模块,并调用run()函数即可,具体代码如下:

import pyqtgraph.examples

pyqtgraph.examples.run()

当你运行这段代码时,PyQtGraph 的例子库界面便会呈现在你眼前。在不同的开发环境中,运行这段代码的方式略有不同。如果你使用的是 Spyder,这是一款类似于 MATLAB 的集成开发环境,操作十分便捷。在 Spyder 的控制台中,直接复制上述两行代码并回车执行,即可快速打开例子库。不过,有时候在 Spyder 中点击例子库界面下方的 “run example” 按钮可能无法直接运行样例,这时可以将示例代码复制到新的 Python 文件中,然后重启内核(在 Consoles 菜单中选择 restart kernel)后再运行 ,就能顺利查看示例效果。

在 Jupyter Notebook 中,同样可以运行上述代码来打开例子库。Jupyter Notebook 是一个交互式的笔记本环境,支持运行多种编程语言,它的优势在于能够将代码、文本说明、可视化结果等融合在一个文档中,方便进行数据分析和展示。在 Jupyter Notebook 的代码单元格中输入上述代码,然后按下 “Shift+Enter” 组合键,就能执行代码并弹出例子库界面。需要注意的是,由于 Jupyter Notebook 的内核管理机制,在运行 PyQtGraph 相关代码时,可能需要确保内核正确配置,以避免出现图形显示异常等问题。如果遇到问题,可以尝试重启内核或者检查相关依赖库的安装情况。

对于使用 PyCharm 的开发者来说,首先需要创建一个 Python 项目,并在项目中创建一个 Python 文件。将打开例子库的代码粘贴到文件中,然后点击运行按钮(通常是绿色的三角形图标),即可运行代码打开例子库。在 PyCharm 中,还可以通过设置项目的运行配置来调整运行参数,例如选择不同的 Python 解释器、设置环境变量等,以满足不同的开发需求。如果在运行过程中出现窗口一闪而过的情况,这可能是因为程序运行结束后窗口自动关闭了。可以在代码末尾添加一些保持程序运行的代码,比如添加input()语句,这样程序会等待用户输入,窗口就不会立即关闭;或者在 PyCharm 的运行配置中,设置解释器选项,添加-i参数,让程序在运行结束后进入交互模式,从而保持窗口打开。

(二)例子库界面概览

当成功打开 PyQtGraph 的例子库后,映入眼帘的是一个精心设计的界面。界面截图(此处可插入实际的例子库界面截图)展示了其简洁而直观的布局。整个界面主要分为两个部分,左侧是示例分类列表,右侧是对应的示例展示区域。

左侧的示例分类涵盖了丰富的内容,其中 “Graphics Items” 分类包含了各种图形项的示例,如PlotItem用于创建基本的绘图区域,ScatterPlotItem展示散点图的绘制方法,BarGraphItem则用于条形图的绘制等,通过这些示例可以深入了解不同图形项的使用方法和特性;“Graphics Windows and Layouts” 分类聚焦于图形窗口和布局的相关示例,包括如何创建多窗口布局、如何在窗口中合理安排不同的绘图区域等,对于构建复杂的可视化界面非常有帮助;“Image Analysis” 分类提供了图像分析方面的示例,例如图像的加载、显示、处理以及基于图像的数据分析等,对于从事图像处理相关工作的开发者来说是宝贵的参考;“3D Graphics” 分类则是 3D 图形绘制的示例集合,展示了如何创建三维曲面图、3D 散点图等,以及如何实现 3D 场景中的交互操作,如旋转、缩放等,为需要进行三维数据可视化的用户提供了清晰的指导。

在右侧的示例展示区域,会根据左侧选择的示例分类,详细展示每个示例的具体内容。当点击某个示例时,不仅会显示示例的运行结果,还会展示对应的代码,方便用户查看和学习。用户可以直接运行这些示例代码,观察不同参数和设置下的图形效果,同时结合代码进行分析,快速掌握 PyQtGraph 的使用技巧 。这种将示例展示与代码结合的方式,使得学习过程更加直观、高效,无论你是初学者还是有一定经验的开发者,都能从例子库中获得启发和帮助,为实际项目中的数据可视化工作提供有力的支持。

三、基础绘图示例解析

(一)折线图绘制

折线图是一种最基础的数据可视化方式,它能够清晰地展示数据随时间或其他变量的变化趋势。在 PyQtGraph 中绘制折线图,步骤简洁明了。首先,我们需要准备数据,这是绘图的基础。假设我们要展示某城市一周内的气温变化,数据如下:

import numpy as np

import pyqtgraph as pg

from PyQt5.QtWidgets import QApplication, QMainWindow

# 准备数据

days = np.arange(1, 8)

temperatures = np.array([25, 26, 28, 24, 27, 29, 26])

这里使用numpy库生成了从 1 到 7 的数组days,代表一周的 7 天,temperatures数组则存储了对应的每日气温数据。

接下来,创建绘图区域。我们可以使用pg.PlotWidget()来创建一个绘图窗口,它提供了丰富的绘图功能和交互性:

class MainWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('气温变化折线图')

self.pw = pg.PlotWidget()

self.setCentralWidget(self.pw)

在上述代码中,创建了一个继承自QMainWindow的MainWindow类,在其构造函数中,设置了窗口标题,并创建了一个pg.PlotWidget对象pw,将其设置为窗口的中心部件,从而创建了绘图区域。

然后,设置绘图属性,包括颜色、线条样式等,以增强图形的可读性和美观度:

# 设置图表标题和坐标轴标签

self.pw.setTitle("一周气温变化", color='#008080', size='12pt')

self.pw.setLabel("left", "气温(摄氏度)")

self.pw.setLabel("bottom", "日期")

# 设置背景色为白色

self.pw.setBackground('w')

# 绘制折线图,设置线条颜色为蓝色

self.pw.plot(days, temperatures, pen=pg.mkPen('b'))

通过setTitle方法设置了图表标题,setLabel方法分别设置了纵坐标轴和横坐标轴的标签,setBackground方法将背景色设置为白色,最后使用plot方法绘制折线图,pen=pg.mkPen('b')设置了线条颜色为蓝色。这样,一个简单而直观的气温变化折线图就绘制完成了。运行程序,我们可以看到清晰展示气温变化趋势的折线图,通过折线的起伏,能直观地了解到这一周内气温的波动情况。

(二)散点图绘制

散点图在展示数据分布和变量之间的关系时非常有用,它可以帮助我们快速发现数据中的异常值、聚类和趋势。通过实例来展示散点图的绘制方法。假设我们有一组学生的数学成绩和物理成绩数据,想要通过散点图观察两者之间的关系:

# 生成数据

math_scores = np.random.normal(70, 10, 50)

physics_scores = np.random.normal(75, 12, 50)

这里使用numpy的random.normal函数生成了 50 个服从正态分布的数学成绩和物理成绩数据,均值分别为 70 和 75,标准差分别为 10 和 12。

接下来创建绘图区域并绘制散点图:

class ScatterPlotWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('学生成绩散点图')

self.graphWidget = pg.PlotWidget()

self.setCentralWidget(self.graphWidget)

# 绘制散点图,设置散点形状为圆形,大小为10,颜色为红色

self.graphWidget.plot(math_scores, physics_scores, pen=None, symbol='o', symbolSize=10, symbolBrush='r')

在这个ScatterPlotWindow类中,同样创建了一个QMainWindow窗口,并将pg.PlotWidget设置为中心部件。在plot方法中,pen=None表示不绘制连接散点的线条,symbol='o'设置散点形状为圆形,symbolSize=10设置散点大小为 10,symbolBrush='r'设置散点颜色为红色。这样,散点图就能够清晰地展示数学成绩和物理成绩之间的关系。从散点图中,我们可以直观地看到数据点的分布情况,例如,如果散点呈现出某种线性趋势,可能意味着数学成绩和物理成绩之间存在一定的相关性;如果存在个别离群的散点,可能表示这些学生的成绩表现较为特殊,需要进一步分析原因 。

(三)柱状图绘制

柱状图常用于比较不同类别数据的大小,能够直观地展示数据之间的差异。下面详细介绍柱状图的绘制过程。假设我们要展示某超市不同商品的销量情况:

# 商品类别

categories = ['苹果', '香蕉', '橙子', '葡萄', '西瓜']

# 销量数据

sales = np.array([30, 25, 40, 20, 35])

这里定义了一个包含 5 种商品类别的列表categories,以及对应的销量数据sales。

接着创建绘图区域并绘制柱状图:

class BarChartWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('商品销量柱状图')

win = pg.GraphicsLayoutWidget(show=True)

self.setCentralWidget(win)

plot = win.addPlot(title='商品销量对比')

# 设置柱子的位置

x = np.arange(len(categories))

# 设置柱子的宽度

width = 0.6

# 绘制柱状图,设置柱子颜色为绿色

bar = pg.BarGraphItem(x=x, height=sales, width=width, brush='g')

plot.addItem(bar)

# 设置x轴刻度标签为商品类别

plot.setTicks([[(i, cat) for i, cat in enumerate(categories)]])

在BarChartWindow类中,首先创建了一个pg.GraphicsLayoutWidget作为窗口的中心部件,然后在其中添加了一个绘图区域plot。通过np.arange(len(categories))生成了柱子在 x 轴上的位置,设置width = 0.6定义了柱子的宽度,使用pg.BarGraphItem创建柱状图对象bar,并设置其颜色为绿色。最后,通过setTicks方法将 x 轴的刻度标签设置为商品类别,这样就完成了柱状图的绘制。从绘制好的柱状图中,我们可以一目了然地看出不同商品销量的高低差异,例如,从图中可以直接看出橙子的销量最高,葡萄的销量相对较低,方便我们快速获取数据中的关键信息,为决策提供直观依据,比如超市可以根据销量情况调整商品的进货策略 。

(四)多子图绘制

在实际的数据可视化中,常常需要在一个图形窗口中展示多个不同的子图,以便进行对比和分析。下面以实际代码展示在一个图形窗口中创建多个子图的方法,以及如何分别对每个子图进行个性化设置。假设我们要同时展示某公司不同部门的收入和支出情况:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

import numpy as np

# 部门名称

departments = ['销售部', '研发部', '财务部', '市场部']

# 收入数据

revenues = np.array([100, 150, 80, 120])

# 支出数据

expenses = np.array([60, 90, 50, 70])

这里定义了部门名称列表departments,以及各部门的收入数据revenues和支出数据expenses。

接下来创建图形窗口并添加子图:

class MultiPlotWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('公司部门收支情况')

win = pg.GraphicsLayoutWidget(show=True)

self.setCentralWidget(win)

# 添加收入子图

revenue_plot = win.addPlot(row=0, col=0, title='各部门收入')

x = np.arange(len(departments))

width = 0.4

revenue_bar = pg.BarGraphItem(x=x, height=revenues, width=width, brush='b')

revenue_plot.addItem(revenue_bar)

revenue_plot.setTicks([[(i, dep) for i, dep in enumerate(departments)]])

# 添加支出子图

expense_plot = win.addPlot(row=0, col=1, title='各部门支出')

expense_bar = pg.BarGraphItem(x=x + width, height=expenses, width=width, brush='r')

expense_plot.addItem(expense_bar)

expense_plot.setTicks([[(i, dep) for i, dep in enumerate(departments)]])

在MultiPlotWindow类中,创建了一个pg.GraphicsLayoutWidget作为主窗口的中心部件。通过win.addPlot方法分别在第 0 行第 0 列和第 0 行第 1 列添加了两个子图,分别用于展示收入和支出情况。在收入子图中,创建了柱状图对象revenue_bar,颜色设置为蓝色;在支出子图中,创建了柱状图对象expense_bar,颜色设置为红色,并通过x = x + width将支出柱子的位置与收入柱子错开,避免重叠。同时,分别对两个子图的 x 轴刻度标签进行了设置,使其显示为部门名称。这样,通过一个图形窗口中的两个子图,我们可以方便地对比各部门的收入和支出情况,快速了解公司各部门的财务状况,为公司的决策提供有力的数据支持,例如可以根据收支对比情况,合理调整各部门的预算分配 。

四、高级绘图功能探索

(一)3D 绘图

在科学计算和数据分析的前沿领域,数据的维度愈发复杂,二维绘图已难以满足需求,3D 绘图应运而生,成为展示复杂数据的有力工具。PyQtGraph 凭借其强大的功能,为我们提供了丰富的 3D 绘图选项,让我们能够深入探索数据的三维空间结构 。

使用pyqtgraph.opengl模块进行 3D 绘图,其丰富的功能为我们呈现数据提供了多样的视角。以 3D 散点图为例,假设我们有一组表示空间中粒子位置的数据,通过以下代码可以创建一个 3D 散点图:

import pyqtgraph as pg

import pyqtgraph.opengl as gl

import numpy as np

app = pg.mkQApp()

w = gl.GLViewWidget()

w.show()

w.setWindowTitle('3D Scatter Plot')

# 生成数据

n = 1000

x = np.random.normal(size=n)

y = np.random.normal(size=n)

z = np.random.normal(size=n)

pos = np.vstack([x, y, z]).transpose()

color = np.random.rand(n, 4)

scatter = gl.GLScatterPlotItem(pos=pos, color=color, size=0.1)

w.addItem(scatter)

if __name__ == '__main__':

pg.exec()

在这段代码中,首先导入了必要的模块pyqtgraph、pyqtgraph.opengl和numpy。创建了一个GLViewWidget作为 3D 视图窗口,并设置了窗口标题。通过numpy的random.normal函数生成了 1000 个随机的三维坐标点,分别存储在x、y、z数组中,将这些坐标点组合成一个二维数组pos。同时,生成了随机的颜色数据color,用于为每个散点赋予不同的颜色。然后,使用gl.GLScatterPlotItem创建了 3D 散点图对象scatter,设置了散点的位置、颜色和大小,并将其添加到视图窗口w中。最后,通过pg.exec()启动应用程序的事件循环,显示 3D 散点图。运行这段代码,我们可以看到在三维空间中随机分布的散点,每个散点都有独特的颜色,通过鼠标交互(左键拖动旋转场景、中间滚轮拖动平移场景、滚轮缩放场景等),可以从不同角度观察散点的分布情况,深入了解数据在三维空间中的特征 。

对于 3D 曲面图,当我们处理地形数据时,常常需要展示地形的起伏变化。假设我们有一个表示地形高度的二维数组terrain_data,可以使用以下代码创建 3D 曲面图:

import pyqtgraph as pg

import pyqtgraph.opengl as gl

import numpy as np

app = pg.mkQApp()

w = gl.GLViewWidget()

w.show()

w.setWindowTitle('3D Terrain Surface Plot')

# 生成地形数据

x = np.linspace(-10, 10, 100)

y = np.linspace(-10, 10, 100)

X, Y = np.meshgrid(x, y)

Z = np.sin(np.sqrt(X ** 2 + Y ** 2))

# 创建颜色映射

colors = pg.ColorMap(pos=np.linspace(Z.min(), Z.max(), 10), color=np.array([

[0, 0, 255, 255],

[0, 255, 0, 255],

[255, 0, 0, 255]

])).getLookupTable(nPts=1000)

# 创建3D曲面图

surface = gl.GLSurfacePlotItem(x=x, y=y, z=Z, colors=colors, shader='shaded', smooth=False)

w.addItem(surface)

if __name__ == '__main__':

pg.exec()

在这段代码中,首先导入相关模块并创建 3D 视图窗口。通过np.linspace生成了在 - 10 到 10 之间均匀分布的 100 个点,分别作为x和y轴的坐标,使用np.meshgrid函数将x和y组合成二维网格,从而得到每个网格点的坐标(X, Y)。通过np.sin(np.sqrt(X ** 2 + Y ** 2))计算出每个网格点的高度值Z,形成地形数据。接着,创建了一个颜色映射colors,根据地形高度值从蓝色到绿色再到红色进行渐变,以直观地展示地形的高低变化。然后,使用gl.GLSurfacePlotItem创建 3D 曲面图对象surface,设置了曲面的x、y、z坐标数据、颜色、着色方式和光滑度等参数,并将其添加到视图窗口中。运行代码后,通过 3D 曲面图可以清晰地看到地形的起伏情况,不同颜色表示不同的高度区域,配合鼠标交互操作,能够从各个角度全面观察地形的特征,这对于地理信息分析、地质勘探等领域具有重要的应用价值 。

(二)实时数据绘图

在许多实际应用场景中,如工业监控、金融交易数据展示、传感器数据采集等,实时数据绘图至关重要,它能够让我们及时捕捉数据的动态变化,快速做出决策。通过模拟实时数据生成,深入讲解如何实现实时更新绘图,以及在处理实时数据时的优化技巧。

以实时曲线绘制为例,假设我们要实时监测一个模拟传感器的数据变化,每秒采集一次数据,代码实现如下:

import sys

import numpy as np

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

from pyqtgraph.Qt import QtCore

class RealTimeCurve(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('实时曲线绘制')

self.setGeometry(100, 100, 800, 600)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

self.curve = self.plot_widget.plot(pen='r')

self.data = np.zeros(100)

self.timer = QtCore.QTimer()

self.timer.timeout.connect(self.update_data)

self.timer.start(1000) # 每秒触发一次

def update_data(self):

new_data = np.random.randn(1)

self.data = np.roll(self.data, -1)

self.data[-1] = new_data

self.curve.setData(self.data)

if __name__ == '__main__':

app = QApplication(sys.argv)

window = RealTimeCurve()

window.show()

sys.exit(app.exec_())

在上述代码中,首先创建了一个继承自QMainWindow的RealTimeCurve类。在类的构造函数中,设置了窗口的标题和大小,并创建了一个pg.PlotWidget作为绘图区域,将其设置为窗口的中心部件。然后创建了一个空的曲线对象curve,用于后续绘制实时数据。初始化了一个长度为 100 的numpy数组data,用于存储数据,并创建了一个定时器timer,设置其每 1000 毫秒(即 1 秒)触发一次update_data方法。在update_data方法中,通过np.random.randn(1)生成一个新的随机数据点new_data,使用np.roll函数将data数组中的数据向右滚动一位,将新数据点添加到数组的末尾,最后通过self.curve.setData(self.data)更新曲线的数据,从而实现实时曲线的绘制。运行这段代码,我们可以看到随着时间的推移,曲线不断更新,实时展示模拟传感器数据的变化情况 。

对于动态柱状图,假设我们要实时展示不同产品的销量变化,代码如下:

import sys

import numpy as np

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

from pyqtgraph.Qt import QtCore

class RealTimeBarChart(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('动态柱状图')

self.setGeometry(100, 100, 800, 600)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

self.products = ['产品A', '产品B', '产品C', '产品D']

self.bar_items = []

self.data = np.random.randint(10, 50, size=len(self.products))

for i, product in enumerate(self.products):

bar = pg.BarGraphItem(x=[i], height=[self.data[i]], width=0.6, brush=pg.intColor(i))

self.plot_widget.addItem(bar)

self.bar_items.append(bar)

self.timer = QtCore.QTimer()

self.timer.timeout.connect(self.update_data)

self.timer.start(2000) # 每2秒触发一次

def update_data(self):

new_data = np.random.randint(10, 50, size=len(self.products))

for i, bar in enumerate(self.bar_items):

bar.setOpts(height=[new_data[i]])

self.data[i] = new_data[i]

if __name__ == '__main__':

app = QApplication(sys.argv)

window = RealTimeBarChart()

window.show()

sys.exit(app.exec_())

在这段代码中,同样创建了一个继承自QMainWindow的RealTimeBarChart类。在构造函数中,设置了窗口的相关属性,并创建了绘图区域。定义了产品列表products和初始的销量数据data,通过循环为每个产品创建一个柱状图对象bar,设置其位置、高度、宽度和颜色,并添加到绘图区域中,同时将这些柱状图对象存储在bar_items列表中。创建了一个定时器timer,每 2 秒触发一次update_data方法。在update_data方法中,生成新的销量数据new_data,通过循环更新每个柱状图的高度,从而实现动态柱状图的实时更新。运行代码后,我们可以实时观察到不同产品销量的动态变化,及时了解市场情况 。

在处理实时数据绘图时,为了提高性能和效率,可以采用以下优化技巧:使用numpy数组进行数据存储和处理,因为numpy数组在内存管理和计算速度上具有优势;减少不必要的绘图操作,例如避免在每次数据更新时都重新绘制整个图形,而是只更新变化的部分;合理设置定时器的时间间隔,避免过于频繁的数据更新导致绘图卡顿;对于大量实时数据,可以采用缓存机制,将已处理的数据缓存起来,减少重复计算;如果硬件支持,可以启用 OpenGL 加速,将绘图操作委托给 GPU 进行处理,显著提高绘图性能 。

(三)数据交互操作

在数据可视化过程中,实现与绘图的交互操作能够让用户更深入地探索数据,挖掘数据背后的信息。PyQtGraph 提供了丰富的鼠标和键盘交互功能,使我们能够与绘制的图形进行灵活互动,包括平移、缩放、选择数据点以及快捷键操作等,并且可以方便地捕获和处理这些交互事件 。

在绘图中实现鼠标交互,以 2D 绘图为例,PyQtGraph 中大多数 2D 可视化遵循常见的鼠标交互规则。左键主要用于与场景中的项目进行交互,如选择或移动对象等。如果鼠标光标下没有可移动对象,使用左键拖动将平移场景。例如,在一个折线图中,当我们需要查看图形不同区域的详细数据时,可以通过左键拖动来平移图形,使感兴趣的部分位于视野中心 。右键拖动用于缩放场景,左 / 右拖动实现水平缩放,垂直向上 / 向下拖动实现垂直缩放。在一些场景中,x/y 轴的比例可能会锁定在一起,此时缩放操作会同时影响两个轴。如果场景中有 x/y 轴不可见,在轴上向右拖动将仅影响该轴。例如,在一个展示股票价格走势的折线图中,我们可以通过右键拖动来放大或缩小时间轴,以便更清晰地观察短期或长期的价格变化趋势 。右键单击在大多数情况下会显示一个上下文菜单,其中包含各种选项,具体选项会根据鼠标光标下的对象而有所不同。通过上下文菜单,我们可以进行诸如启用 / 禁用自动缩放、链接多个视图的轴、启用和禁用鼠标与每个轴的交互以及明确设置可见范围值等操作 。中间按钮(或滚轮)拖动在按下滚轮的情况下拖动鼠标将始终平移场景,这在场景中其他对象阻止使用左按钮进行平移的情况下非常有用。中轮滚动用于放大和缩小场景。对于一些使用右侧或中间按钮拖动困难的机器(通常是 Mac),还存在另一种鼠标交互模式,使用鼠标左键拖动会在场景的某个区域上绘制一个框,释放按钮后,场景将缩放并平移以适合该框。可以在上下文菜单中或通过调用pyqtgraph.setConfigOption('leftButtonPan', False)来访问此模式 。

实现键盘交互,PyQtGraph 支持通过键盘快捷键进行操作。例如,在 3D 绘图中,箭头键可以围绕中心点旋转场景,就像拖动鼠标左键一样,方便用户通过键盘快速调整视图角度,从不同方向观察 3D 图形。通过捕获和处理这些交互事件,我们可以根据用户的操作做出相应的响应。以选择数据点为例,当用户点击某个数据点时,我们可以捕获这个点击事件,获取被点击的数据点的坐标和其他相关信息,并进行进一步的分析或展示。在一个散点图中,当用户点击某个散点时,我们可以弹出一个提示框,显示该散点对应的具体数据值,帮助用户更直观地了解数据 。

在实际应用中,假设我们有一个包含多个数据系列的绘图,我们可以通过鼠标交互选择其中一个数据系列,然后通过键盘快捷键对其进行特定的操作,如单独放大该数据系列、隐藏或显示该数据系列等。通过这种灵活的数据交互操作,用户能够根据自己的需求对数据进行个性化的探索和分析,提高数据可视化的效果和价值 。

(四)复杂图形组合

在实际的数据可视化项目中,常常需要将多种绘图类型组合在一个复杂图形中,以更全面、直观地展示数据之间的关系和特征。同时,添加注释、图例等元素能够增强图形的可读性和信息传达能力。以一个综合示例来展示这一过程,假设我们要分析某电商平台的销售数据,包括不同商品类别的销售额、销售量以及客户评价得分。我们可以将折线图、散点图和柱状图组合在一起,同时添加注释和图例,代码如下:

import sys

import numpy as np

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

class ComplexGraph(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('电商销售数据分析')

self.setGeometry(100, 100, 1000, 800)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

# 准备数据

categories = ['电子产品', '服装', '食品', '家居用品']

sales_amount = np.array([15000, 12000, 8000, 10000])

sales_quantity = np.array([500, 800, 1200, 600])

ratings = np.array([4.5, 4.2, 3.8, 4.0])

# 绘制柱状图 - 销售额

bar_x = np.arange(len(categories))

bar_width = 0.3

bar1 = pg.BarGraphItem(x=bar_x, height=sales_amount, width=bar_width, brush='b', name='销售额')

self.plot_widget.addItem(bar1)

# 绘制柱状图 - 销售量

bar2 = pg.BarGraphItem(x=bar_x + bar_width, height=sales_quantity, width=bar_width, brush='g', name='销售量')

self.plot_widget.addItem(bar2)

# 绘制散点图 - 评价得分

scatter_x = bar_x + bar_width / 2

scatter = pg.ScatterPlotItem(x=scatter_x, y=ratings, symbol='o', size=10, brush='r', name='评价得分')

self.plot_widget.addItem(scatter)

# 添加注释

for i, cat in enumerate(categories):

self.plot_widget.addItem(pg.TextItem(cat, anchor=(0.5, 1.0), color='k',

pos=(bar_x[i] + bar_width / 2, -100)))

# 添加图例

self.plot_widget.addLegend()

# 设置坐标轴标签

self.plot_widget.setLabel('left', '金额/数量')

self.plot_widget.setLabel('bottom', '商品类别')

if __name__ == '__main__':

app = QApplication(sys.argv)

window = ComplexGraph()

window.show()

sys.exit(app.exec_())

在上述代码中,首先创建了一个继承自QMainWindow的ComplexGraph类。在类的构造函数中,设置了窗口的标题和大小,并创建了一个pg.PlotWidget作为绘图区域,将其设置为窗口的中心部件。然后准备了商品类别、销售额、销售量和评价得分的数据。通过pg.BarGraphItem分别创建了表示销售额和销售量的柱状图,设置了不同的颜色和位置,以区分两个数据系列。使用pg.ScatterPlotItem创建了表示评价得分的散点图

五、PyQtGraph 在实际项目中的应用案例

(一)科学研究中的数据可视化

在科学研究的广袤领域中,数据可视化是洞察实验结果、揭示科学规律的关键手段。PyQtGraph 以其卓越的性能和丰富的功能,成为科研人员不可或缺的得力助手,在物理学、生物学等众多学科中发挥着重要作用。

在物理学实验中,常常会产生海量的数据,这些数据蕴含着物质的奥秘和物理规律。以高能物理实验为例,探测器会在极短的时间内收集到大量的粒子碰撞数据,包括粒子的能量、动量、飞行轨迹等信息。科研人员使用 PyQtGraph,能够将这些复杂的数据以直观的方式呈现出来。通过绘制 3D 散点图,可以清晰地展示粒子在三维空间中的分布情况,帮助研究人员分析粒子的产生机制和相互作用过程;利用折线图和柱状图,可以对比不同实验条件下物理量的变化趋势,从而验证理论模型或发现新的物理现象。在大型强子对撞机(LHC)的实验数据分析中,科研团队使用 PyQtGraph 将探测器收集到的海量数据转化为各种可视化图形,通过对这些图形的深入分析,成功发现了希格斯玻色子,这一重大成果离不开 PyQtGraph 在数据可视化方面的有力支持 。

生物学研究中,数据分析同样至关重要。例如,在基因表达数据分析中,研究人员需要处理大量的基因表达数据,以揭示基因在不同组织、不同发育阶段的表达模式和调控机制。PyQtGraph 可以将基因表达数据以热图的形式展示出来,通过不同的颜色表示基因表达水平的高低,使得研究人员能够一目了然地观察到基因表达的差异和变化趋势。同时,结合散点图和折线图,可以分析基因表达与其他生物学指标之间的相关性,为深入研究基因功能和疾病机制提供重要线索。在癌症研究中,科研人员利用 PyQtGraph 对肿瘤组织和正常组织的基因表达数据进行可视化分析,发现了与癌症发生发展密切相关的关键基因,为癌症的诊断和治疗提供了新的靶点和思路 。

(二)工业自动化中的监控系统

在工业自动化的浪潮中,实时监控设备状态和生产数据对于保障生产效率、提高产品质量、确保安全生产至关重要。PyQtGraph 凭借其强大的实时数据处理和可视化能力,成为构建工业监控系统的理想选择,广泛应用于制造业、能源、化工等多个行业 。

在制造业中,生产线上的各种设备如机床、机器人等,需要实时监控其运行状态,包括温度、压力、振动等参数。PyQtGraph 可以与传感器和数据采集系统相结合,实时获取设备的运行数据,并以直观的图表形式展示出来。通过折线图可以实时显示设备温度的变化趋势,一旦温度超出正常范围,系统可以立即发出警报,提醒操作人员采取相应措施,避免设备因过热而损坏;利用柱状图可以对比不同设备的运行参数,帮助管理人员及时发现设备之间的差异,进行优化调整,提高生产效率。在汽车制造企业中,通过 PyQtGraph 构建的监控系统,能够实时监控生产线各环节的设备状态和生产数据,确保汽车零部件的加工精度和装配质量,有效减少次品率,提高企业的经济效益 。

在能源行业,如石油化工、电力等领域,生产过程涉及高温、高压、易燃易爆等危险因素,对安全生产要求极高。PyQtGraph 在这些行业的监控系统中发挥着重要作用。以石油化工为例,通过实时采集和可视化反应釜的温度、压力、液位等参数,操作人员可以及时了解生产过程的运行状况,对异常情况进行快速响应,防止事故的发生。同时,结合历史数据的分析,还可以预测设备的故障风险,提前进行维护保养,保障生产的连续性和稳定性。在电力系统中,利用 PyQtGraph 可以实时展示电网的电压、电流、功率等参数,帮助调度人员合理分配电力资源,保障电网的安全稳定运行 。

(三)金融数据分析与可视化

在金融领域,数据瞬息万变,准确、及时地分析和可视化金融数据对于投资者、金融机构和监管部门至关重要。PyQtGraph 以其高效的绘图能力和丰富的交互功能,为金融数据分析提供了强大的支持,助力金融从业者做出明智的决策 。

在股票市场中,股票价格走势和成交量是投资者关注的核心数据。PyQtGraph 可以通过实时获取股票交易数据,绘制出股票价格的 K 线图和成交量的柱状图。K 线图以其独特的方式展示了股票的开盘价、收盘价、最高价和最低价,通过不同颜色的 K 线表示股价的涨跌,投资者可以直观地了解股票价格的短期波动和长期趋势。成交量柱状图则反映了股票交易的活跃程度,与 K 线图相结合,可以帮助投资者判断市场的买卖力量和趋势的持续性。同时,PyQtGraph 还支持对股票数据进行技术分析指标的计算和可视化,如移动平均线、MACD 等,这些指标可以为投资者提供更多的决策依据。在股票投资中,投资者可以利用 PyQtGraph 构建自己的股票分析系统,实时跟踪股票价格走势和市场动态,及时调整投资策略,提高投资收益 。

投资组合管理中,风险可视化是关键环节。投资者需要了解投资组合中不同资产的风险分布和相关性,以便合理配置资产,降低投资风险。PyQtGraph 可以通过绘制风险矩阵图、相关系数矩阵图等,直观地展示投资组合的风险状况。风险矩阵图将风险分为不同的等级,通过颜色和位置表示投资组合中不同资产的风险水平,帮助投资者快速识别高风险资产;相关系数矩阵图则展示了不同资产之间的相关性,通过颜色的深浅表示相关性的强弱,投资者可以根据相关性分析结果,选择相关性较低的资产进行组合,实现风险的分散。在大型投资机构中,利用 PyQtGraph 进行投资组合风险可视化分析,能够帮助投资经理更好地管理投资组合,优化资产配置,提高投资组合的风险调整后收益 。

六、深入挖掘 PyQtGraph 例子库的技巧

(一)定制化绘图样式

在使用 PyQtGraph 进行数据可视化时,定制化绘图样式是提升图形表现力和可读性的关键环节。通过合理调整绘图的背景颜色、前景颜色、字体样式以及坐标轴样式等,可以使图形更加贴合具体的应用场景和用户需求,从而更有效地传达数据信息。

修改绘图的背景颜色是最基本的定制化操作之一。PyQtGraph 提供了多种方式来实现这一功能。在创建绘图区域时,可以直接通过pg.PlotWidget的构造函数来设置背景颜色,例如self.pw = pg.PlotWidget(background='w'),这里将背景颜色设置为白色,其中'w'是颜色的单字母表示法,基于 matplotlib 中使用的标准颜色,类似的还有'r'表示红色、'g'表示绿色等。也可以在绘图区域创建后,通过调用setBackground方法来修改背景颜色,如self.pw.setBackground((100, 50, 255)),这种方式传入的是一个 RGB 元组,分别表示红、绿、蓝三种颜色通道的强度,取值范围是 0 - 255,这里设置的背景颜色为一种紫色调。除了 RGB 元组,还可以使用十六进制符号来设置更复杂的颜色,例如self.pw.setBackground('#bbccaa'),这种方式在需要精确控制颜色时非常有用。如果在应用程序的其他地方已经使用了特定的Qt.QColor对象,也可以直接将其传入setBackground方法,如from PyQt5.QtGui import QColor; self.pw.setBackground(QColor(100, 50, 254, 25)),这在保持整个应用程序颜色风格一致性时非常方便。

前景颜色主要影响绘图中的线条、文本、坐标轴刻度等元素的颜色。通过pg.setConfigOption('foreground', 'black')可以全局设置前景颜色为黑色,这样绘图中的所有相关元素都会以黑色显示。对于坐标轴上的刻度标签和文本,也可以单独设置其颜色和字体样式。以设置左侧坐标轴标签为例,首先获取坐标轴对象left_axis = self.pw.getPlotItem().getAxis('left'),然后通过labelStyle = {'color': '#000', 'font-size': '12pt'}定义标签样式,其中'color'设置颜色为黑色,'font-size'设置字体大小为 12 磅,最后使用left_axis.setLabel('y轴', units='y轴单位', **labelStyle)来应用这些样式,这样左侧坐标轴的标签就会以指定的颜色和字体大小显示。

坐标轴样式的定制化可以进一步增强图形的可读性。可以设置坐标轴的线条颜色、宽度和样式。通过创建一个QPen对象来设置坐标轴的线条属性,例如pen = pg.mkPen('b', width = 2, style = QtCore.Qt.DashLine),这里创建了一个蓝色、宽度为 2 像素、样式为虚线的画笔,然后使用left_axis.setPen(pen)将其应用到左侧坐标轴上,这样坐标轴的线条就会呈现出指定的样式。还可以设置坐标轴的范围、刻度间隔等。使用self.pw.setXRange(0, 10)和self.pw.setYRange(0, 100)可以分别设置 x 轴和 y 轴的显示范围,使用self.pw.setTicks([[(i, str(i)) for i in range(0, 11, 2)]])可以自定义 x 轴的刻度标签,这里设置 x 轴刻度从 0 到 10,间隔为 2,并将刻度标签设置为对应的数值字符串 。

(二)扩展和修改示例代码

在实际应用中,PyQtGraph 例子库中的示例代码往往需要根据具体需求进行扩展和修改,以满足不同的业务场景和数据处理要求。以 “实时数据绘图” 示例中的实时曲线绘制为例,原始示例代码主要实现了每秒生成一个随机数据点并更新曲线的功能。假设我们要在这个基础上添加数据滤波功能,以平滑曲线的波动,同时增加一个暂停 / 继续按钮来控制数据的实时更新。

首先,添加数据滤波功能。我们可以使用简单的移动平均滤波算法,在update_data方法中对新生成的数据进行滤波处理。定义一个移动平均滤波器的窗口大小,例如window_size = 5,表示取最近 5 个数据点的平均值作为滤波后的数据。在update_data方法中,修改代码如下:

def update_data(self):

new_data = np.random.randn(1)

self.data = np.roll(self.data, -1)

self.data[-1] = new_data

# 数据滤波

filtered_data = np.convolve(self.data, np.ones(window_size)/window_size, mode='valid')

if len(filtered_data) > 0:

self.curve.setData(filtered_data)

这里使用np.convolve函数进行卷积操作,实现移动平均滤波。np.ones(window_size)/window_size创建了一个长度为window_size,元素都为1/window_size的数组,作为滤波器的权重。mode='valid'表示只计算完全重叠部分的卷积结果,这样得到的filtered_data就是滤波后的数据,然后使用self.curve.setData(filtered_data)更新曲线。

接着,添加暂停 / 继续按钮。在类的构造函数中创建按钮并绑定相应的槽函数:

def __init__(self):

super().__init__()

self.setWindowTitle('实时曲线绘制')

self.setGeometry(100, 100, 800, 600)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

self.curve = self.plot_widget.plot(pen='r')

self.data = np.zeros(100)

self.timer = QtCore.QTimer()

self.timer.timeout.connect(self.update_data)

self.timer.start(1000) # 每秒触发一次

# 创建暂停/继续按钮

self.pause_button = QtWidgets.QPushButton('暂停', self)

self.pause_button.setGeometry(10, 10, 80, 30)

self.pause_button.clicked.connect(self.pause_or_resume)

self.is_paused = False

在pause_or_resume槽函数中实现暂停和继续的逻辑:

def pause_or_resume(self):

if self.is_paused:

self.timer.start(1000)

self.pause_button.setText('暂停')

self.is_paused = False

else:

self.timer.stop()

self.pause_button.setText('继续')

self.is_paused = True

通过这样的扩展和修改,原始的实时曲线绘制示例不仅增加了数据滤波功能,使曲线更加平滑,便于观察数据趋势,还添加了暂停 / 继续按钮,增强了用户与图形的交互性,满足了更复杂的实际需求 。

(三)与其他库结合使用

PyQtGraph 强大的功能在与其他优秀的 Python 库结合使用时,能够发挥出更大的威力,实现更复杂、更强大的数据可视化和分析功能。以下展示 PyQtGraph 与 pandas(数据处理)、scikit - learn(机器学习)等库结合使用的示例。

当 PyQtGraph 与 pandas 结合时,pandas 提供了高效的数据读取、清洗、处理和分析功能,而 PyQtGraph 则专注于数据的可视化展示。假设我们有一个存储在 CSV 文件中的销售数据,包含日期、产品名称、销售量和销售额等字段。首先使用 pandas 读取数据:

import pandas as pd

data = pd.read_csv('sales_data.csv')

然后对数据进行处理,例如计算每个产品的销售总量和销售总额:

product_summary = data.groupby('产品名称').agg({'销售量':'sum', '销售额':'sum'}).reset_index()

接下来,使用 PyQtGraph 绘制柱状图展示每个产品的销售总额:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

import numpy as np

class SalesBarChart(QMainWindow):

def __init__(self, data):

super().__init__()

self.setWindowTitle('产品销售总额柱状图')

self.setGeometry(100, 100, 800, 600)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

products = product_summary['产品名称'].tolist()

sales_amount = product_summary['销售额'].tolist()

bar_x = np.arange(len(products))

bar_width = 0.6

bar = pg.BarGraphItem(x=bar_x, height=sales_amount, width=bar_width, brush='b')

self.plot_widget.addItem(bar)

self.plot_widget.setTicks([[(i, product) for i, product in enumerate(products)]])

if __name__ == '__main__':

app = QApplication(sys.argv)

window = SalesBarChart(data)

window.show()

sys.exit(app.exec_())

通过这种方式,利用 pandas 对销售数据进行高效处理,提取出关键信息,再借助 PyQtGraph 将处理后的数据以直观的柱状图形式展示出来,使数据的分析结果一目了然 。

在机器学习领域,scikit - learn 提供了丰富的机器学习算法和工具,PyQtGraph 则可以将模型的训练结果、数据分布等信息进行可视化展示。以逻辑回归模型的训练为例,首先使用 scikit - learn 创建数据集并训练逻辑回归模型:

from sklearn.datasets import make_classification

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import train_test_split

# 创建分类数据集

X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练逻辑回归模型

model = LogisticRegression()

model.fit(X_train, y_train)

然后,使用 PyQtGraph 绘制散点图展示训练数据的分布,并绘制决策边界:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow

import pyqtgraph as pg

import numpy as np

class LogisticRegressionVisualization(QMainWindow):

def __init__(self, X, y, model):

super().__init__()

self.setWindowTitle('逻辑回归模型可视化')

self.setGeometry(100, 100, 800, 600)

self.plot_widget = pg.PlotWidget()

self.setCentralWidget(self.plot_widget)

scatter = pg.ScatterPlotItem(x=X[:, 0], y=X[:, 1], symbol='o', size=10, brush=[pg.intColor(i) for i in y])

self.plot_widget.addItem(scatter)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1

y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))

Z = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

Z = Z.reshape(xx.shape)

contour = pg.ImageItem(Z, axisOrder='row-major')

self.plot_widget.addItem(contour)

self.plot_widget.setAspectLocked(True)

if __name__ == '__main__':

app = QApplication(sys.argv)

window = LogisticRegressionVisualization(X, y, model)

window.show()

sys.exit(app.exec_())

在这个示例中,利用 scikit - learn 生成分类数据集并训练逻辑回归模型,然后通过 PyQtGraph 绘制散点图展示数据点的分布情况,并用颜色区分不同的类别。同时,通过计算模型在网格点上的预测概率,绘制出决策边界,以图像的形式直观地展示逻辑回归模型的分类效果,帮助用户更好地理解模型的性能和数据的特征 。

七、总结与展望

PyQtGraph 例子库犹如一座蕴含无尽宝藏的知识殿堂,为我们打开了数据可视化的全新大门。通过对其深入探索,我们领略到了它在基础绘图、高级绘图以及实际项目应用中的强大功能。从简单的折线图、散点图到复杂的 3D 绘图、实时数据绘图,PyQtGraph 例子库都提供了丰富的示例代码,这些代码就像一个个生动的指南,让我们能够轻松掌握各种绘图技巧,快速实现数据的可视化展示 。

在实际项目中,PyQtGraph 例子库更是发挥了不可替代的作用。在科学研究领域,它助力科研人员将复杂的实验数据转化为直观的图形,从而发现数据背后隐藏的科学规律;在工业自动化中,为监控系统提供了实时、准确的数据可视化支持,保障了生产的高效与安全;在金融领域,帮助分析师和投资者实时跟踪市场动态,做出明智的决策 。

展望未来,随着科技的不断发展,数据可视化的需求将愈发旺盛且多样化。我们期待 PyQtGraph 能够进一步优化性能,提升在处理超大规模数据和复杂场景时的表现,以满足不断增长的数据量和复杂的业务需求。在功能方面,希望能够增加更多新颖的绘图类型和交互方式,例如结合虚拟现实(VR)或增强现实(AR)技术,为用户提供更加沉浸式的数据可视化体验,让用户能够在虚拟环境中更直观地探索和分析数据 。同时,也期望 PyQtGraph 能与更多的前沿技术和热门库进行深度融合,如与深度学习框架结合,实现对模型训练过程和结果的可视化分析,为人工智能领域的发展提供更强大的支持 。对于广大开发者而言,PyQtGraph 例子库是一个持续学习和创新的宝库,鼓励大家不断深入挖掘其潜力,将其应用到更多的领域和项目中,共同推动数据可视化技术的发展与进步 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空云风语

人工智能,深度学习,神经网络

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值