使用pyqtgraph绘制圆弧

Drawing an arc using pyqtgraph

我需要使用 pyqtgraph 在屏幕上绘制一些形状。 我选择 pyqtgraph 而不是 matplotlib 因为前者在存在大量形状时速度更快。 对于线条多边形,一切都很好,因为我可以简单地绘制多条直线。 但是我怎样才能有效地表示弧线呢?

我在这里 发现函数 pyqtgraph.QtGui.QGraphicsEllipseItem() 允许我绘制一个完整的椭圆。 但是,如果我只需要那个椭圆的弧怎么办?

您可以计算弧上某些点的位置并用 PlotCurveItem

显示它们
import pyqtgraph as pg
import numpy as np

from pyqtgraph.Qt import QtCore, QtGui

t= np.arange(0,5*2*np.pi/6 ,0.01)
x = np.sin(t+0.5)
y = np.cos(t+0.5)
win = pg.GraphicsLayoutWidget(show=True, title="Plotting")
win.setFixedSize(500, 500)
p = win.addPlot(title='')
p.setXRange(-1.5, 1.5, padding=0)
p.setYRange(-1.5, 1.5, padding=0)


c = pg.PlotCurveItem(x,y)

p.addItem(c)

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

这是一个解决方案,您可以将两个角的度数和圆弧的方向(顺时针或逆时针)。你也可以把半径。要平移圆弧,您只需为 x 轴和 y 轴添加两个标量即可。

import pyqtgraph as pg
import numpy as np

from pyqtgraph.Qt import QtCore, QtGui

def Get_Points(r, a1, a2, nbPoints,clockwise=True):
    a1_rad = np.radians(a1)
    if a1_rad <0:
        a1_rad += 2 * np.pi
    a2_rad = np.radians(a2)
    if a2_rad <0:
        a2_rad += 2 * np.pi

    if a1_rad > a2_rad:
        if clockwise:
            t= np.linspace( a1_rad,a2_rad, nbPoints)
        else:
            t = np.linspace(a2_rad, a1_rad - 2 * np.pi,nbPoints)
    else:
        if clockwise:
            t= np.linspace(a2_rad, a1_rad,nbPoints)
        else:
            t = np.linspace(a1_rad, a2_rad - 2 * np.pi, nbPoints)
    x = r * np.cos(t)
    y = r * np.sin(t)
    return x, y

win = pg.GraphicsLayoutWidget(show=True, title="Plotting")
win.setFixedSize(500, 500)
p = win.addPlot(title='')
r = 10
a1 = 80
a2 = -200
x,y = Get_Points(r, a1, a2, 1000,clockwise=True)

c = pg.PlotCurveItem(x,y,cl=True)
p.setXRange(-1.5 * r, 1.5 * r, padding=0)
p.setYRange(-1.5 * r, 1.5 * r, padding=0)

p.addItem(c)

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()