【发布时间】:2021-09-16 11:51:57
【问题描述】:
我正在尝试绘制在运行时生成的数据。为此,我使用matplotlib.animation.FuncAnimation。
虽然数据显示正确,但轴值并未根据正在显示的值进行相应更新:
x 轴显示从 0 到 10 的值,尽管我在 update_line 函数的每次迭代中更新它们(参见下面的代码)。
DataSource 包含数据向量并在运行时附加值,并返回正在返回的值的索引:
import numpy as np
class DataSource:
data = []
display = 10
# Append one random number and return last 10 values
def getData(self):
self.data.append(np.random.rand(1)[0])
if(len(self.data) <= self.display):
return self.data
else:
return self.data[-self.display:]
# Return the index of the last 10 values
def getIndexVector(self):
if(len(self.data) <= self.display):
return list(range(len(self.data)))
else:
return list(range(len(self.data)))[-self.display:]
我从 matplotlib 文档中获得了 plot_animation 函数。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from datasource import DataSource
def update_line(num, source, line):
data = source.getData()
indexs = source.getIndexVector()
if indexs[0] != 0:
plt.xlim(indexs[0], indexs[-1])
dim=np.arange(indexs[0],indexs[-1],1)
plt.xticks(dim)
line.set_data(indexs,data)
return line,
def plot_animation():
fig1 = plt.figure()
source = DataSource()
l, = plt.plot([], [], 'r-')
plt.xlim(0, 10)
plt.ylim(0, 1)
plt.xlabel('x')
plt.title('test')
line_ani = animation.FuncAnimation(fig1, update_line, fargs=(source, l),
interval=150, blit=True)
# To save the animation, use the command: line_ani.save('lines.mp4')
plt.show()
if __name__ == "__main__":
plot_animation()
如何在动画的每次迭代中更新 x 轴值?
(如果您发现任何错误,我感谢您提出改进代码的建议,即使它们可能与问题无关)。
【问题讨论】:
-
动画函数中graph的数据集在IF函数外是不是正确,我是这么认为的,因为我在IF函数中设置了
plt.xlim(indexes,data)。 -
图表显示 10 个值。 IF 语句确保(或至少我希望它确保)轴仅在集合中有超过 10 个值时才更新,因此它必须“移动”到右侧。
-
我实际上让代码工作了。由于我们绘制的数据小于 1.0,我认为我们可以通过在图表的数据集之后添加以下内容来处理它。
line.set_data(indexs,data);plt.xlim(indexs[0], indexs[-1]) -
我们将在第一次迭代时将 xlim 设置为 (1,1),因为数据集中只有一个元素。这个答案不正确。
标签: python matplotlib matplotlib-animation