簡體   English   中英

matplotlib,使圖形線條平滑

[英]matplotlib, make smooth graph line

我在使連接圖上各點的線平滑時遇到麻煩。 這似乎更困難,因為我正在運行動畫圖,我在網上看到的所有示例都是針對靜態圖的。 我嘗試遵循此插值示例,但似乎無法正常工作。 那里有任何matplotlib專家嗎? 這是圖形的代碼。

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()

有多種平滑方法。 我們可能會考慮顯示平均值的線,或者是濾波函數或樣條線。 我在下面實現了這三種方法。

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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM