'Drawing an arc using pyqtgraph
I need to draw some shapes on the screen using pyqtgraph. I chose pyqtgraph over matplotlib because the former is way faster when a lot of shapes are present. For lines polygons everything is ok, since I can simply plot multiple straight lines. But how can I represent efficiently an arc?
I found out here link that the function pyqtgraph.QtGui.QGraphicsEllipseItem() allows me to draw a full ellipse. But what if I just need an arc of that ellipse?
Solution 1:[1]
Here a solution where you can put two angles in degree and a direction for the arc (clockwise or counter clockwise). You can also put the radius. To translate the arc, you can just add two scalar for the x and y axis.
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_()
Solution 2:[2]
You could compute the position of some points on the arc and display them with a 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_()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | ymmx |
| Solution 2 | ymmx |

