子图中直方图的动画

时间:2017-03-20 17:52:39

标签: python animation matplotlib histogram

我有以下动画子图,模拟四种不同分布的直方图:

import numpy
from matplotlib.pylab import *
import matplotlib.animation as animation

n = 100

# generate 4 random variables from the random, gamma, exponential, and uniform distributions
x1 = np.random.normal(-2.5, 1, 10000)
x2 = np.random.gamma(2, 1.5, 10000)
x3 = np.random.exponential(2, 10000)+7
x4 = np.random.uniform(14,20, 10000)

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

def updateData(curr):

    if curr == n: 
        a.event_source.stop()

    ax1.hist(x1[:curr], normed=True, bins=20, alpha=0.5)
    ax2.hist(x2[:curr], normed=True, bins=20, alpha=0.5)
    ax3.hist(x3[:curr], normed=True, bins=20, alpha=0.5)
    ax4.hist(x4[:curr], normed=True, bins=20, alpha=0.5)

simulation = animation.FuncAnimation(fig, updateData, interval=20, repeat=False)

plt.show()

它可以工作,但由于某些原因,y轴缩放会忽略normed = True。如果我从动画中取出这些图,它们会正确缩放。如何在动画中进行适当的缩放?

修改

而不是像这样的比例(在动画之外):no animation

我得到(动画内部):animation

3 个答案:

答案 0 :(得分:4)

直方图的normed = True参数使直方图绘制分布的密度。来自the documentation

  

标准:布尔值,可选
  如果为True,则返回元组的第一个元素将是规范化以形成概率密度的计数,即n /(len(x)`dbin),即直方图的积分将总和为1 。如果stacked也为True,则直方图的总和标准化为1。   默认值为False

这意味着直方图栏的高度取决于箱宽。如果仅绘制一个数据点,则动画开始时的情况下,条形高度将为1./binwidth。如果箱宽度小于零,则杆高度可能变得非常大。

因此,在整个动画过程中修理垃圾箱并使用它们是一个好主意 清除轴也是合理的,这样就不会绘制100个不同的直方图。

import numpy as np
from matplotlib.pylab import *
import matplotlib.animation as animation

# generate 4 random variables from the random, gamma, exponential, and uniform distribution
x1 = np.random.normal(-2.5, 1, 10000)
x2 = np.random.gamma(2, 1.5, 10000)
x3 = np.random.exponential(2, 10000)+7
x4 = np.random.uniform(14,20, 10000)

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

def updateData(curr):
    if curr <=2: return
    for ax in (ax1, ax2, ax3, ax4):
        ax.clear()
    ax1.hist(x1[:curr], normed=True, bins=np.linspace(-6,1, num=21), alpha=0.5)
    ax2.hist(x2[:curr], normed=True, bins=np.linspace(0,15,num=21), alpha=0.5)
    ax3.hist(x3[:curr], normed=True, bins=np.linspace(7,20,num=21), alpha=0.5)
    ax4.hist(x4[:curr], normed=True, bins=np.linspace(14,20,num=21), alpha=0.5)

simulation = animation.FuncAnimation(fig, updateData, interval=50, repeat=False)

plt.show()

enter image description here

答案 1 :(得分:1)

是的!我也遇到了同样的问题 如果遇到此类问题,请不要忘记在显示动画的每一帧之前清除轴。

使用 plt.cla() 要么 ax.clear()(在您的情况下) 每个轴

在为动画定义的函数中绘制图之前

答案 2 :(得分:-1)

知道了!

我对n的迭代是罪魁祸首。这符合我的预期:

def updateData(curr):

    curr2=100+curr*5 

    #if curr == n: 
    #    a.event_source.stop()

    ax1.hist(x1[:curr2], normed=True, bins=20, alpha=0.5)
    ax2.hist(x2[:curr2], normed=True, bins=20, alpha=0.5)
    ax3.hist(x3[:curr2], normed=True, bins=20, alpha=0.5)
    ax4.hist(x4[:curr2], normed=True, bins=20, alpha=0.5)

simulation = animation.FuncAnimation(fig, updateData, frames=900, interval=10)

plt.show()