<질문>
그래프를 그리는 다음과 같은 간단한 스크립트가 있습니다.
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에서 쉽게 수행 할 수있는 방법이 있습니까? 몇 가지 튜토리얼을 찾았지만 모두 다소 복잡해 보입니다.
<답변1>
당신은 사용할 수 있습니다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()
<답변2>
이 예제에서는 스플라인이 잘 작동하지만 기능이 본질적으로 매끄럽지 않고 매끄럽게 된 버전을 원할 경우 다음을 시도 할 수도 있습니다.
from scipy.ndimage.filters import gaussian_filter1d
ysmoothed = gaussian_filter1d(y, sigma=2)
plt.plot(x, ysmoothed)
plt.show()
시그마를 늘리면 더 부드러운 함수를 얻을 수 있습니다.
이것으로주의해서 진행하십시오. 원래 값을 수정하고 원하는 값이 아닐 수 있습니다.
<답변3>
당신이 의미하는 것 같아요curve-fitting그리고 아닙니다anti-aliasing질문의 맥락에서. PyPlot에는 이에 대한 기본 지원이 없지만 표시된 코드와 같이 몇 가지 기본 곡선 맞춤을 쉽게 구현할 수 있습니다.here, 또는 GuiQwt를 사용하는 경우 곡선 피팅이 있습니다.module. (아마도 코드를 훔칠 수 있습니다.SciPy이를 위해).
<답변4>
참조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) >>> matplotlib.pyplot을 plt로 가져 오기 >>> plt.plot (x, y, 'o', xnew, f (xnew), '-', xnew, f2 (xnew ), '-') >>> plt.legend ([ 'data', 'linear', 'cubic'], loc = 'best') >>> plt.show ()
<답변5>
다음은 날짜에 대한 간단한 솔루션입니다.
from scipy.interpolate import make_interp_spline
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as dates
from datetime import datetime
data = {
datetime(2016, 9, 26, 0, 0): 26060, datetime(2016, 9, 27, 0, 0): 23243,
datetime(2016, 9, 28, 0, 0): 22534, datetime(2016, 9, 29, 0, 0): 22841,
datetime(2016, 9, 30, 0, 0): 22441, datetime(2016, 10, 1, 0, 0): 23248
}
#create data
date_np = np.array(list(data.keys()))
value_np = np.array(list(data.values()))
date_num = dates.date2num(date_np)
# smooth
date_num_smooth = np.linspace(date_num.min(), date_num.max(), 100)
spl = make_interp_spline(date_num, value_np, k=3)
value_np_smooth = spl(date_num_smooth)
# print
plt.plot(date_np, value_np)
plt.plot(dates.num2date(date_num_smooth), value_np_smooth)
plt.show()
'개발 > Python' 카테고리의 다른 글
[파이썬] 기본이 아닌 인수가 기본 인수를 따를 수없는 이유는 무엇입니까? (0) | 2021.01.21 |
---|---|
Python에서 병렬 프로그래밍을 수행하는 방법은 무엇입니까? (0) | 2021.01.21 |
Python의 단위 테스트에서 데이터 출력 (0) | 2021.01.15 |
Python / Django : runserver에서 콘솔에 로그, Apache에서 파일에 로그 (0) | 2021.01.15 |