(03.18) 수정됨.
다음은 pyqtgraph의 plot function 코드다.
# pyqtgraph/__init__.py
def plot(*args, **kargs):
mkQApp()
pwArgList = ['title', 'labels', 'name', 'left', 'right', 'top', 'bottom', 'background']
pwArgs, dataArgs = ({}, {})
for k in kargs:
if k in pwArgList: pwArgs[k] = kargs[k]
else: dataArgs[k] = kargs[k]
windowTitle = pwArgs.pop("title", "PlotWidget")
w = PlotWidget(**pwArgs)
w.setWindowTitle(windowTitle)
if len(args) > 0 or len(dataArgs) > 0: w.plot(*args, **dataArgs)
plots.append(w)
w.show()
return w
pyqtgraph.plot() 함수를 실행하면 plotwidget return하므로 위젯을 얻은 다음, .addItem() method로 위젯에 그래프를 추가할 수 있다.
PlotItem의 경우 PlotItem과 PlotDataItem 2개가 존재하는데, PlotDataItem을 사용해야 한다. PlotItem을 사용하는 방법은 모르겠다.
TypeError: QGraphicsWidget(parent: Optional[QGraphicsItem] = None, flags: Qt.WindowType = Qt.WindowFlags()): argument 1 has unexpected type 'list'
import pyqtgraph as pg
line = [10, 15, 12, 14, 11]
bar = [3, 2, 5, 9, 6]
widget = pg.plot(title='line with bar')
line = pg.PlotDataItem(line)
widget.addItem(line)
bar = pg.BarGraphItem(x=range(len(bar)), width=0.4, height=bar)
widget.addItem(bar)
pg.exec()
![]()
pyqtgraph 공식문서에서는 위젯에 그래프를 추가하는 방법을 다음과 같이 설명하고 있는데, vscode의 pylance가 plotWidget에서 plot이란 method를 찾지 못한다.
https://pyqtgraph.readthedocs.io/en/latest/getting_started/plotting.html
import pyqtgraph as pg
import numpy as np
x = np.arange(1000)
y = np.random.normal(size=(3, 1000))
plotWidget = pg.plot(title="Three plot curves")
for i in range(3):
plotWidget.plot(x, y[i], pen=(i,3)) ## setting pen=(i,3) automaticaly creates three different-colored pens
해당 방법은 .plotItem.plot() method를 사용하는 것과 같은데,
import pyqtgraph as pg
import numpy as np
x = np.arange(1000)
y = np.random.normal(size=(3, 1000))
plotWidget = pg.plot(title="Three plot curves")
for i in range(3):
plotWidget.plotItem.plot(x, y[i], pen=(i,3)) ## setting pen=(i,3) automaticaly creates three different-colored pens
그 이유는 PlotWidget에서 __getattr__ method에서 self.plotItem의 attr을 탐색하여 가져오기 때문인 것으로 보인다.
# pyqtgraph/widgets.py
class PlotWidget(GraphicsView):
...
def __getattr__(self, attr): ## implicitly wrap methods from plotItem
if hasattr(self.plotItem, attr):
m = getattr(self.plotItem, attr)
if hasattr(m, '__call__'):
return m
raise AttributeError(attr)
...