พล็อตเส้นเรียบด้วย 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()

spline เลิกใช้แล้วใน 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()

ก่อน: ภาพหน้าจอ 1

หลังจาก: ภาพหน้าจอ 2


2
ฮ่า ๆ นั่นไม่ใช่เรื่องยาก ไชโย! :) เพียงบันทึกสำหรับคนอื่น ๆ ที่อาจกำลังมองหา: ฉันต้องนำเข้า scipy เพื่อใช้ linspace ()
พอล

np.linspaceโอ๊ะขอโทษควรจะใช้ แก้ไขในคำตอบของฉัน
Olivier Verdier

2
300 คือจำนวนคะแนนที่ต้องทำระหว่าง T.min () และ T.max () ฉันใช้ 1000 และดูเหมือนกัน ลองด้วย 5 แล้วคุณจะเห็นความแตกต่าง
CornSmith

2
splineเลิกใช้แล้ว! spline เลิกใช้แล้วใน scipy 0.19.0 ใช้คลาส BSpline แทน:from scipy.interpolate import BSpline
user890739

2
สิ่งนี้จะไม่ทำงานหากไม่เรียงลำดับ T และถ้า functiton (T) ไม่ใช่แบบตัวต่อตัว
Rahat Zaman

28

สำหรับ spline ตัวอย่างนี้ใช้งานได้ดี แต่ถ้าฟังก์ชันไม่ราบรื่นโดยเนื้อแท้และคุณต้องการให้มีเวอร์ชันที่ราบรื่นคุณสามารถลอง:

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เพื่อทำสิ่งนี้ได้เช่นกัน)


ขอบคุณ. ฉันลองใช้สมการที่แตกต่างกัน 10 สมการและ [การใช้ฟังก์ชันพื้นฐานเรเดียลสำหรับการปรับให้เรียบ / การแก้ไข] [1] rbf = Rbf(x, y), fi = rbf(xi)ดีที่สุด [1]: scipy-cookbook.readthedocs.io/items/RadialBasisFunctions.html ,
Cloud Cho

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.