2016-12-14 3 views
0

Ich habe Probleme, die Linie, die die Punkte auf meinem Diagramm glatt zu verbinden. Es scheint schwieriger zu sein, da ich ein animiertes Diagramm verwende, alle Beispiele, die ich online gesehen habe, sind für statische Graphen. Ich habe versucht, diesem Interpolationsbeispiel zu folgen, aber ich kann es nicht funktionieren. Irgendwelche Matplotlib-Gurus da draußen? Hier ist der Code für das Diagramm.matplotlib, machen glatte Linie

import psutil 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
import matplotlib.animation as animation 
from collections import deque 


fig = plt.figure() 
ax = plt.axes(xlim=(0, 200), ylim=(0, 100)) 
line, = ax.plot([],[]) 

y_list = deque([-1]*200) 
x_list = deque(np.arange(200,0,-1)) 


def init(): 
    line.set_data([],[]) 
    return line, 


def animate(i): 
    y_list.pop() 
    y_list.appendleft(psutil.cpu_percent(None,False)) 
    line.set_data(x_list,y_list) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
          frames=200, interval=100, blit=True) 

plt.show() 
+0

Mögliches Duplikat [Langsam und glatt Zeichnen von Linien Python matplotlib] (http://stackoverflow.com/questions/27385619/slow-and-smooth-drawing-lines-python-matplotlib) –

+0

@MikeJSChoi Kein Duplikat. In dieser Frage bezieht sich "Glätten" auf das Glätten der Linie auf dem Bildschirm, während sich in der verknüpften Frage "Glätten" auf den Übergang in der Animation bezieht. – ImportanceOfBeingErnest

+0

@HexxNine Was ist "dieses Interpolationsbeispiel"? Kannst du es verlinken? Sie müssten auch sagen, was genau Sie mit der glatten Linie meinen? Eine gerade Linie, die die mittlere oder eine gekrümmte Linie zeigt? Inwiefern funktionieren andere Interpolationsbeispiele nicht für Sie? Wo genau ist das Problem? – ImportanceOfBeingErnest

Antwort

1

Es gibt verschiedene Arten von Glättungen. Wir können über eine Linie nachdenken, die den Mittelwert oder eine Filterfunktion oder einen Spline zeigt. Ich habe alle drei Methoden implementiert.

import psutil 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
import matplotlib.animation as animation 
from collections import deque 

import scipy.ndimage.filters 
import scipy.interpolate 


fig = plt.figure() 
ax = plt.axes(xlim=(0, 200), ylim=(0, 100)) 
line, = ax.plot([],[], color="b", label="cpu") 
mean_line, = ax.plot([],[], linestyle="--", color="k",label="mean") 
filter_line, = ax.plot([],[], linewidth=2, color="r", label="gauss filter") 
interp_line, = ax.plot([],[], linewidth=1.5, color="purple", label="spline") 

plt.legend() 
y_list = deque([-1]*200) 
x_list = deque(np.arange(200,0,-1)) 


def init(): 
    line.set_data([],[]) 
    return line, 


def animate(i): 
    y_list.pop() 
    y_list.appendleft(psutil.cpu_percent(None,False)) 
    line.set_data(x_list,y_list) 
    x = np.array(x_list) 
    y = np.array(y_list) 
    filtered = scipy.ndimage.filters.gaussian_filter1d(y, sigma=4) 

    mean_line.set_data(x, np.ones_like(x)*y.mean()) 
    filter_line.set_data(x,filtered) 
    try: 
     tck = scipy.interpolate.splrep(x[::-1], y[::-1], s=50000) 
     interpolated = scipy.interpolate.splev(x[::-1], tck, der=0) 
     interp_line.set_data(x,interpolated[::-1]) 
    except: 
     pass 

    return line,filter_line,mean_line,interp_line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
          frames=200, interval=100, blit=True) 

plt.show() 

enter image description here

Verwandte Themen