实时 Matplotlib 绘图 [英] Real-Time Matplotlib Plotting
问题描述
我在对matplotlib进行实时绘图时遇到了一些问题.我在 X 轴上使用时间",在 Y 轴上使用随机数.随机数是一个静态数,然后乘以一个随机数
I have some issues with my real time plotting for matplotlib. I am using "time" on the X axis and a random number on Y axis. The random number is a static number then multiplied by a random number
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秒左右更新一次的数据,然后绘制更新.谢谢!
This seems to crash python as it cannot handle the updates - I can add a delay but wanted to know if the code is doing the right thing? I have cleaned the code to do the same function as my code, so the idea is we have some static data, then some data which we want to update every 5 seconds or so and then to plot the updates. Thanks!
推荐答案
要绘制连续的随机线图集,您需要在matplotlib中使用动画:
To draw a continuous set of random line plots, you would need to use animation in 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 每 1000ms
调用你的 animate()
函数,让你提供新的 y
值.
The idea here is that you have a graph containing x
and y
values. Where x
is just a range e.g. 0 to 5. You then call animation.FuncAnimation()
which tells matplotlib to call your animate()
function every 1000ms
to let you provide new y
values.
您可以通过修改 interval
参数来尽可能快地提高速度.
You can speed this up as much as you like by modifying the interval
parameter.
如果您想绘制随时间变化的值,一种可能的方法是使用 deque()
来保存 y
值,然后使用 x
轴保持秒前
:
One possible approach if you wanted to plot values over time, you could use a deque()
to hold the y
values and then use the x
axis to hold 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()
给你
这篇关于实时 Matplotlib 绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!