在Pyqtgraph中绘制交互式时间跟踪器

时间:2017-11-10 09:31:55

标签: python animation pyqtgraph

我目前正在努力创建一个交互式时间跟踪线,它沿着X轴穿过曲线。

问题:我已经能够使用Matplotlib中的动画进行编码,但只能使线移动(即,它不是交互式的)。

import numpy as np
import csv
import csv_splitter
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation
import matplotlib.colors as cm
from scipy import interpolate
from scipy import ndimage
from PIL import Image
import cv2
import os
plt.rcParams['animation.ffmpeg_path'] = unicode ('C:/FFMPEG/bin/ffmpeg.exe')

with open('C:/Users/j/Desktop/Force.csv','r') as input, open('C:/Users/j/Desktop/Op.csv', 'w') as output:
    try:
        read = csv.reader(input)
        for r in read:
            non_blank = (line for line in input if line.strip())            
            for i in range(17):
                next(read)                
            output.writelines(non_blank)
    finally:
        print("Done!")

data_orig = np.genfromtxt('C:/Users/jkspu/Desktop/Op.csv', dtype =int, delimiter = ",")
fig = plt.figure()
X = data_orig[412:524,1]
Y1 = data_orig[412:524,4]
Y2 = data_orig[412:524,3]
Y3 = data_orig[412:524,2]

plt.plot(X, Y1, 'r--', X, Y2, 'b--', X, Y3, 'g--')
plt.xlabel('Time -----> (ms)')
plt.ylabel('Force Data -----> (N)')

X_MIN = 2055
X_MAX = 2615
Y_MIN = -300
Y_MAX = 1500
X_VALS = range(X_MIN, X_MAX+1);


def update_line(num, line):
    i = X_VALS[num]
    line.set_data( [i, i], [Y_MIN, Y_MAX])
    return line,

l , v = plt.plot(2055, -200, 2615, 1200, linewidth=2, color= 'gold')
anim = animation.FuncAnimation(fig, update_line, len(X_VALS), fargs=(l, ), interval=15, blit=True, repeat=False)
print(update_line)

FFwriter = animation.FFMpegWriter(fps=30, extra_args=['-vcodec', 'libx264'])
anim.save('basic_animation.mp4', writer = FFwriter)
plt.show()

目标:我有兴趣让时间跟踪线互动以及移动(保持动画)。为此,我试图使用Pyqtgraph(希望找到一个交互式解决方案)。

我使用的代码就是这个(但我不知道如何在此代码中插入matplotlib动画):

import numpy as np
import csv
import csv_splitter
import cv2
import os

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg

app = QtGui.QApplication([])

with open('C:/Users/j/Desktop/Force.csv','r') as input, open('C:/Users/j/Desktop/Op.csv', 'w') as output:
    try:
        read = csv.reader(input)
        for r in read:
            non_blank = (line for line in input if line.strip())            
            for i in range(17):
                next(read)                
            output.writelines(non_blank)
    finally:
        print("Done!")

data_orig = np.genfromtxt('C:/Users/j/Desktop/Op.csv', dtype =int, delimiter = ",")

win = pg.GraphicsWindow(title="Plot")
win.resize(1000, 600)
win.setWindowTitle('First_Plot')
p1 = win.addPlot(title="Parametric, grid enabled")
X = data_orig[412:524,1]
Y1 = data_orig[412:524,4]
Y2 = data_orig[412:524,3]
Y3 = data_orig[412:524,2]

p1.plot(X, Y1, pen = 'r')
p1.plot(X, Y2, pen = 'b')
fig = p1.plot(X, Y3, pen = 'g')

p1.setLabel('left', "Y Axis", units = 'N')
p1.setLabel('bottom', "X Axis", units = 'ms')






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

我将如何理想地期待:

Image

请求:请问在Pyqtgraph中有一些动画线(+交互式)的专业知识吗?

我希望我能说清楚,如果没有,请告诉我,谢谢!

1 个答案:

答案 0 :(得分:0)

我想你希望能够:

1)添加用户可以拖动的垂直线。为此,请尝试

vline = p1.addLine(x=0, movable=True)

2)在垂直线与曲线曲线相交的任何地方绘制标记。您可以通过连接到线移动时发出的信号来手动执行此操作:

def update(line):
    x = line.value()
    # find and plot intersection points

vline.sigPositionChanged.connect(update)
相关问题