【问题标题】:Dynamically updating a stacked bar plot in matplotlib动态更新 matplotlib 中的堆积条形图
【发布时间】:2015-09-06 02:43:49
【问题描述】:

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

这个问题Dynamically updating a bar plot in matplotlib 描述了如何为普通条形图完成此操作,而不是堆积条形图。

在普通条形图中,可以通过rect.set_height(h) 完成更新,假设rects = plt.bar(range(N), x, align='center')

但是在堆积条形图中我们还需要设置底部。

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

如何动态设置底部?不幸的是,“矩形”对象似乎没有“set_bottom”属性。有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: python matplotlib bar-chart dynamically-generated


    【解决方案1】:

    由于某种原因,您想要的 set_bottom() 函数是 set_y 在来自 bar 的返回对象中的 patches 下。根据您建议的链接,最小的示例看起来像,

    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),并且仅当它大于之前的最大值时才更新限制。
    猜你喜欢
    • 2018-01-17
    • 2019-11-28
    • 2021-02-27
    • 2017-09-19
    • 2016-03-19
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多