📜  PyQtGraph - 在散点图中获取不透明区域(1)

📅  最后修改于: 2023-12-03 14:45:51.536000             🧑  作者: Mango

PyQtGraph - 在散点图中获取不透明区域

PyQtGraph是一个基于PyQt开发的图形可视化库,提供了各种可以快速构建复杂绘图应用程序的工具和组件。其中之一就是散点图(ScatterPlotItem),可以将数据点在二维平面上绘制出来。

在散点图中,不透明区域的获取是一个比较重要的需求,可以用来进行碰撞检测、区域选择等操作。本文将介绍如何在PyQtGraph中获取散点图的不透明区域。

步骤
  1. 创建散点图

首先需要创建一个散点图,可以使用PyQtGraph中的ScatterPlotItem组件。

import pyqtgraph as pg
import numpy as np

data_x = np.random.normal(size=100)
data_y = np.random.normal(size=100)
sp = pg.ScatterPlotItem(size=10, brush='r')
sp.setData(data_x, data_y)
  1. 获取不透明区域

使用散点图中的pos()方法可以获取每个数据点在屏幕中的坐标,通过QImage的grabWindow()方法可以以左上角为起点截取一定大小区域的屏幕图像,最后使用numpy的mean()方法计算该区域的不透明度(Alpha值),从而获取不透明区域。

view = pg.PlotWidget()
view.addItem(sp)

xmin, ymin = view.getAxis('bottom').range
xmax, ymax = view.getAxis('left').range
view.setGeometry(0, 0, 500, 500)

img = view.grab().toImage()

# 坐标系转换
data_pts = sp.pos()
view_pts = view.getViewBox().mapSceneToView(data_pts)

# 获取不透明区域
alpha = []
for p in view_pts:
    x, y = p
    x -= xmin
    y -= ymin
    qimg = img.copy(x, y, 1, 1)
    bb = qimg.bits()
    bb.setsize(1)
    alpha.append(ord(bb[0]) / 255.0)

alpha_mean = np.mean(alpha)
  1. 显示结果

最后将计算所得的不透明度(Alpha值)绘制到散点图中,高亮显示不透明度大于阈值的数据点。

threshold = 0.5
highlights = [i for i in range(len(alpha)) if alpha[i] > threshold]
sp.setHighlighted(highlights)
结论

本文介绍了在PyQtGraph中获取散点图不透明区域的方法,通过获取散点图在屏幕中的位置、计算截取区域的不透明度从而得到结果。