我获取两个数组中的一些数据:一个用于时间,另一个用于值。当我达到1000点时,我会触发信号并绘制这些点(x =时间,y =值)。
我需要保持先前绘制的图相同,但只有一个合理的数字,以免减慢处理速度。例如,我想在图表上保留10,000点。
matplotlib交互式绘图工作正常,但我不知道如何删除第一个点,这会很快减慢计算机速度。
我查看了matplotlib.animation,但它似乎只是重复了相同的情节,并没有真正实现它。
我真的在寻找一种简便的解决方案,以避免速度变慢。
当我获取大量时间时,我会在每个循环中擦除输入数据(第1001个点存储在第1行中,依此类推)。
这是我现在所拥有的,但是它使所有要点保持在图形上:
import matplotlib.pyplot as plt
def init_plot():
plt.ion()
plt.figure()
plt.title("Test d\'acqusition", fontsize=20)
plt.xlabel("Temps(s)", fontsize=20)
plt.ylabel("Tension (V)", fontsize=20)
plt.grid(True)
def continuous_plot(x, fx, x2, fx2):
plt.plot(x, fx, 'bo', markersize=1)
plt.plot(x2, fx2, 'ro', markersize=1)
plt.draw()
我调用了一次init函数,并且continous_plot在一个进程中,每当我在数组中有1000个点时就调用该函数。
最佳答案
您可能拥有的最轻巧的解决方案是替换现有图的X和Y值。 (或者,如果您的X数据不变,则仅Y值。一个简单的示例:
import matplotlib.pyplot as plt
import numpy as np
import time
fig = plt.figure()
ax = fig.add_subplot(111)
# some X and Y data
x = np.arange(10000)
y = np.random.randn(10000)
li, = ax.plot(x, y)
# draw and show it
ax.relim()
ax.autoscale_view(True,True,True)
fig.canvas.draw()
plt.show(block=False)
# loop to update the data
while True:
try:
y[:-10] = y[10:]
y[-10:] = np.random.randn(10)
# set the new data
li.set_ydata(y)
fig.canvas.draw()
time.sleep(0.01)
except KeyboardInterrupt:
break
该解决方案也非常快。上面代码的最大速度是每秒100次重绘(受
time.sleep
限制),我的速度约为70-80,这意味着一次重绘大约需要4毫秒。但是YMMV取决于后端等。关于python - Python实时绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24783530/