def _create_path(item, path): ppath = QPainterPath() if item.node.is_leaf: ppath.addRect(path.boundingRect().adjusted(-8, -4, 0, 4)) else: ppath.addPolygon(path) ppath = path_outline(ppath, width=-8) return ppath
def violin_shape(x, p): # type: (Sequence[float], Sequence[float]) -> QPainterPath points = [QPointF(pi, xi) for xi, pi in zip(x, p)] points += [QPointF(-pi, xi) for xi, pi in reversed(list(zip(x, p)))] poly = QPolygonF(points) path = QPainterPath() path.addPolygon(poly) return path
def _contains_point(item: pg.FillBetweenItem, point: QPointF) -> bool: curve1, curve2 = item.curves x_data_lower, y_data_lower = curve1.curve.getData() x_data_upper, y_data_upper = curve2.curve.getData() pts = [QPointF(x, y) for x, y in zip(x_data_lower, y_data_lower)] pts += [QPointF(x, y) for x, y in reversed(list(zip(x_data_upper, y_data_upper)))] pts += pts[:1] path = QPainterPath() path.addPolygon(QPolygonF(pts)) return path.contains(point)
def arrow_path_concave(line, width): # type: (QLineF, float) -> QPainterPath """ Return a :class:`QPainterPath` of a pretty looking arrow. """ path = QPainterPath() p1, p2 = line.p1(), line.p2() if p1 == p2: return path baseline = QLineF(line) # Require some minimum length. baseline.setLength(max(line.length() - width * 3, width * 3)) start, end = baseline.p1(), baseline.p2() mid = (start + end) / 2.0 normal = QLineF.fromPolar(1.0, baseline.angle() + 90).p2() path.moveTo(start) path.lineTo(start + (normal * width / 4.0)) path.quadTo(mid + (normal * width / 4.0), end + (normal * width / 1.5)) path.lineTo(end - (normal * width / 1.5)) path.quadTo(mid - (normal * width / 4.0), start - (normal * width / 4.0)) path.closeSubpath() arrow_head_len = width * 4 arrow_head_angle = 50 line_angle = line.angle() - 180 angle_1 = line_angle - arrow_head_angle / 2.0 angle_2 = line_angle + arrow_head_angle / 2.0 points = [p2, p2 + QLineF.fromPolar(arrow_head_len, angle_1).p2(), baseline.p2(), p2 + QLineF.fromPolar(arrow_head_len, angle_2).p2(), p2] poly = QPolygonF(points) path_head = QPainterPath() path_head.addPolygon(poly) path = path.united(path_head) return path
def arrow_path_concave(line, width): """ Return a :class:`QPainterPath` of a pretty looking arrow. """ path = QPainterPath() p1, p2 = line.p1(), line.p2() if p1 == p2: return path baseline = QLineF(line) # Require some minimum length. baseline.setLength(max(line.length() - width * 3, width * 3)) start, end = baseline.p1(), baseline.p2() mid = (start + end) / 2.0 normal = QLineF.fromPolar(1.0, baseline.angle() + 90).p2() path.moveTo(start) path.lineTo(start + (normal * width / 4.0)) path.quadTo(mid + (normal * width / 4.0), end + (normal * width / 1.5)) path.lineTo(end - (normal * width / 1.5)) path.quadTo(mid - (normal * width / 4.0), start - (normal * width / 4.0)) path.closeSubpath() arrow_head_len = width * 4 arrow_head_angle = 50 line_angle = line.angle() - 180 angle_1 = line_angle - arrow_head_angle / 2.0 angle_2 = line_angle + arrow_head_angle / 2.0 points = [p2, p2 + QLineF.fromPolar(arrow_head_len, angle_1).p2(), baseline.p2(), p2 + QLineF.fromPolar(arrow_head_len, angle_2).p2(), p2] poly = QPolygonF(points) path_head = QPainterPath() path_head.addPolygon(poly) path = path.united(path_head) return path
def _create_violin(self, data: np.ndarray) -> Tuple[QPainterPath, float]: if self.__kde is None: x, p, max_density = np.zeros(1), np.zeros(1), 0 else: x = np.linspace(data.min() - self.__bandwidth * 2, data.max() + self.__bandwidth * 2, 1000) p = np.exp(self.__kde.score_samples(x.reshape(-1, 1))) max_density = p.max() p = scale_density(self.__scale, p, len(data), max_density) if self.__orientation == Qt.Vertical: pts = [QPointF(pi, xi) for xi, pi in zip(x, p)] pts += [QPointF(-pi, xi) for xi, pi in reversed(list(zip(x, p)))] else: pts = [QPointF(xi, pi) for xi, pi in zip(x, p)] pts += [QPointF(xi, -pi) for xi, pi in reversed(list(zip(x, p)))] pts += pts[:1] polygon = QPolygonF(pts) path = QPainterPath() path.addPolygon(polygon) return path, max_density
def arrow_path_plain(line, width): """ Return an :class:`QPainterPath` of a plain looking arrow. """ path = QPainterPath() p1, p2 = line.p1(), line.p2() if p1 == p2: return path baseline = QLineF(line) # Require some minimum length. baseline.setLength(max(line.length() - width * 3, width * 3)) path.moveTo(baseline.p1()) path.lineTo(baseline.p2()) stroker = QPainterPathStroker() stroker.setWidth(width) path = stroker.createStroke(path) arrow_head_len = width * 4 arrow_head_angle = 50 line_angle = line.angle() - 180 angle_1 = line_angle - arrow_head_angle / 2.0 angle_2 = line_angle + arrow_head_angle / 2.0 points = [ p2, p2 + QLineF.fromPolar(arrow_head_len, angle_1).p2(), p2 + QLineF.fromPolar(arrow_head_len, angle_2).p2(), p2, ] poly = QPolygonF(points) path_head = QPainterPath() path_head.addPolygon(poly) path = path.united(path_head) return path