Как остановить анимацию matplotlib от печати пустого графика перед показом GIF? - PullRequest
0 голосов
/ 13 апреля 2020

Я выполняю анимацию с помощью matplotlib, анимация работает хорошо, но сначала она печатает пустой график, прежде чем печатать нужный GIF. Как это остановить? Ниже я добавляю код для анимации.

Я пытался удалить plt.show(), но после этого он не работал.

Моя функция показывает это:

enter image description here

, который мы пытаемся удалить. Далее следует наш GIF:

enter image description here

, который мы хотим сохранить. Единственная часть кода ниже, которая имеет значение, это последние несколько строк для этой проблемы. Я должен заранее извиниться, если это простой вопрос, я новичок в python.

# 2 D scaled BM     
#!apt install ffmpeg      
#!brew install imagemagick

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from IPython.display import Image 
from matplotlib import animation, rc
from IPython.display import HTML, Image # For GIF
rc('animation', html='html5')

np.random.seed(5)
# Set up formatting for the movie files
Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)


def generateRandomLines(dt, N,sigma):
    sigma1=sigma[0]
    sigma2=sigma[1]

    dX = np.sqrt(dt) * np.random.randn(1, N)
    X = np.cumsum(dX, axis=1)
    X = X * sigma1  # Scale X

    dY = np.sqrt(dt) * np.random.randn(1, N)
    Y = np.cumsum(dY, axis=1)
    Y = Y * sigma2 # Scale Y

    lineData = np.vstack((X, Y))

    return lineData

# Returns Line2D objects
def updateLines(num, dataLines, lines):
    for u, v in zip(lines, dataLines):
        u.set_data(v[0:2, :num])

    return lines

def ScaledBM(N = 301, T = 3.0,sigma1=(1,1)):
    dt = T/(N-1) 
    sigma01= sigma1[0]
    sigma02= sigma1[1]

    fig, ax = plt.subplots()

    data = [generateRandomLines(dt, N,sigma=sigma1)]
    Taxis =  T*max(sigma1[0],sigma1[1]) # use largest sigma to scale axis
    ax = plt.axes(xlim=(-Taxis, Taxis), ylim=(-Taxis, Taxis))

    ax.set_xlabel('X(t)')
    ax.set_ylabel('Y(t)')
    ax.set_title('2D Scaled Brownian Paths $\sigma_1$={},$\sigma_2$={}  \n T={} ,N={}, dt={}'.format(sigma01,sigma02,T,N,dt))

    ## Create a list of line2D objects
    lines = [ax.plot(dat[0, 0:1], dat[1, 0:1])[0] for dat in data]


    ## Create the animation object
    anim = animation.FuncAnimation(fig, updateLines, N+1, fargs=(data, lines), interval=30, repeat=True, blit=False)

    plt.tight_layout()
    plt.show()

    # Save as GIF
    anim.save('ScaledBM2d.gif', writer='pillow', fps=40)

# Run 1 (Show GIF in notebook) T=1, N=501
ScaledBM(N = 301, T = 3.0,sigma1=(1,5)) # Run to create

Image(open('/content/ScaledBM2d.gif','rb').read())
...