Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用PyPlot绘制平滑线_Python_Matplotlib_Plot_Smoothing - Fatal编程技术网

Python 用PyPlot绘制平滑线

Python 用PyPlot绘制平滑线,python,matplotlib,plot,smoothing,Python,Matplotlib,Plot,Smoothing,我有一个简单的脚本来绘制一个图表: import matplotlib.pyplot as plt import numpy as np T = np.array([6, 7, 8, 9, 10, 11, 12]) power = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00]) plt.plot(T,power) plt.show() 现在,这条线从一点到另一点是直线,看起来还

我有一个简单的脚本来绘制一个图表:

import matplotlib.pyplot as plt
import numpy as np

T = np.array([6, 7, 8, 9, 10, 11, 12])
power = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00])

plt.plot(T,power)
plt.show()
现在,这条线从一点到另一点是直线,看起来还可以,但在我看来可能更好。我想要的是平滑点之间的线。在Gnuplot中,我会用
平滑的cplines
绘制


在PyPlot中有没有一种简单的方法可以做到这一点?我找到了一些教程,但它们看起来都很复杂。

我猜你的意思是,而不是从你问题的上下文来看。PyPlot对此没有任何内置支持,但是您可以自己轻松地实现一些基本的曲线拟合,就像看到的代码一样,或者如果您使用的是GuiQwt,它有一个曲线拟合。(您可能还可以从中窃取代码来执行此操作)。

您可以使用
scipy.interpolate.spline
自行平滑数据:

from scipy.interpolate import spline

# 300 represents number of points to make between T.min and T.max
xnew = np.linspace(T.min(), T.max(), 300)  

power_smooth = spline(T, power, xnew)

plt.plot(xnew,power_smooth)
plt.show()

scipy 0.19.0中不推荐使用样条曲线,请改用BSpline类

spline
切换到
BSpline
不是一个简单的复制/粘贴过程,需要进行一些调整:

from scipy.interpolate import make_interp_spline, BSpline

# 300 represents number of points to make between T.min and T.max
xnew = np.linspace(T.min(), T.max(), 300) 

spl = make_interp_spline(T, power, k=3)  # type: BSpline
power_smooth = spl(xnew)

plt.plot(xnew, power_smooth)
plt.show()

之前:

之后:

对于本例,样条曲线运行良好,但如果函数本身并不平滑,并且您希望使用平滑版本,也可以尝试:

from scipy.ndimage.filters import gaussian_filter1d

ysmoothed = gaussian_filter1d(y, sigma=2)
plt.plot(x, ysmoothed)
plt.show()
如果你增加sigma,你可以得到一个更平滑的函数


小心处理这个。它会修改原始值,可能不是您想要的。

有关一些示例,请参阅文档

以下示例演示了其在线性和三次样条插值中的使用:

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d

# Define x, y, and xnew to resample at.
x = np.linspace(0, 10, num=11, endpoint=True)
y = np.cos(-x**2/9.0)
xnew = np.linspace(0, 10, num=41, endpoint=True)

# Define interpolators.
f_linear = interp1d(x, y)
f_cubic = interp1d(x, y, kind='cubic')

# Plot.
plt.plot(x, y, 'o', label='data')
plt.plot(xnew, f_linear(xnew), '-', label='linear')
plt.plot(xnew, f_cubic(xnew), '--', label='cubic')
plt.legend(loc='best')
plt.show()

略微修改以提高可读性


以下是日期的简单解决方案:

从scipy.interpolate导入生成插值样条线
将numpy作为np导入
将matplotlib.pyplot作为plt导入
将matplotlib.dates导入为日期
从日期时间导入日期时间
数据={
日期时间(2016,9,26,0,0):26060,日期时间(2016,9,27,0,0):23243,
datetime(2016,9,28,0,0):22534,datetime(2016,9,29,0,0):22841,
日期时间(2016,9,30,0,0):22441,日期时间(2016,10,1,0,0):23248
}
#创建数据
date\u np=np.array(list(data.keys()))
value\u np=np.array(列表(data.values())
date\u num=dates.date2num(date\u np)
#光滑的
date\u num\u smooth=np.linspace(date\u num.min(),date\u num.max(),100)
spl=生成插值样条曲线(日期、数值、k=3)
值\u np\u平滑=spl(日期\u数量\u平滑)
#印刷品
plt.绘图(日期、价值)
plt.plot(dates.num2date(date\u num\u smooth),value\u np\u smooth)
plt.show()

另一种方法,根据您使用的参数对函数进行轻微修改:

from statsmodels.nonparametric.smoothers_lowess import lowess

def smoothing(x, y):
    lowess_frac = 0.15  # size of data (%) for estimation =~ smoothing window
    lowess_it = 0
    x_smooth = x
    y_smooth = lowess(y, x, is_sorted=False, frac=lowess_frac, it=lowess_it, return_sorted=False)
    return x_smooth, y_smooth

这比其他答案更适合我的具体应用案例。

spline
不推荐使用!scipy 0.19.0中不推荐使用样条曲线,请改用BSpline类:
from scipy.interpolate import BSpline
如果未对T进行排序,则此操作无效。此外,如果函数(T)不是一对一。您可能想让
#BSpline对象
注释一个类型提示,例如
spl=make_interp_spline(T,power,k=3)#type:BSpline对象
,以便导入BSpline可以稍微更有效地使用。。。还是其他方面需要它?我在这里提醒你:)(另外,让coments更具PEP8风格也没什么坏处,毕竟它是“公开的代码”。)但总的来说:谢谢你的例子!什么是
k=3
?@AminGuermazi
k=3
是样条曲线的插值次数:。因此,如果使用更高的数字,如
k=6
,曲线应该更平滑。请谨慎使用此数字。它会修改原始值,可能不是您想要的。如果实际效果不好,请将整个函数展平,并停止跟踪所有点…谢谢。我尝试了十种不同的方程,[使用径向基函数进行平滑/插值][1]
rbf=rbf(x,y),fi=rbf(xi)
是其中最好的。[1]: ,