Python 在matplotlib中动态更新堆叠条形图

Python 在matplotlib中动态更新堆叠条形图,python,matplotlib,bar-chart,dynamically-generated,Python,Matplotlib,Bar Chart,Dynamically Generated,我想知道如何在matplotlib中动态更新堆叠条形图 此问题描述了如何对普通条形图(而不是堆叠条形图)执行此操作 在普通条形图中,可以通过rect.set\u height(h)进行更新,假设rects=plt.bar(范围(N),x,align='center') 但在堆叠条形图中,我们还需要设置底部 p2 = plt.bar(ind, womenMeans, width, color='y', bottom=menMeans, yerr=menStd) 如何动态

我想知道如何在matplotlib中动态更新堆叠条形图

此问题描述了如何对普通条形图(而不是堆叠条形图)执行此操作

在普通条形图中,可以通过
rect.set\u height(h)
进行更新,假设
rects=plt.bar(范围(N),x,align='center')

但在堆叠条形图中,我们还需要设置底部

p2 = plt.bar(ind, womenMeans, width, color='y',
             bottom=menMeans, yerr=menStd)

如何动态设置底部?不幸的是,“矩形”对象似乎没有属性“set_bottom”。是否有其他方法来处理此问题?

出于某种原因,您需要的
设置底部()
函数位于
中返回对象的
补丁
下。最简单的例子是,根据你建议的链接

import numpy as np
import matplotlib.pyplot as plt

def setup_backend(backend='TkAgg'):
    import sys
    del sys.modules['matplotlib.backends']
    del sys.modules['matplotlib.pyplot']
    import matplotlib as mpl
    mpl.use(backend)  # do this before importing pyplot
    import matplotlib.pyplot as plt
    return plt

N = 5
width = 0.35       # the width of the bars: can also be len(x) sequence

def animate():
    # http://www.scipy.org/Cookbook/Matplotlib/Animations
    mu, sigma = 100, 15
    h = mu + sigma * np.random.randn((N*2))
    p1 = plt.bar(np.arange(N), h[:N], width, color='r')
    p2 = plt.bar(np.arange(N), h[N:], width, color='b', bottom=h[:N])
    assert len(p1) == len(p2)
    maxh = 0.
    for i in range(50):
        for rect1, rect2 in zip(p1.patches, p2.patches):
            h = mu + sigma * np.random.randn(2)
            #Keep a record of maximum value of h
            maxh = max(h[0]+h[1],maxh)
            rect1.set_height(h[0])
            rect2.set_y(rect1.get_height())
            rect2.set_height(h[1])
        #Set y limits to maximum value
        ax.set_ylim((0,maxh))
        fig.canvas.draw()

plt = setup_backend()
fig, ax = plt.subplots(1,1)
win = fig.canvas.manager.window
win.after(10, animate)
plt.show()

请注意,我在每次迭代中都使用随机数更改高度生成,因此可以压缩两个面片阵列(否则会有点混乱)。

效果很好。非常感谢。还有更新轴的方法吗?当条形图高于轴时,此时不再显示。您可以使用
ax.relim()
更新最大范围,然后使用
ax.autoscale_view()
调整轴(其中
ax
是轴手柄)。您可能会发现动画最终有点不稳定,最好在整个过程中设置一个常量限制(基于数据的最大期望值)。我已经更改了上面的示例,使用子图(因此您得到的是
ax
),并且仅当它大于以前的最大值时才更新限制。