- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 python 中实现一个快速滚动的时间跟踪工具。 timetrace 数据已经全部在内存中的 numpy
数组中并且很大(>1e6 样本)。我需要一种用于快速目视检查的工具。
我already tried使用Matplotlib+PySide但更新速度不够快。
你能重现Matplotlib+Pyside demo吗?在另一个工具包中,比如 pygraphqt/chaco/quiqwt?我不认识他们中的任何一个,我愿意学习在这个应用程序中表现更好的那个。
为了在我的工作流程中发挥作用,所选框架应允许从交互式 ipython session 运行绘图,并且应该快速且可扩展(最终我将需要在同一窗口上同步滚动的多个绘图)。原则上 pyqtgraph、guiqwt 或 chaco 似乎都是不错的选择。但是让我们用一个真实的例子来判断。
谢谢。
最佳答案
这是 pyqtgraph 版本。我尽量使代码与原始演示保持相似。在我的系统上,pyqtgraph 的运行速度只比 matplotlib 快 5 倍左右,而且当所有数据都可见时仍然很慢 (~1fps)。 matplotlib 和 pyqtgraph 之间的主要性能差异在于吞吐量——绘制新数据的速度。
为了获得更好的性能,我建议查看一些基于 GPU 的绘图库,例如 visvis 或 galry。 Pyqtgraph 将来会添加 GPU 支持,但目前还没有。也有一些努力将 matplotlib 引入 GPU,但我还没有看到任何结果......
## adapted from http://stackoverflow.com/questions/16824718/python-matplotlib-pyside-fast-timetrace-scrolling
from PySide import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
N_SAMPLES = 1e6
def test_plot():
time = np.arange(N_SAMPLES)*1e-3
sample = np.random.randn(N_SAMPLES)
plt = pg.PlotWidget(title="Use the slider to scroll and the spin-box to set the width")
plt.addLegend()
plt.plot(time, sample, name="Gaussian noise")
q = ScrollingToolQT(plt)
return q # WARNING: it's important to return this object otherwise
# python will delete the reference and the GUI will not respond!
class ScrollingToolQT(object):
def __init__(self, fig):
# Setup data range variables for scrolling
self.fig = fig
self.xmin, self.xmax = fig.plotItem.vb.childrenBounds()[0]
self.step = 1 # axis units
self.scale = 1e3 # conversion betweeen scrolling units and axis units
# Retrive the QMainWindow used by current figure and add a toolbar
# to host the new widgets
self.win = QtGui.QMainWindow()
self.win.show()
self.win.resize(800,600)
self.win.setCentralWidget(fig)
self.toolbar = QtGui.QToolBar()
self.win.addToolBar(QtCore.Qt.BottomToolBarArea, self.toolbar)
# Create the slider and spinbox for x-axis scrolling in toolbar
self.set_slider(self.toolbar)
self.set_spinbox(self.toolbar)
# Set the initial xlimits coherently with values in slider and spinbox
self.set_xlim = self.fig.setXRange
self.set_xlim(0, self.step)
def set_slider(self, parent):
# Slider only support integer ranges so use ms as base unit
smin, smax = self.xmin*self.scale, self.xmax*self.scale
self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, parent=parent)
self.slider.setTickPosition(QtGui.QSlider.TicksAbove)
self.slider.setTickInterval((smax-smin)/10.)
self.slider.setMinimum(smin)
self.slider.setMaximum(smax-self.step*self.scale)
self.slider.setSingleStep(self.step*self.scale/5.)
self.slider.setPageStep(self.step*self.scale)
self.slider.setValue(0) # set the initial position
self.slider.valueChanged.connect(self.xpos_changed)
parent.addWidget(self.slider)
def set_spinbox(self, parent):
self.spinb = QtGui.QDoubleSpinBox(parent=parent)
self.spinb.setDecimals(3)
self.spinb.setRange(0.001, 3600.)
self.spinb.setSuffix(" s")
self.spinb.setValue(self.step) # set the initial width
self.spinb.valueChanged.connect(self.xwidth_changed)
parent.addWidget(self.spinb)
def xpos_changed(self, pos):
#pprint("Position (in scroll units) %f\n" %pos)
# self.pos = pos/self.scale
pos /= self.scale
self.set_xlim(pos, pos + self.step, padding=0)
def xwidth_changed(self, xwidth):
#pprint("Width (axis units) %f\n" % step)
if xwidth <= 0: return
self.step = xwidth
self.slider.setSingleStep(self.step*self.scale/5.)
self.slider.setPageStep(self.step*self.scale)
old_xlim = self.fig.plotItem.vb.viewRange()[0]
self.xpos_changed(old_xlim[0] * self.scale)
if __name__ == "__main__":
app = pg.mkQApp()
q = test_plot()
app.exec_()
关于python - pyqtgraph/查科/guiqwt : Fast scrolling timetrace demo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844693/
我想在 python 中实现一个快速滚动的时间跟踪工具。 timetrace 数据已经全部在内存中的 numpy 数组中并且很大(>1e6 样本)。我需要一种用于快速目视检查的工具。 我already
我是一名优秀的程序员,十分优秀!