使用matplotlib设置线的动画

2024-04-29 19:15:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用matplotlib创建一个动画,有多条线,没有链接

我可以通过以下方式创建:

def animate(i) :
    a = []
    a.append((x1,x2))
    a.append((y1,y2))
    a.append('b')
    a.append((x3,x4))
    a.append((y3,y4))
    a.append('r')
    a.append((x5,x6))
    a.append((y5,y6))
    a.append('g')
    a = plt.plot(*a)
    return a
ani = animation.FuncAnimation(fig, animate, frames = 10, blit = True, interval = 50, save_count = 50, repeat = False) 

使用此代码,我无法设置行的线宽

我试图将plt.plot直接添加到,但zorder有一个错误

我能做什么

谢谢

PS:我为我糟糕的英语道歉

编辑:我的代码如下

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation # pour l'animation
import matplotlib.lines as lines

nombre_etapes = 0

nombre_disques = 4

etapes = []
#on crée l'état initial : tous les disques sur le bâton 0
etapes.append([[i for i in range(nombre_disques, 0, -1)], [], []])
print("état initial : ")
print(etapes)

mouvements = [None]
def hanoi(n, origine, destination, intermediaire) :
    global nombre_etapes
    #global etapes
    if n > 0 :        
        hanoi(n - 1, origine, intermediaire, destination)
        nombre_etapes += 1
        #on crée le nouvel état        
        etat_actuel = [x for x in etapes[-1]]
        #print("état actuel avant mouvement", etat_actuel)
        disque_a_bouger = etat_actuel[origine].pop()
        #print("disque qui bouge : {}".format(disque_a_bouger))
        etat_actuel[destination].append(disque_a_bouger)
        #print("état actuel après mouvement", etat_actuel)
        etapes.append(etat_actuel)
        #print("etapes : ")
        #print(etapes)
        print(str(origine) + " --> " + str(destination))
        mouvements.append([origine, destination])
        hanoi(n - 1, intermediaire, destination, origine)
        nombre_etapes += 1

#longueurs pour dessin
rayon = 10
ecart_vertical = 0.5
epaisseur_disque = 0.5
epaisseur_baton = 2

hanoi(nombre_disques,0,2,1)
#print(mouvements)

etat = [[i for i in range(nombre_disques, 0, -1)], [], []]

def dessine_batons() :
    batons = []
    for idBaton in range(3) :
        abscisse = (2 * idBaton + 1) * nombre_disques * rayon + 2 * idBaton * rayon
        ordonnee_1 = 0
        ordonnee_2 = 4 * ecart_vertical + epaisseur_disque * nombre_disques
        batons.append((abscisse, abscisse))
        batons.append((ordonnee_1, ordonnee_2))
        batons.append('b')
    #print(batons)
    batons = plt.plot(*batons)
    return batons



fig, ax = plt.subplots()
abscisse = 3 * nombre_disques * rayon + 2 * rayon
ordonnee = ecart_vertical
disques = [[]]

couleurs = ["", "red", "blue", "grey", "green", "black", "cyan", "magenta", "crimson", "pink", "orange"]
for idDisque in range(nombre_disques, 0, -1) :
    abscisses = [abscisse - idDisque * rayon, abscisse + idDisque * rayon]
    ordonnees = [ordonnee, ordonnee]
    ordonnee += ecart_vertical + epaisseur_disque
    disque, = ax.plot(abscisses, ordonnees, c = couleurs[idDisque], linewidth = 20, zorder = 1)
    disques.append(disque)




def animate_5(idEtape, disques) :
    if idEtape != 0 :         
        #on récupère le mouvement
        mouvement = mouvements[idEtape]
        origine, destination = mouvement
        disque_qui_bouge = etat[origine].pop()
        etat[destination].append(disque_qui_bouge)
    for idBaton in range(3) :
        abscisse = (2 * idBaton + 1) * nombre_disques * rayon + 2 * idBaton * rayon
        ordonnee = ecart_vertical
        for disque in etat[idBaton] :
            abscisses = [abscisse - disque * rayon, abscisse + disque * rayon]
            ordonnees = [ordonnee, ordonnee]
            disques[disque].set_data(abscisses, ordonnees)
            disques[disque].set_zorder(disque)
            ordonnee += ecart_vertical + epaisseur_disque
    plt.pause(0.1)
    return disques



plt.axis([-10, 5 * nombre_disques * rayon + 4 * rayon + nombre_disques * rayon + 5, 0, 4 * ecart_vertical + epaisseur_disque * nombre_disques + 5])

ani = animation.FuncAnimation(fig, animate_5, init_func = dessine_batons, fargs = [disques], frames = len(mouvements), blit = False, interval = 50, save_count = 50, repeat = False) 


plt.show()

"


Tags: pltdestinationprintappenddisquenombreetatrayon
1条回答
网友
1楼 · 发布于 2024-04-29 19:15:36

只需遵循三个步骤:

  • 在初始化阶段创建一些艺术家
  • update函数中更新它们的坐标
  • 别忘了返回更新艺术家的列表

^{bq 1}$ ^{pr 1}$

Reference:


根据matplotlib.animation.FuncAnimation

If blit == True, func must return an iterable of all artists that were modified or created. This information is used by the blitting algorithm to determine which parts of the figure have to be updated.

The return value is unused if blit == False and may be omitted in that case.

你的animate_5()最后返回disques。您可以使用[[]]初始化disques。空列表不是艺术家。您应该修改逻辑文件以消除它

相关问题 更多 >