我获取两个数组中的一些数据:一个用于时间,另一个用于值。当我达到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/

10-13 08:26