পাইপ্লট এর সাথে প্লট স্মুথ লাইন


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

যেমনটি এখন, লাইনটি সরাসরি বিন্দুতে চলে যায় যা দেখতে ঠিক আছে তবে আমার মতে এটি আরও ভাল হতে পারে। আমি যা চাই তা হল পয়েন্টগুলির মধ্যে লাইনটি মসৃণ করা। জ্ঞানপ্লোটে আমি ষড়যন্ত্র করতাম smooth cplines

পাইপ্লট-এ এটি করার কোনও সহজ উপায় আছে? আমি কিছু টিউটোরিয়াল পেয়েছি, তবে এগুলি সমস্ত জটিল বলে মনে হচ্ছে।

উত্তর:


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 এ অবহেলা করা হয়েছে, পরিবর্তে বিএসপ্লাইন ক্লাস ব্যবহার করুন।

থেকে স্যুইচ 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()

আগে: স্ক্রিনশট 1

পরে: স্ক্রিনশট 2


2
হাহা, এটা খুব কঠিন ছিল না। চিয়ার্স! :) অন্যের জন্য কেবল একটি নোট যা দেখতে পাচ্ছে: লিনস্পেস () ব্যবহার করতে আমাকে স্কিপি আমদানি করতে হয়েছিল।
পল

ওফস, দুঃখিত, ব্যবহার করা উচিত ছিল np.linspace। আমার উত্তরে সংশোধন করা হয়েছে।
অলিভিয়ার ভারদিয়ার

2
300 টি টিমিন () এবং টি.ম্যাক্স () এর মধ্যে কতগুলি পয়েন্ট বানাতে হবে 300 আমি 1000 ব্যবহার করেছি এবং এটি দেখতে একই রকম। 5 দিয়ে চেষ্টা করুন এবং আপনি একটি পার্থক্য দেখতে পাবেন।
কর্নস্মিথ

2
splineঅবচয় হয়! স্প্লাইনটি স্কিপি 0.19.0 এ অবহিত করা হয়েছে, পরিবর্তে বিএসপ্লাইন ক্লাস ব্যবহার করুন:from scipy.interpolate import BSpline
ব্যবহারকারী 9090739

2
টি বাছাই না করা হলে এটি কাজ করবে না। এবং যদি ফান্টিটন (টি) এক-এক-না হয়।
রাহাত জামান

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 ব্যবহার করছেন যদি এটি একটি বক্ররেখা ফিটিং হয়েছে মডিউল । (আপনি সম্ভবত এটি করতে সায়পাই থেকে কোডও চুরি করতে পারেন)।


ধন্যবাদ। আমি দশটি ভিন্ন সমীকরণ চেষ্টা করেছি এবং [স্মুথিং / ইন্টারপোলেশন জন্য রেডিয়াল বেস ফাংশনগুলি ব্যবহার করে] [1] rbf = Rbf(x, y), fi = rbf(xi)তাদের মধ্যে সেরা ছিল। [1]: scipy-cookbook.readthedocs.io/items/RialialBasisFunction.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()

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.