2017-04-21 19 views
3

我正在尝试制作一个小提琴图的动画,所以我已经开始了一些我认为应该非常基本的东西,但它不起作用。我认为问题在于小提琴曲不接受set_data,但我不知道如何将不断变化的数据传递给小提琴曲。对于这个例子,我想要一个平均值缓慢转移到更高值的情节。如果我吠叫错误的树,请提供一个可以使小提琴图动画的代码。如何制作Matplotlib动画小提琴图?

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) 

回答

2

确实,小提琴图没有set_data方法。原因可能是,在创建这样的情节时,背景中会进行大量计算,而且它包含很多不同的元素,这些元素很难更新。

最简单的选择是简单地重绘小提琴情节,不使用blitting。

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() 

enter image description here

+0

正是我要做的事情。我真的不知道*什么是惯用的,但是我的直觉是,在'FuncAnimation'中传递所有'data'作为附加'fargs'可能更好(并且从基于'i'的拾取),而不是拉他们来自全球的名字空间。我还会注意到'violinplot()'返回一个充满艺术家的字典,所以返回值不能有任何非dict方法。 –

+0

我不会在这种情况下看到没有使用全局的任何理由;我只能看到人们可能会将其复制到其他用例并在那里遇到问题的危险;但是我认为这对于你在简单例子中发现的许多结构来说都是正确的。但是因为你要求,我编辑了代码。 – ImportanceOfBeingErnest

+0

关于返回的字典,这只是一个设计问题。一个人可能决定不返回一本字典,而是一些其他类型的收集,这将允许拥有更新方法。这根本不是为了更新而设计的,仅此而已。 – ImportanceOfBeingErnest