PyPlot ile düzgün bir çizgi çizin


112

Bir grafiği çizen aşağıdaki basit komut dosyam var:

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

Şimdi olduğu gibi, çizgi bir noktadan diğerine gidiyor ki bu iyi görünüyor, ancak bence daha iyi olabilir. İstediğim, noktalar arasındaki çizgiyi düzeltmek. Gnuplot'ta bir komplo kurardım smooth cplines.

PyPlot'ta bunu yapmanın kolay bir yolu var mı? Bazı öğreticiler buldum ama hepsi oldukça karmaşık görünüyor.

Yanıtlar:


167

scipy.interpolate.splineVerilerinizi kendiniz düzeltmek için kullanabilirsiniz :

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

spline, scipy 0.19.0'da kullanımdan kaldırılmıştır, bunun yerine BSpline sınıfını kullanın.

'Dan' a splinegeçmek BSplinebasit bir kopyalama / yapıştırma değildir ve biraz ince ayar gerektirir:

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

Önce: ekran görüntüsü 1

Sonra: ekran görüntüsü 2


2
Haha, bu zor değildi. Şerefe! :) Bakanlar için bir not: linspace () kullanmak için scipy'yi içe aktarmak zorunda kaldım.
Paul

Üzgünüm, kullanmalıydım np.linspace. Cevabımda düzeltildi.
Olivier Verdier

2
300, T.min () ile T.max () arasında kaç nokta yapılacağıdır. 1000 kullandım ve aynı görünüyor. Yine de 5 ile deneyin ve bir fark göreceksiniz.
CornSmith

2
splinekullanımdan kaldırıldı! spline, scipy 0.19.0'da kullanımdan kaldırılmıştır, bunun yerine BSpline sınıfını kullanın:from scipy.interpolate import BSpline
user890739

2
T sıralanmamışsa bu çalışmayacaktır. Ve ayrıca işlev (T) bire bir değilse.
Rahat Zaman

28

Bu örnek için spline iyi çalışıyor, ancak işlev doğası gereği düzgün değilse ve düzeltilmiş bir sürüme sahip olmak istiyorsanız, şunları da deneyebilirsiniz:

from scipy.ndimage.filters import gaussian_filter1d

ysmoothed = gaussian_filter1d(y, sigma=2)
plt.plot(x, ysmoothed)
plt.show()

sigmayı artırırsanız, daha düzgün bir işlev elde edebilirsiniz.

Bununla dikkatli bir şekilde ilerleyin. Orijinal değerleri değiştirir ve istediğiniz şey olmayabilir.


10
Bununla dikkatli bir şekilde ilerleyin. Orijinal değerleri değiştirir ve istediğiniz şey olmayabilir.
tartaruga_casco_mole

8

Sorunuz bağlamında kenar yumuşatma değil, eğri uydurmayı kastettiğinizi varsayıyorum . PyPlot'un bunun için herhangi bir yerleşik desteği yoktur, ancak burada görülen kod gibi bazı temel eğri uydurmayı kendiniz kolayca uygulayabilirsiniz veya GuiQwt kullanıyorsanız, bir eğri uydurma modülüne sahiptir . (Bunu yapmak için muhtemelen kodu SciPy'den de çalabilirsiniz ).


Teşekkürler. On farklı denklem denedim ve [Düzeltme / enterpolasyon için radyal temel fonksiyonlarını kullanma] [1] rbf = Rbf(x, y), fi = rbf(xi)aralarında en iyisiydi. [1]: scipy-cookbook.readthedocs.io/items/RadialBasisFunctions.html ,
Cloud Cho

1

scipy.interpolateBazı örnekler için belgelere bakın .

Aşağıdaki örnek, doğrusal ve kübik spline enterpolasyonu için kullanımını gösterir:

>>> from scipy.interpolate import interp1d

>>> x = np.linspace(0, 10, num=11, endpoint=True)
>>> y = np.cos(-x**2/9.0)
>>> f = interp1d(x, y)
>>> f2 = interp1d(x, y, kind='cubic')

>>> xnew = np.linspace(0, 10, num=41, endpoint=True)
>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
>>> plt.legend(['data', 'linear', 'cubic'], loc='best')
>>> plt.show()

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.