Линия клипа Pyqtgraph

Я пытаюсь построить диаграмму Смита в pyqtgraph. Я хотел бы знать, есть ли способ обрезать элементы эллипса, представляющие воображаемые круги с реальным кругом, имеющим радиус = 1. Это то, что я сделал до сих пор: я использовал методы начальный угол e угол угла QGraphicsEllipse, но таким образом начертите также вертикальные и горизонтальные линии круга. В matplotlib есть метод set_clip_path(), знаете ли вы, есть ли что-то подобное в pyqtgraph?

import pyqtgraph as pg

plot = pg.plot()

plot.setAspectLocked()
plot.addLine(y=0)

#vector for real circle
rline = [0.2, 0.5, 1.0, 2.0, 5.0]
#vector for imaginary
xline = [0.2, 0.5, 1, 2, 5]

circle1 = pg.QtGui.QGraphicsEllipseItem(1, -1, -2, 2)
circle1.setPen(pg.mkPen(1))
plot.addItem(circle1)

for r in rline:
    raggio = 1./(1+r)
    circle = pg.QtGui.QGraphicsEllipseItem(1, -raggio, -raggio*2, raggio*2)
    circle.setPen(pg.mkPen(0.2))
    plot.addItem(circle)

for x in xline:
    #printing the imaginary circle
    circle = pg.QtGui.QGraphicsEllipseItem(x + 1, 0, -x*2, x*2)
    circle.setPen(pg.mkPen(0.2))
    circle.setStartAngle(1440)
    circle.setSpanAngle(1440)
    plot.addItem(circle)

РЕДАКТИРОВАТЬ

Это мой окончательный код

plot.setAspectLocked()
plot.setXRange(-1,1, padding = 0)
plot.setYRange(-1,1, padding = 0)
#plot.addLine(y=0)

rline = [0.2, 0.5, 1.0, 2.0, 5.0]
xline = [0.2, 0.5, 1, 2, 5]

circle1 = pg.QtGui.QGraphicsEllipseItem(1, -1, -2, 2)
circle1.setPen(pg.mkPen('w', width=0))
circle1.setFlag(circle1.ItemClipsChildrenToShape)
plot.addItem(circle1)

pathItem = pg.QtGui.QGraphicsPathItem()
path = pg.QtGui.QPainterPath()
path.moveTo(1, 0)

for r in rline:
    raggio = 1./(1+r)
    path.addEllipse(1, -raggio, -raggio*2, raggio*2)

for x in xline:
    path.arcTo(x + 1, 0, -x*2, x*2, 90, -180)
    path.moveTo(1, 0)
    path.arcTo(x + 1, 0, -x*2, -x*2, 270, 180)

pathItem.setPath(path)
pathItem.setPen(pg.mkPen('g', width = 0.2))
pathItem.setParentItem(circle1)

`


person GiovanniPi    schedule 15.12.2014    source источник


Ответы (1)


Отсечение поддерживается, но, вероятно, не лучший вариант. Несколько возможностей:

  1. Используйте QGraphicsPathItem в сочетании с QPainterPath.arcTo для рисования дуг без радиальных линий. Это также позволит вам добавлять несколько дуг к одному элементу, а не добавлять множество элементов, что должно повысить производительность.

  2. Используйте что-то вроде PlotCurveItem или arrayToQPath, чтобы вручную рисовать собственные дуги. Если вы используете аргумент connect, вы снова сможете создать несколько отдельных дуг для одного элемента.

  3. Отсечение обрабатывается Qt; см. QGraphicsItem.itemClipsToShape и QGraphicsItem.itemClipsChildrenToShape. Осторожно: если вы используете это, вы должны установить ширину пера обтравочного объекта на 0 (Qt только частично поддерживает косметические перья с шириной > 0). Пример:

    import pyqtgraph as pg
    plot = pg.plot()
    
    e1 = pg.QtGui.QGraphicsEllipseItem(0, 0, 4, 4)
    # MUST have width=0 here, or use a non-cosmetic pen:
    e1.setPen(pg.mkPen('r', width=0))
    e1.setFlag(e1.ItemClipsChildrenToShape)
    plot.addItem(e1)
    
    e2 = pg.QtGui.QGraphicsEllipseItem(2, 2, 4, 4)
    e2.setPen(pg.mkPen('g'))
    e2.setParentItem(e1)
    
person Luke    schedule 15.12.2014
comment
хорошо, спасибо за варианты. Я попробую их, и я дам вам знать - person GiovanniPi; 16.12.2014
comment
Я использую первый метод, чтобы нарисовать всю линию сетки (реальную часть и воображаемую часть), а затем обрезать весь путь с помощью круга модуля 1. Спасибо - person GiovanniPi; 16.12.2014