PyPlot के साथ प्लॉट स्मूथ लाइन


112

मुझे निम्नलिखित सरल स्क्रिप्ट मिली है, जिसमें एक ग्राफ दिया गया है:

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 में मैंने प्लॉट किया होगा smooth cplines

क्या PyPlot में ऐसा करने का एक आसान तरीका है? मुझे कुछ ट्यूटोरियल मिले हैं, लेकिन वे सभी जटिल लगते हैं।

जवाबों:


167

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

स्लाइन 0.19.0 में स्क्रिप में पदावनत किया गया है, इसके बजाय BSpline क्लास का उपयोग करें।

से बदलने के splineलिए BSplineएक सीधी कॉपी / पेस्ट नहीं है और एक छोटे से tweaking की आवश्यकता है:

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

इससे पहले: स्क्रीनशॉट 1

उपरांत: स्क्रीनशॉट 2


2
हाहा, यह मुश्किल नहीं था। चीयर्स! :) दूसरों के लिए बस एक नोट जो लग सकता है: मुझे linspace () का उपयोग करने के लिए डरपोक आयात करना पड़ा।
पॉल

उफ़, माफ़ करना, इस्तेमाल करना चाहिए था np.linspace। मेरे जवाब में सही है।
ओलिवियर वर्डियर

2
300. T.min () और T.max () के बीच कितने बिंदु हैं। मैंने 1000 का उपयोग किया और यह समान दिखता है। हालांकि 5 के साथ प्रयास करें और आपको एक अंतर दिखाई देगा।
कार्नस्मिथ

2
splineपदावनत किया गया है! स्लाइन 0.19.0 में स्‍प्रेच किया गया है, इसके बजाय BSpline क्‍लास का उपयोग करें:from scipy.interpolate import BSpline
user890739

2
यह काम नहीं करेगा यदि T सॉर्ट नहीं किया गया है। और यह भी कि अगर फंक्शनलटन (T) वन-टू-वन नहीं है।
रहमत

28

इस उदाहरण के लिए स्पलाइन अच्छी तरह से काम करती है, लेकिन यदि फ़ंक्शन स्वाभाविक रूप से सुचारू नहीं है और आप स्मूथेड वर्जन लेना चाहते हैं, तो आप भी कोशिश कर सकते हैं:

from scipy.ndimage.filters import gaussian_filter1d

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

यदि आप सिग्मा को बढ़ाते हैं तो आप अधिक सुचारू कार्य कर सकते हैं।

इस एक के साथ सावधानी से आगे बढ़ें। यह मूल मूल्यों को संशोधित करता है और हो सकता है कि आप क्या चाहते हैं।


10
इस एक के साथ सावधानी से आगे बढ़ें। यह मूल मूल्यों को संशोधित करता है और हो सकता है कि आप क्या चाहते हैं।
tartaruga_casco_mole

8

मुझे लगता है कि आप वक्र-फिटिंग का मतलब है और आपके प्रश्न के संदर्भ से अलियासिंग नहीं । PyPlot के पास इसके लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन आप आसानी से कुछ बुनियादी वक्र-फिटिंग को लागू कर सकते हैं, जैसे यहां देखे गए कोड , या यदि आप GuiQwt का उपयोग कर रहे हैं तो इसमें वक्र फिटिंग मॉड्यूल है । (आप शायद ऐसा करने के लिए SciPy से कोड भी चुरा सकते हैं )।


धन्यवाद। मैंने दस अलग-अलग समीकरणों की कोशिश की और [चौरसाई / प्रक्षेप के लिए रेडियल आधार कार्यों का उपयोग करना] [1] rbf = Rbf(x, y), fi = rbf(xi)उनमें से सबसे अच्छा था। [१]: scipy-cookbook.readthedocs.io/items/RadialBasisFunctions.html ,
क्लाउड चो

1

scipy.interpolateकुछ उदाहरणों के लिए प्रलेखन देखें ।

निम्न उदाहरण रेखीय और क्यूबलाइन अंतर प्रक्षेप के लिए इसके उपयोग को प्रदर्शित करता है:

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

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.