我正在尝试在pyqtgraph中绘制史密斯圆图。我想知道是否有剪辑方法 表示虚圆的椭圆项,实半圆为半圆= 1。 这就是我到目前为止所做的:我使用了方法的起始角度和跨度角度 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)
`
答案 0 :(得分:2)
支持剪辑,但可能不是最佳选择。一些可能性:
使用QGraphicsPathItem结合QPainterPath.arcTo绘制没有放射线的弧线。这还允许您向单个项目添加多个弧,而不是添加许多项目,这样可以提高性能。
使用像PlotCurveItem或arrayToQPath之类的东西来手动绘制自己的弧线。如果您使用connect
参数,您将再次能够在单个项目上生成多个单独的弧。
剪辑由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)