2013-04-20 7 views
6

मैं matplotlib के अंदर एक fill_between आकार को एनिमेट करने का प्रयास कर रहा हूं और मुझे नहीं पता कि पॉलीकोलेक्शन के डेटा को कैसे अपडेट किया जाए। इस सरल उदाहरण को लें: मेरे पास दो पंक्तियां हैं और मैं हमेशा उनके बीच भर रहा हूं। बेशक, रेखाएं बदलती हैं और एनिमेटेड हैं।Matplotlib एनिमेट fill_between आकार

import matplotlib.pyplot as plt 

# Init plot: 
f_dummy = plt.figure(num=None, figsize=(6, 6)); 
axes_dummy = f_dummy.add_subplot(111); 

# Plotting: 
line1, = axes_dummy.plot(X, line1_data, color = 'k', linestyle = '--', linewidth=2.0, animated=True); 
line2, = axes_dummy.plot(X, line2_data, color = 'Grey', linestyle = '--', linewidth=2.0, animated=True); 
fill_lines = axes_dummy.fill_between(X, line1_data, line2_data, color = '0.2', alpha = 0.5, animated=True); 

f_dummy.show(); 
f_dummy.canvas.draw(); 
dummy_background = f_dummy.canvas.copy_from_bbox(axes_dummy.bbox); 

# [...]  

# Update plot data: 
def update_data(): 
    line1_data = # Do something with data 
    line2_data = # Do something with data 
    f_dummy.canvas.restore_region(dummy_background); 
    line1.set_ydata(line1_data); 
    line2.set_ydata(line2_data); 

    # Update fill data too 

    axes_dummy.draw_artist(line1); 
    axes_dummy.draw_artist(line2); 

    # Draw fill too 

    f_dummy.canvas.blit(axes_dummy.bbox); 

सवाल fill_between पाली line1_data के आधार पर डेटा और line2_data हर बार update_data अद्यतन कैसे करने के लिए() कहा जाता है और Blit से पहले उन्हें आकर्षित है ("# अद्यतन भरने डेटा:

यहाँ एक डमी उदाहरण है भी "&" # भरें भी भरें ")। मैंने सफलता के बिना fill_lines.set_verts() की कोशिश की और एक उदाहरण नहीं मिला ...

धन्यवाद!

+1

आपको हर फ्रेम को हटाने और पूरी तरह से फिर से खींचने की आवश्यकता हो सकती है। '* संग्रह' ऑब्जेक्ट्स अपडेट करने के साथ अच्छा नहीं खेलते हैं। इसका कारण यह है कि उन्होंने सभी मेटा-डेटा को फेंक दिया है जो आपको डेटा-स्पेस और ड्रा-स्पेस के बीच मैप करने की अनुमति देगा, और केवल ड्रॉ करने की सूची रखें। यह उन्हें तुरंत प्रस्तुत करने के लिए एक व्यापार बंद है। – tacaswell

+0

क्या आप update_data के अंदर f_dummy.canvas.draw() का उपयोग करना चाहते हैं?मैंने इसके साथ शुरुआत की लेकिन दुर्भाग्यवश मुझे तेजी से साजिश की आवश्यकता है क्योंकि मैं रीयल-टाइम में एक सिग्नल प्रोसेसिंग और सिग्नल खेल रहा हूं और मुझे प्लेबैक को प्रभावित न करने की साजिश की आवश्यकता है (कॉल ड्रॉ() प्लेबैक स्टाल करता है)। यदि आप ध्वनि बजाने के दौरान सबकुछ फिर से निकालने के लिए एक तेज थ्रेडिंग चाल जानते हैं, तो अच्छा होगा - मैंने थ्रेडिंग के साथ ड्रॉ कहा .start (...)। मुझे पता है कि अन्य तेज साजिश पुस्तकालय हैं लेकिन मैं matplotlib पर चिपकना पसंद करता हूं और पुनर्स्थापना/ब्लिट चाल मेरे लिए पर्याप्त तेज़ी से काम करती है। – Sebastian

उत्तर

3

ठीक है, के रूप में किसी को बताया कि हम यहाँ एक संग्रह के साथ काम कर रहे हैं, इसलिए हम इस अक्ष वस्तु axes_dummy = f_dummy.add_subplot (111) दिया हटाना होगा और पुनः बनाने जाएगा

;

तो कहीं अपडेट_डाटा() में: आप करेंगे। ।

के साथ जुड़े सभी संग्रह को नष्ट यह

for coll in (axes_dummy.collections): 
    axes_dummy.collections.remove(coll) 

नया "filled_between" Polycollection

axes_dummy.fill_between(x,y-sigma,y+sigma, 
        facecolor='yellow', alpha=0.5) 

ऐसा ही एक चाल एक भरा एक के ऊपर एक रिक्त समोच्च साजिश ओवरले करने के लिए आवश्यक है, के बाद से आकर्षित एक unfilled contour साजिश एक संग्रह भी है (लाइनों का मुझे लगता है?)

+1

यदि आप केवल एक संग्रह को हटाना चाहते हैं, तो आप सही प्राप्त करने के लिए 'coll.get_label()' का उपयोग कर सकते हैं बशर्ते आपने पहले संग्रह को लेबल किया हो। – Sardathrion

1

यह मेरा जवाब नहीं है, लेकिन मुझे यह सबसे उपयोगी मिला:

http://matplotlib.1069221.n5.nabble.com/animation-of-a-fill-between-region-td42814.html

हाय मौरिसियो, पैच वस्तुओं क्योंकि इन लाइन वस्तुओं एक कदम उपयोगकर्ता द्वारा आपूर्ति इनपुट डेटा से हटा रहे हैं, थोड़ा और लाइन वस्तुओं की तुलना के साथ काम करना मुश्किल है। यहां एक उदाहरण है जो आप यहां करना चाहते हैं: http://matplotlib.org/examples/animation/histogram.html

असल में, आपको प्रत्येक फ्रेम पर पथ के शिखर को संशोधित करने की आवश्यकता है। ऐसा कुछ ऐसा दिखाई दे सकता है:

from matplotlib import animation 
import numpy as np 
import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
ax.set_xlim([0,10000]) 

x = np.linspace(6000.,7000., 5) 
y = np.ones_like(x) 

collection = plt.fill_between(x, y) 

def animate(i): 
    path = collection.get_paths()[0] 
    path.vertices[:, 1] *= 0.9 

animation.FuncAnimation(fig, animate, 
         frames=25, interval=30) 

पथ.वर्तकों पर एक नज़र डालें ताकि यह देखने के लिए कि उन्हें कैसे रखा गया है। आशा है कि मदद करता है, जेक

1

आप anitmation उपयोग करने के लिए, या अपने आंकड़े से सब कुछ को हटाने के लिए केवल भरने अद्यतन करने के लिए नहीं करना चाहते हैं, तो आप अपने रास्ते का उपयोग कर सकता:

कॉल fill_lines.remove() और उसके बाद फिर axes_dummy.fill_between() फोन नए आकर्षित करने के लिए। मेरे लिए काम किया

संबंधित मुद्दे