def METHOD_NAME(self, x, y):
    """Perform picking
    :param float x: X coordinates in plot data frame
    :param float y: Y coordinates in plot data frame
    :return: List of picked data point indices
    :rtype: Union[List[int],None]
    """
    if (x < self.xMin or x > self.xMax or
            y < self.yMin or y > self.yMax):
        return None
    xPts, yPts = self.__x_y_color[:2]
    if self.__picking_triangles is None:
        self.__picking_triangles = numpy.zeros(
            self.__triangles.shape + (3,), dtype=numpy.float32)
        self.__picking_triangles[:, :, 0] = xPts[self.__triangles]
        self.__picking_triangles[:, :, 1] = yPts[self.__triangles]
    segment = numpy.array(((x, y, -1), (x, y, 1)), dtype=numpy.float32)
    # Picked triangle indices
    indices = glutils.segmentTrianglesIntersection(
        segment, self.__picking_triangles)[0]
    # Point indices
    indices = numpy.unique(numpy.ravel(self.__triangles[indices]))
    # Sorted from furthest to closest point
    dists = (xPts[indices] - x) ** 2 + (yPts[indices] - y) ** 2
    indices = indices[numpy.flip(numpy.argsort(dists), axis=0)]
    return tuple(indices) if len(indices) > 0 else None