2015-09-05 128 views
1

我想知道如何動態更新matplotlib中的堆積條形圖。動態更新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'。有沒有其他方法可以解決這個問題?

回答

1

出於某種原因,你想要的set_bottom()功能是從bar返回的對象patchesset_y。最小例如,根據你的建議會是什麼樣子鏈接,

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

請注意,我用隨機數每次迭代因此補丁的兩個陣列可代替拉鍊改變高度代(會得到一個有點亂,否則)。

+0

這工作得很好。非常感謝。是否還有更新軸的方法?當鋼筋比軸線高時,它們現在不再顯示。 – Nickpick

+0

您可以使用'ax.relim()'更新最大範圍,然後使用'ax.autoscale_view()'調整軸(其中'ax'是軸手柄)。您可能會發現動畫會變得有點生澀,並且最好始終設置一個常量限制(根據您的數據預期的最大值)。我已經改變了上面的例子來使用subplots(所以你得到了'ax'),並且只有在它比以前的最大值更大時才更新限制。 –