如何制作 Matplotlib 动画小提琴图?

J. *_* K. 6 python matplotlib

我正在尝试为小提琴图制作动画,所以我从我认为应该非常基本的东西开始,但它不起作用。我认为问题在于 violinplot 不接受 set_data,但我不知道如何将不断变化的数据传递给 violinplot。对于这个例子,我想要一个均值缓慢移动到更高值的图。如果我咆哮了错误的树,请就可以为小提琴图设置动画的代码提出建议。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


fig, ax = plt.subplots()
data = np.random.rand(100)

def animate(i):
    v.set_data(data+i)  # update the data
    return v

v = ax.violinplot([])
ax.set_ylim(0,200)

v_ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), 
                              interval=50, blit=True)
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 4

事实上,小提琴图没有 set_data 方法。原因可能是,在创建这样的图时,后台会进行大量计算,并且它由许多不同的元素组成,这些元素很难更新。

最简单的选择是简单地重画小提琴图而不使用位图传送。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


fig, ax = plt.subplots()
data = np.random.normal(loc=25, scale=20, size=100)

def animate(i, data):
    ax.clear()
    ax.set_xlim(0,2)
    ax.set_ylim(0,200)
    data[:20] = np.random.normal(loc=25+i, scale=20, size=20)
    np.random.shuffle(data)
    ax.violinplot(data)

animate(0)

v_ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), 
                              fargs=(data,), interval=50, blit=False)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述