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
하하, 어렵지 않았어요. 건배! :)보고있을 수있는 다른 사용자를위한 참고 사항 : linspace ()를 사용하려면 scipy를 가져와야했습니다.
Paul

죄송합니다.을 (를) 사용해야합니다 np.linspace. 내 대답에서 수정되었습니다.
Olivier Verdier 2011 년

2
300은 T.min ()과 T.max () 사이에 몇 점을 만들지입니다. 1000을 사용했는데 똑같아 보입니다. 그래도 5로 시도하면 차이를 볼 수 있습니다.
CornSmith 2015 년

2
spline더 이상 사용되지 않습니다! spline은 scipy 0.19.0에서 더 이상 사용되지 않습니다. 대신 BSpline 클래스를 사용하십시오.from scipy.interpolate import BSpline
user890739

2
T가 정렬되지 않으면 작동하지 않습니다. 또한 functiton (T)이 일대일이 아닌 경우에도 마찬가지입니다.
Rahat Zaman

28

이 예제에서는 스플라인이 잘 작동하지만 기능이 본질적으로 부드럽 지 않고 스무딩 된 버전을 원할 경우 다음을 시도 할 수도 있습니다.

from scipy.ndimage.filters import gaussian_filter1d

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

시그마를 늘리면 더 부드러운 함수를 얻을 수 있습니다.

이것으로주의해서 진행하십시오. 원래 값을 수정하고 원하는 값이 아닐 수 있습니다.


10
이것으로주의해서 진행하십시오. 원래 값을 수정하고 원하는 값이 아닐 수 있습니다.
tartaruga_casco_mole nov.

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몇 가지 예 는 설명서를 참조하십시오 .

다음 예제는 선형 및 3 차 스플라인 보간에 대한 사용을 보여줍니다.

>>> 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.