我尝试使用matplotlib创建动画,以在一个动画中同时绘制多个数据集。 问题是我的两个数据集中有50个点,第三个数据集有70000个点。因此,同时绘图(点之间具有相同的间隔)是无用的,因为前三个数据集在第三个数据集刚刚开始显示时进行绘图。
因此,我试图让数据集在单独的动画调用中绘制(具有不同的间隔,即绘图速度),但是在单个图上。问题在于动画仅针对最后调用的数据集显示。
请参阅下面的随机数据代码:
import numpy as np
from matplotlib.pyplot import *
import matplotlib.animation as animation
import random
dataA = np.random.uniform(0.0001, 0.20, 70000)
dataB = np.random.uniform(0.90, 1.0, 50)
dataC = np.random.uniform(0.10, 0.30, 50)
fig, ax1 = subplots(figsize=(7,5))
# setting the axes
x1 = np.arange(0, len(dataA), 1)
ax1.set_ylabel('Percentage %')
for tl in ax1.get_xticklabels():
tl.set_color('b')
ax2 = ax1.twiny()
x2 = np.arange(0, len(dataC), 1)
for tl in ax2.get_xticklabels():
tl.set_color('r')
ax3 = ax1.twiny()
x3 = np.arange(0, len(dataB), 1)
for tl in ax3.get_xticklabels():
tl.set_color('g')
# set plots
line1, =ax1.plot(x1,dataA, 'b-', label="dataA")
line2, =ax2.plot(x2,dataC, 'r-',label="dataB")
line3, =ax3.plot(x3, dataB, 'g-', label="dataC")
# set legends
ax1.legend([line1, line2, line3], [line1.get_label(),line2.get_label(), line3.get_label()])
def update(num, x, y, line):
line.set_data(x[:num], y[:num])
line.axes.axis([0, len(y), 0, 1]) #[xmin, xmax, ymin, ymax]
return line,
ani = animation.FuncAnimation(fig, update, len(x1), fargs=[x3, dataB, line3],interval=150, blit=True, repeat=False)
ani = animation.FuncAnimation(fig, update, len(x1), fargs=[x1, dataA, line1],interval=5, blit=True, repeat=False)
ani = animation.FuncAnimation(fig, update, len(x1), fargs=[x2, dataC, line2],interval=150, blit=True, repeat=False)
# if the first two 'ani' are commented out, it live plots the last one, while the other two are plotted static
show()
最后的情节应如下所示: http://i.imgur.com/RjgVYxr.png
但关键是要同时获取动画(但以不同的速度)绘制线条。
答案 0 :(得分:0)
比使用单独的动画调用更简单的是更新同一动画调用中的所有行,但速率不同。在您的情况下,仅在每次(70000/50)呼叫update
时更新红线和绿线。
您可以通过将从update
功能开始的代码更改为以下内容来执行此操作:
def update(num):
ratio = 70000/50
i = num/ratio
line1.set_data(x1[:num], dataA[:num])
if num % ratio == 0:
line2.set_data(x2[:i], dataC[:i])
line3.set_data(x3[:i], dataB[:i])
ani = animation.FuncAnimation(fig, update, interval=5, repeat=False)
show()
请注意if num % ratio == 0
语句,如果num可以按比例整除,则只执行以下行。此外,您需要为更新速度更慢的行创建单独的计数器。在这种情况下,我使用了i
。