2013-01-02 21 views
8

मैं matplotlib 1.1.0एनीमेशन matplotlib

में आकृति चेतन करने के लिए के आधार पर कोशिश कर रहा हूँ: http://www.mail-archive.com/[email protected]/msg17614.html, http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0-animation-vs-contour-plots-td18703.html और http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

from numpy import linspace,exp,vstack 
from scipy.interpolate import griddata 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from numpy.random import uniform, seed 

def main(): 
    seed(1234) 
    x = uniform(-2,2,100) 
    y = uniform(-2,2,100) 
    data = vstack((x*exp(-x**2-y**2),0.5*x*exp(-x**2-y**2),0.2*x*exp(-x**2-y**2))) 
    xi = linspace(min(x), max(x)) 
    yi = linspace(min(y), max(y)) 
    zi = [] 
    numframes = data.shape[0] 
    for ii in range(numframes): 
     zi.append(griddata((x, y), data[ii], (xi[None,:], yi[:,None]), method='cubic')) 

    fig = plt.figure() 
    im = plt.contour(xi, yi, zi[0], 15, linewidths=0.5, colors='k') 
    ani = animation.FuncAnimation(fig, update_contour_plot, frames=xrange(numframes), fargs=(zi, im, fig, xi, yi), interval=100) 
    plt.colorbar() 
    plt.show() 

def update_contour_plot(i, data, im, fig, xi, yi): 
    for coll in im.collections: 
     try: 
      plt.gca().collections.remove(coll) 
     except ValueError: #Everything is not removed for some reason!                      
      pass 
    im = plt.contour(xi, yi, data[i], 15, linewidths=0.5, colors='k') 
    plt.title(str(i)) 
    return im, 

main() 

1) इस यह करने के लिए सबसे अच्छा तरीका है ? अन्यथा उल्लेख करें।

2) अंतिम आउटपुट में, पिछले फ्रेम से समोच्च रेखाएं अभी भी दिखाई दे रही हैं। मैं उन्हें कैसे हटा सकता हूं? ValueError को छोड़कर देखें:

+0

क्या 'ValueError' इसके साथ कोई संदेश लेता है? – tacaswell

+0

कोशिश के बिना: को छोड़कर:। List.remove (एक्स): नहीं सूची – chaitu

+0

+1 अच्छा उदाहरण कोड – tacaswell

उत्तर

1

आपके पास स्कॉइंग समस्या है, नया अपडेटर im जो आप अपने अद्यतनकर्ता में बनाते हैं उसे वापस नहीं किया जा रहा है, इसलिए लूप के माध्यम से दूसरी बार आप लाइनों की पहली परत को फिर से हटाने की कोशिश कर रहे हैं, जो इसे सही मायने में शिकायत करता है कि ऐसा नहीं हो सकता क्योंकि आपने उन्हें पहले ही हटा दिया है।

थोड़ा ट्वीक अपने कोड:

def main(): 
    seed(1234) 
    x = uniform(-2,2,100) 
    y = uniform(-2,2,100) 
    data = vstack((x*exp(-x**2-y**2),0.5*x*exp(-x**2-y**2),0.2*x*exp(-x**2-y**2))) 
    xi = linspace(min(x), max(x)) 
    yi = linspace(min(y), max(y)) 
    zi = [] 
    numframes = data.shape[0] 
    for ii in range(numframes): 
     zi.append(griddata((x, y), data[ii], (xi[None,:], yi[:,None]), method='cubic')) 

    fig = plt.figure() 
    im = plt.contour(xi, yi, zi[0], 15, linewidths=0.5, colors='k') 
    ax = fig.gca() 
    ani = animation.FuncAnimation(fig, update_contour_plot, frames=xrange(numframes), fargs=(zi, ax, fig, xi, yi), interval=100) 
    plt.colorbar(im) 
    plt.show() 
    return ani 


def update_contour_plot(i, data, ax, fig, xi, yi): 
    ax.cla() 
    im = ax.contour(xi, yi, data[i], 15, linewidths=0.5, colors='k') 
    plt.title(str(i)) 
    return im, 

एक अन्य विकल्प im किसी प्रकार की परिवर्तनशील बनाने के लिए (जैसे एक शब्दकोश में लपेट) ताकि अपने परिवर्तनों को फ्रेम करने के लिए फ्रेम से प्रचार करेंगे।

+0

ValueError के लिए में x: सूची पढ़ा plt.gca() collections.remove (coll) ValueError है .remove (x): x सूची में नहीं – chaitu

+0

@chaitu संपादित देखें। – tacaswell

+0

अब काम करता है। धन्यवाद! – chaitu