📜  PyQtGraph - 在散点图中获取点的旋转(1)

📅  最后修改于: 2023-12-03 15:33:55.063000             🧑  作者: Mango

PyQtGraph - 在散点图中获取点的旋转

PyQtGraph是一个用于创建丰富交互式界面的Python库,同时提供了高质量的数据可视化工具。其中包括绘制各种类型的图形,如线图、散点图、柱状图等。

在散点图中,我们有时需要获取每个散点的旋转角度。这在很多应用中非常有用,例如机器视觉中的物体识别和追踪,或者在控制工程中的机器人运动控制等。本文将介绍如何使用PyQtGraph获取散点图中点的旋转角度。

首先,我们需要创建一个散点图。假设我们有一组点的坐标和对应的旋转角度:

import pyqtgraph as pg
import numpy as np

app = pg.mkQApp()

# create some random data
pos = np.random.normal(size=(100, 2))
angle = np.random.normal(size=(100,)) * 30

# create the scatter plot
scatter = pg.ScatterPlotItem(pos=pos, size=10, symbol='o', brush='r')
view = pg.PlotWidget()
view.addItem(scatter)
view.show()

上述代码将生成100个随机坐标的点,并为每个点随机分配一个旋转角度,并用红色圆形符号绘制散点图。

接下来,我们需要自定义一个ScatterPlotItem类并重写paint方法,以便在绘制每个点时获取它的旋转角度。具体实现方法如下:

class RotatingScatterPlotItem(pg.ScatterPlotItem):
    def paint(self, painter, option, widget):
        tr = self.deviceTransform(painter)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        size = self.size()  # get size of current point
        brush = self.currentBrush()
        pen = self.currentPen()
        for i in range(self.size()[0]):
            angle = self.data["angle"][i]  # get angle of current point
            painter.save()

            # rotate QPainter coordinates
            center = QtCore.QPointF(0, 0)
            painter.translate(self.pos()[i][0], self.pos()[i][1])
            painter.rotate(angle)

            # set brush, pen, and size, then draw point
            painter.setBrush(brush)
            painter.setPen(pen)
            size = self.size()[1]
            painter.drawEllipse(QtCore.QPointF(0, 0), size, size)

            painter.restore()

上述代码中,我们自定义了一个RotatingScatterPlotItem类,并继承了pyqtgraph中的ScatterPlotItem类。此外,在paint方法中,我们首先获取旋转角度,并根据该角度将绘制坐标系进行旋转。然后,我们根据点的大小和颜色,使用QPainter.drawEllipse方法来绘制旋转后的点。

最后,我们使用新的RotatingScatterPlotItem类来替换之前使用的ScatterPlotItem,并更新散点图:

# replace ScatterPlotItem with RotatingScatterPlotItem
scatter = RotatingScatterPlotItem(pos=pos, size=10, symbol='o', brush='r', data={'angle': angle})
view.addItem(scatter)

上述代码中,我们使用之前生成的点坐标和旋转角度来创建RotatingScatterPlotItem类,同时将这些旋转角度保存在data中,并使用新的类替换之前的ScatterPlotItem类。最后,我们将绘制好的散点图添加到PlotWidget中,调用pg.mkQApp()来启动图形界面,便可以看到每个点都被正确旋转了。

完整代码示例如下:

import pyqtgraph as pg
from PyQt5 import QtGui, QtCore
import numpy as np

# define RotatingScatterPlotItem class
class RotatingScatterPlotItem(pg.ScatterPlotItem):
    def paint(self, painter, option, widget):
        tr = self.deviceTransform(painter)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        size = self.size()  # get size of current point
        brush = self.currentBrush()
        pen = self.currentPen()
        for i in range(self.size()[0]):
            angle = self.data["angle"][i]  # get angle of current point
            painter.save()

            # rotate QPainter coordinates
            center = QtCore.QPointF(0, 0)
            painter.translate(self.pos()[i][0], self.pos()[i][1])
            painter.rotate(angle)

            # set brush, pen, and size, then draw point
            painter.setBrush(brush)
            painter.setPen(pen)
            size = self.size()[1]
            painter.drawEllipse(QtCore.QPointF(0, 0), size, size)

            painter.restore()

app = pg.mkQApp()

# create some random data
pos = np.random.normal(size=(100, 2))
angle = np.random.normal(size=(100,)) * 30

# create the scatter plot
scatter = RotatingScatterPlotItem(pos=pos, size=10, symbol='o', brush='r', data={'angle': angle})
view = pg.PlotWidget()
view.addItem(scatter)
view.show()

# start the event loop
app.exec_()

以上就是如何使用PyQtGraph获取散点图中点的旋转角度的方法。这个技巧在许多相关应用中非常有用,例如在图像处理中寻找物体姿态的方向,或机器人运动控制中的位置反馈等。