嗨,我对matplotlib的实时绘图存在一些问题。我在X轴上使用“时间”,在Y轴上使用随机数。随机数是一个静态数,然后乘以一个随机数
import matplotlib.pyplot as plt
import datetime
import numpy as np
import time
def GetRandomInt(Data):
timerCount=0
x=[]
y=[]
while timerCount < 5000:
NewNumber = Data * np.random.randomint(5)
x.append(datetime.datetime.now())
y.append(NewNumber)
plt.plot(x,y)
plt.show()
time.sleep(10)
a = 10
GetRandomInt(a)
这似乎崩溃python,因为它无法处理更新 - 我可以添加一个延迟,但想知道代码是否做正确的事情?我已经清理了代码以执行与我的代码相同的功能,因此我们的想法是我们有一些静态数据,然后我们想要每5秒左右更新一些数据,然后绘制更新。谢谢!
答案 0 :(得分:1)
要绘制一组连续的随机线图,您需要在matplotlib中使用动画:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()
max_x = 5
max_rand = 10
x = np.arange(0, max_x)
ax.set_ylim(0, max_rand)
line, = ax.plot(x, np.random.randint(0, max_rand, max_x))
def init(): # give a clean slate to start
line.set_ydata([np.nan] * len(x))
return line,
def animate(i): # update the y values (every 1000ms)
line.set_ydata(np.random.randint(0, max_rand, max_x))
return line,
ani = animation.FuncAnimation(
fig, animate, init_func=init, interval=1000, blit=True, save_count=10)
plt.show()
这里的想法是,您有一个包含x
和y
值的图表。其中x
只是一个范围,例如0到5.然后,您拨打animation.FuncAnimation()
,告诉matplotlib每animate()
调用一次1000ms
函数,以便提供新的y
值。
通过修改interval
参数,您可以根据需要加快速度。
如果您想要随时间绘制值,可以采用一种可能的方法,您可以使用deque()
来保存y
值,然后使用x
轴来保存seconds ago
:
from collections import deque
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.ticker import FuncFormatter
def init():
line.set_ydata([np.nan] * len(x))
return line,
def animate(i):
# Add next value
data.append(np.random.randint(0, max_rand))
line.set_ydata(data)
plt.savefig('e:\\python temp\\fig_{:02}'.format(i))
print(i)
return line,
max_x = 10
max_rand = 5
data = deque(np.zeros(max_x), maxlen=max_x) # hold the last 10 values
x = np.arange(0, max_x)
fig, ax = plt.subplots()
ax.set_ylim(0, max_rand)
ax.set_xlim(0, max_x-1)
line, = ax.plot(x, np.random.randint(0, max_rand, max_x))
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '{:.0f}s'.format(max_x - x - 1)))
plt.xlabel('Seconds ago')
ani = animation.FuncAnimation(
fig, animate, init_func=init, interval=1000, blit=True, save_count=10)
plt.show()
给你:
答案 1 :(得分:0)
实例化实例化PlotData的GetRandomInt,它实例化实例化PlotData的GetRandomInt ......等等。这是你问题的根源。