Langsame und glatte Zeichnungslinien python matplotlib

Ich benutze Matplotlib zum Zeichnen von Graphen wie glatten Linien. Es ist kein Problem für mich zu zeichnen, aber ich habe Probleme mit Animationen.

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

Also, ich habe Array, wie zum Beispiel:

  • Override Python's 'in' Operator?
  •  a = [0,1,2,4,5,8,9,12,14,18,22,17,30,37,29,45] 

    Und ich muss es glatte Punkt-zu-Punkt zeichnen. Jetzt habe ich diese Saiten:

     for i in range(len(a)-1): desty = np.append(desty,np.linspace(a[i],a[i+1],n)) destx = np.append(destx,np.linspace(i,i+1,n)) 

    Das erlaubt mir, ohne Probleme zu zeichnen (und animationen :))

    Den vollständigen Code:

     # First set up the figure, the axis, and the plot element we want to animate fig = plt.figure() ax = plt.axes(xlim=(0, 50), ylim=(0, 50)) line, = ax.plot([], [], lw=2) global x global y global n global a n=5 a = [0,1,2,4,5,8,9,12,14,18,22,17,30,37,29,45] global desty,destx desty = np.linspace(0,0,n) destx = np.linspace(0,0,n) for i in range(len(a)-1): desty = np.append(desty,np.linspace(a[i],a[i+1],n)) destx = np.append(destx,np.linspace(i,i+1,n)) # initialization function: plot the background of each frame def init(): line.set_data([], []) return line, # animation function. This is called sequentially def animate(i): global destx global desty x=destx y=desty line.set_data(x, y) return line, # call the animator. blit=True means only re-draw the parts that have changed. anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True) plt.show() 

    Erlaubt mir, es nur zu zeichnen, aber wie kann ich es langsam und glatten Punkt zu Punkt?

    Ich benutze python 2.7, centos 7

  • Escaping Zitate in bash Befehl mit Subprocess Call und shlex
  • Schreiben Sie escaped Zeichen zu Datei, so dass das Zeichen sichtbar ist
  • Was ist die beste Flucht Charakter Strategie für Python / MySQL Combo?
  • Json.dumps (): escaping forward schrägstriche
  • Ersetzen Sie ein Zeichen mit Backslash Bug - Python
  • Wie kann ich einen ungültigen JSON-String automatisch beheben?
  • 2 Solutions collect form web for “Langsame und glatte Zeichnungslinien python matplotlib”

    Sie können Ihre Plotterroutine bis zu:

     import numpy as np import random as random from matplotlib import pyplot as plt from matplotlib import animation # First set up the figure, the axis, and the plot element we want to animate fig = plt.figure() ax = plt.axes(xlim=(0, 50), ylim=(0, 50)) line, = ax.plot([], [], lw=2) n=5 a = [0,1,2,4,5,8,9,12,14,18,22,17,30,37,29,45] x = [] y = [] # initialization function: plot the background of each frame def init(): line.set_data([], []) return line, # animation function. This is called sequentially def animate(i): x.append(np.linspace(i,i+1,n)) y.append(np.linspace(a[i],a[i+1],n)) line.set_data(x,y) return line, # call the animator. blit=True means only re-draw the parts that have changed. anim = animation.FuncAnimation(fig, animate, np.arange(0,len(a)-1) ,init_func=init, interval=200, blit=True, repeat=False) plt.show() 

    Dinge zu beachten:

    • Du brauchst keine global Variablen dafür
    • Sie wollen nicht x und y außerhalb der Animation, sondern drinnen für die Handlung zu entwickeln (in Ihrem Fall hatten Sie die komplette x und y eingerichtet, so dass die Animation würde nur die gesamte Grafik zu zeichnen)
    • Du musst ein interable zum animate (das i ); Dies ist der dritte Eingang zu FuncAnimationnp.arange(0,len(a)-1) .
    • Set repeat=False , um nach einem Lauf zu stoppen und um die Kurve zu vermeiden
    • Ich erhöhte das interval , um die Handlung langsamer zu entwickeln

    Du musst i in deiner animierten Funktion benutzen, sonst gibt es einfach immer das Gleiche hin und her, was du siehst.

     import numpy as np import random as random from matplotlib import pyplot as plt from matplotlib import animation # First set up the figure, the axis, and the plot element we want to animate fig = plt.figure() ax = plt.axes(xlim=(0, 50), ylim=(0, 50)) line, = ax.plot([], [], lw=2) global x global y global n global a n=5 a = [0,1,2,4,5,8,9,12,14,18,22,17,30,37,29,45] global desty,destx desty = np.linspace(0,0,n) destx = np.linspace(0,0,n) plot_me_x = [] plot_me_y = [] for i in range(len(a)-1): desty = np.append(desty, np.linspace(a[i],a[i+1],n)) destx = np.append(destx, np.linspace(i,i+1,n)) plot_me_x.append(np.array(destx)) # keep a copy of the intermediaries to plot later plot_me_y.append(np.array(desty)) # initialization function: plot the background of each frame def init(): line.set_data([], []) return line, # animation function. This is called sequentially def animate(i): global destx global desty x=plot_me_x[i] y=plot_me_y[i] line.set_data(x, y) return line, # call the animator. blit=True means only re-draw the parts that have changed. anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(a)-1, interval=20, blit=True) plt.show() 

    Für die Handlung, um bei jeder Animation anders auszusehen, muss i bei jedem Iteration etwas hinzufügen, das bei jeder Iteration anders aussieht. Obwohl desty und destx an allmählich in der Iteration angehängt werden, die sie baut, ist das Endergebnis nicht dieser allmähliche Aufbau, sondern eine einzige Sache, also musst du die Vermittler dieses Builds retten. Ich habe das mit plot_me_x und y .

    Ich schrieb diese Antwort mit minimalen Änderungen an den OP-Code, um deutlich zu machen, wo der Fehler war. Insgesamt haben die Änderungen, die @Schorsch zu einem insgesamt sauberen Ansatz geführt (zB ohne globals).

    Python ist die beste Programmiersprache der Welt.