2014-12-15 3 views
1

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

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) 

EDIT

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

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) 

`

ответ

2

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

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

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

  3. Обрезка осуществляется Qt; см. QGraphicsItem.itemClipsToShape and 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) 
    
+0

ок, спасибо за варианты. Я попробую их, и я дам вам знать – GiovanniPi

+0

Я использую первый метод, чтобы нарисовать всю линию сетки (реальную часть и мнимую часть), а затем скопировать полный путь с кругом модуля 1. спасибо – GiovanniPi