我有一个用于音乐和语音分析的 PyQt 加 pyqtgraph 程序,我想绘制 wav 文件的频谱(使用 scipy python 包计算)。我可以在 matplotlib 中完成,但由于 matplotlib 的性能,我需要切换到 pyqtgraph,但我找不到任何一致的方法来将 scipy.signal.spectrogram 的输出绘制到 pyqtgraph
谢谢!
我正在尝试编写一个程序,通过串口从 arduino 获取串行数据,并实时绘制它。我使用 matplotlib 编写了代码,但我希望对结果感到满意,所以我试图让它在 pyqtgraph 上工作(学习如何使用它的资源要少得多)。我的问题是代码显示了一个空图。似乎 _update 仅被调用一次,但是当我将其放入循环中时,图表甚至不显示。
\n\n我编写了一些其他代码来实现我想要的功能,即实时绘制数据,在数据通过阈值后,它在数据上绘制新线,显示线性回归。我从这里得到了一个示例(https://github.com/JaFeKl/joystick_real_time_plot_with_pyqtgraph/blob/master/real_time_plot.py),因为我希望我的代码是可调用的(在函数中,但我无法让它工作.到目前为止,我正在从 python 中生成数据以简化调试
\n\nimport sys\nimport pyqtgraph as pg\nimport pyqtgraph.exporters\nfrom pyqtgraph.Qt import QtGui, QtCore\nimport numpy as np\n\nimport serial\n\n# test\nimport math\nimport time\n\n\nclass Graph(QtGui.QMainWindow):\n def __init__(self, parent=None):\n super(Graph, self).__init__(parent)\n self.n = 3\n self.mainbox = QtGui.QWidget()\n self.setCentralWidget(self.mainbox)\n self.mainbox.setLayout(QtGui.QVBoxLayout())\n\n self.canvas = pg.GraphicsLayoutWidget() # create GrpahicsLayoutWidget obejct \n self.mainbox.layout().addWidget(self.canvas)\n\n # Set up plot\n self.analogPlot = self.canvas.addPlot(title=\'Signal from serial port\')\n self.analogPlot.setYRange(-1,1123) # set axis range\n self.analogPlot.setXRange(-1,1123)\n self.analogPlot.showGrid(x=True, y=True, alpha=0.5) # show Grid\n x_axis = …
Run Code Online (Sandbox Code Playgroud) 我需要在笛卡尔坐标和极坐标中实现两个图。笛卡尔一切都很清楚,但是是否可以在 pyqtgraph 中制作极坐标系?
我使用 PyQtGraph ImageView 来显示多维数据。
向此类 ImageView 添加轴标签和标题的最简单方法是什么?
我尝试将 LabelItem 添加到底层 ViewBox 中。我认为正确定位它需要破解底层布局。这是要走的路,还是有更简单的方法?
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
app = QtGui.QApplication([])
# make ImageView with test data
imv = pg.ImageView()
data = np.fromfunction(lambda i, j: np.sin(i/16)*j/128, (512, 512), dtype=float) \
+ np.random.normal(scale=0.2, size=(512, 512))
imv.setImage(data)
# add label
vbox = imv.getView()
vbox.addItem(pg.LabelItem("this is a nice label"))
imv.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 PyQt5 的 pqytplot 图小部件中添加光标位置的读数。我发现这段代码可以实现我想要的功能,但是在一个独立的窗口中,所有这些都在一个程序文件中:
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
#generate layout
app = QtGui.QApplication([])
win = pg.GraphicsWindow()
label = pg.LabelItem(justify='right')
win.addItem(label)
p1 = win.addPlot(row=1, col=0)
data1 = [n**2 for n in range(100)]
p1.plot(data1, pen="r")
#cross hair
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
p1.addItem(vLine, ignoreBounds=True)
p1.addItem(hLine, ignoreBounds=True)
def mouseMoved(evt):
pos = evt[0] ## using signal proxy turns original arguments into a tuple
if p1.sceneBoundingRect().contains(pos):
mousePoint = p1.vb.mapSceneToView(pos)
index = int(mousePoint.x())
if index > 0 …
Run Code Online (Sandbox Code Playgroud) 我用 pyqtgraph 绘制了一个图表,现在我正在尝试“平滑”图表(而不是锯齿形),(我读到)应该与 一起使用antialias
,但我找不到正确的“位置”以使其工作。
import sys
from PyQt5 import QtWidgets
import pyqtgraph as pg
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.plot()
def plot(self):
self.graphWidget = pg.PlotWidget()
self.setCentralWidget(self.graphWidget)
self.graphWidget.setBackground('w')
pen = pg.mkPen(color=('b'), width=2)
styles = {'color':'r', 'font-size':'15px'}
self.graphWidget.setConfigOptions(antialias=True) # AttributeError: setConfigOptions
self.graphWidget.setLabel('left', 'x-values', **styles)
self.graphWidget.setLabel('bottom', 'y-values', **styles)
x_values = [1, 2, 3, 4, 5]
y_values = [2, 1, 2, 4, 3]
self.graphWidget.plot(x_values, y_values, pen=pen, symbol='o',
symbolSize=8, symbolPen='k', symbolBrush='k')
def main():
app = QtWidgets.QApplication(sys.argv)
main = MainWindow() …
Run Code Online (Sandbox Code Playgroud) 在 PyQtGraph 中创建要添加到 plotItem 的 TextItem 时,我知道可以使用 html 代码格式化文本,但是我想知道如何在通过 TextItem.setText( )?还是我需要销毁/重新创建一个 TextItem?
我在pyqtgraph中找到了MultiplePlotAxes示例,并用另外一个y轴扩展它(参见下面的代码).所以现在右侧有3个y轴.
有没有办法让所有3个y轴从右侧到左侧,以便左侧总共有4个y轴?:
因为例如
ax3 = pg.AxisItem('left')
仅改变标签的方向和轴的刻度,而不改变轴相对于坐标原点的位置.
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
pg.mkQApp()
pw = pg.PlotWidget()
pw.show()
pw.setWindowTitle('pyqtgraph example: MultiplePlotAxes')
p1 = pw.plotItem
p1.setLabels(left='axis 1')
p2 = pg.ViewBox()
p1.showAxis('right')
p1.scene().addItem(p2)
p1.getAxis('right').linkToView(p2)
p2.setXLink(p1)
p1.getAxis('right').setLabel('axis2', color='#0000ff')
p3 = pg.ViewBox()
ax3 = pg.AxisItem('right')
p1.layout.addItem(ax3, 2, 3)
p1.scene().addItem(p3)
p4 = pg.ViewBox()
ax4 = pg.AxisItem('right')
p1.layout.addItem(ax4, 2, 4)
p1.scene().addItem(p4)
ax3.linkToView(p3)
p3.setXLink(p1)
ax3.setZValue(-10000)
ax3.setLabel('axis 3', color='#ff0000')
ax4.linkToView(p4)
p4.setXLink(p1)
ax4.setZValue(-10000)
ax4.setLabel('axis 4', color='#ff5555')
def updateViews():
global p1, p2, …
Run Code Online (Sandbox Code Playgroud) 我使用“滚动图”示例作为pyqtgraph.examples
模板来创建一个图,该图显示了连续的正弦波。现在,我想使用按钮来改变正弦波的幅度。这就是我使用另一种结构的原因(参见下面的代码)。这不起作用,它只绘制静态正弦波。如何使用更新函数绘制连续正弦波?如何使用按钮更改幅度?我已经检查过这个和这个但没有成功。
import sys
from PyQt4 import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
class sinus_wave(QtGui.QWidget):
def __init__(self):
super(sinus_wave, self).__init__()
self.initUI()
def initPlot(self, plots):
a = 10
ptr1 = 30
data1 = a*np.sin(np.linspace(0,30,121))
plots.plot(data1)
timer = pg.QtCore.QTimer()
timer.timeout.connect(lambda: self.update(self,p1 = plots,data1= data1, ptr1 = ptr1))
timer.start(50)
def initUI(self):
IncreaseButton = QtGui.QPushButton("Increase Amplitude")
DecreaseButton = QtGui.QPushButton("Decrease Amplitude")
p1 = pg.PlotWidget()
hbox = QtGui.QVBoxLayout()
hbox.addWidget(p1)
hbox.addWidget(IncreaseButton)
hbox.addWidget(DecreaseButton)
self.initPlot(p1)
self.setLayout(hbox)
self.setGeometry(10, 10, 1000, 600)
self.setWindowTitle('Sinuswave') …
Run Code Online (Sandbox Code Playgroud) 首先,我希望您有耐心,因为我是这类项目的新手,并且我也希望不要问愚蠢的问题。话虽这么说,我的主要目标是为树莓派3创建一个UI,该UI将从电池和太阳能面板中感应电压,电流等。
由于我正在研究树莓派并且对Python3有所了解,因此我决定使用QTCreator,据我所知,可以通过pyqt将其转换为python3(https://nikolak.com/pyqt-qt-designer-getting-started/)。我将其安装在树莓派上,并创建了以下用户界面:
在拥有基本的用户界面之后,我使用pyuic5命令将.ui文件转换为.py,并且能够使用“ python3 main.py”打开用户界面,一切似乎都正确:
打开main.py文件后用户界面的外观
现在,我想在UI上绘制几张图(例如电压与时间的关系图)。我正在使用以下进行测试:
import sys
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')
win = pg.GraphicsWindow()
win.setWindowTitle('pyqtgraph example: Scrolling Plots')
p1 = win.addPlot(labels = {'left':'Voltage', 'bottom':'Time'})
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
curve1 = p1.plot(data1, pen=(3,3))
curve2 = p1.plot(data2, pen=(2,3))
ptr1 = 0
def update1():
global data1, curve1, data2, ptr1
data1[:-1] = data1[1:] # shift data in the array one sample left
# (see also: …
Run Code Online (Sandbox Code Playgroud) 我正在使用 PyQt 和 PyQtGraph 来构建一个相对简单的绘图 UI。作为其中的一部分,我有一个图形视图(pyqtgraph 的 graphicslayoutwidget),其中包含由用户动态添加的 PlotItem。
我想要实现的是允许用户通过双击它来选择一个 PlotItem。
如果用户在小部件窗口中的某处双击,这很简单,但我似乎无法弄清楚如何返回点击的内容。
我的大多数搜索结果都试图为某些按钮重新实现 mousePressEvent。我已经阅读了一些关于事件过滤器的内容,但我不确定这是否是必要的解决方案。
我不确定还有哪些其他信息可能有助于回答这个问题,所以如果不清楚我要问什么,请告诉我,以便我进行澄清。
编辑:
复制本:
pyqtgraph ×12
python ×11
pyqt ×4
pyqt5 ×3
python-3.x ×2
formatting ×1
plot ×1
pyqt4 ×1
qmouseevent ×1
qt-designer ×1
scipy ×1
spectrogram ×1
text ×1