python - 子图中直方图的动画

标签 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

最佳答案

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

normed : boolean, optional
If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)`dbin), i.e., the integral of the histogram will sum to 1. If stacked is also True, the sum of the histograms is normalized to 1. Default is False

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

因此,修复垃圾箱并在整个动画中使用它们是个好主意。
清除坐标轴也是合理的,这样就不会绘制 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

关于python - 子图中直方图的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910622/

相关文章:

python - 具有大量文件的多处理

animation - 如何在 phaser.js 中向组 Sprite 添加动画?

python - Jupyter Notebook 中的交互式绘图

python - matplotlib 中的中心原点

python - 使用 Python cgi 和表单进行工作。空输入错误

python - 使用 Tensorflow 读取 PNG 文件

animation - Unity Animator 默认图层状态在第一帧卡住

python - 如何在 matplotlib 中制作可点击的 python 烛台图表

python - 将人类可读的时间差(不是时间戳)转换为可用于排序的时间差

javascript - 打开上面的div时使div向下滑动(不打开)