我正在尝试为 matplotlib Sankey 图制作动画,其中流量的大小发生变化。我有一个部分工作的例子,但是它不断添加更多的桑基图,如计数器所示;len(sankey.diagrams)。这意味着它不能正常工作,有多个箭头,或者很长时间。如何正确地为带有多个箭头的 matplotlib Sankey 图制作动画?
from matplotlib import pyplot as plt
from matplotlib import animation
from matplotlib.sankey import Sankey
import numpy as np
time = np.linspace(0, np.pi * 2, 100)
flow_in = 4 * np.ones_like(time)
flow_out_a = 2 + np.sin(time)
flow_out_b = flow_in - flow_out_a
fig = plt.figure()
ax = fig.add_subplot(111)
sankey = Sankey(ax=ax, scale=1 / max(flow_in), format=u'%0.3g')
diags_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
def init():
diags_text.set_text('')
sankey.diagrams=[]
a = flow_in[0]
b = -flow_out_a[0]
c = -flow_out_b[0]
sankey.add(flows=[a, b, c],
orientations=[0, 0, -1],
alpha=0.2, lw=2.0, trunklength=1, pathlengths=[1, 1, 1])
diag = sankey.finish()
return(diag, diags_text)
def anim(idx):
for diag in sankey.diagrams:
diag.patch.set_visible(False)
diag.text.set_visible(False)
for txt in diag.texts:
txt.set_visible(False)
a = flow_in[idx]
b = -flow_out_a[idx]
c = -flow_out_b[idx]
sankey.add(flows=[a, b, c],
orientations=[0, 0, -1],
alpha=0.2, lw=2.0, trunklength=1, pathlengths=[1, 1, 1])
diag = sankey.finish()
diags_text.set_text('len(sankey.diagrams) = {l}'.format(l=len(sankey.diagrams)))
return(diag, diags_text)
frames, = time.shape
anim = animation.FuncAnimation(fig, anim, init_func=init,
frames=frames, interval=20, blit=False)