wake-up-neo.net

Zeichnen Sie eine glatte Linie mit PyPlot

Ich habe das folgende einfache Skript, das ein Diagramm zeichnet:

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

Wie es jetzt ist, geht die Linie direkt von Punkt zu Punkt, was ok aussieht, aber meiner Meinung nach besser sein könnte. Ich möchte, dass die Linie zwischen den Punkten geglättet wird. In Gnuplot hätte ich mit smooth cplines.

Gibt es eine einfache Möglichkeit, dies in PyPlot zu tun? Ich habe einige Tutorials gefunden, aber sie scheinen alle ziemlich komplex zu sein.

98
Paul

Du könntest benutzen scipy.interpolate.spline um Ihre Daten selbst zu glätten:

from scipy.interpolate import spline

xnew = np.linspace(T.min(),T.max(),300) #300 represents number of points to make between T.min and T.max

power_smooth = spline(T,power,xnew)

plt.plot(xnew,power_smooth)
plt.show()

spline ist in scipy 0.19.0 veraltet, verwenden Sie stattdessen die Bspline-Klasse.

Das Umschalten von spline auf Bspline ist kein einfaches Kopieren/Einfügen und erfordert einige Anpassungen:

from scipy.interpolate import make_interp_spline, BSpline

xnew = np.linspace(T.min(),T.max(),300) #300 represents number of points to make between T.min and T.max

spl = make_interp_spline(T, power, k=3) #BSpline object
power_smooth = spl(xnew)

plt.plot(xnew,power_smooth)
plt.show()

Vor: screenshot 1

Nach: screenshot 2

142
Olivier Verdier

Für dieses Beispiel funktioniert Spline gut, aber wenn die Funktion von Natur aus nicht glatt ist und Sie eine geglättete Version haben möchten, können Sie auch versuchen:

from scipy.ndimage.filters import gaussian_filter1d

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

wenn Sie Sigma erhöhen, erhalten Sie eine geglättete Funktion.

Fahren Sie mit Vorsicht fort. Es ändert die ursprünglichen Werte und ist möglicherweise nicht das, was Sie wollen.

11
Sajad Norouzi

Ich nehme an, Sie meinen Kurvenanpassung und nicht Antialiasing aus dem Kontext Ihrer Frage. PyPlot hat keine eingebaute Unterstützung dafür, aber Sie können einfach eine grundlegende Kurvenanpassung selbst implementieren, wie den Code hier , oder wenn Sie GuiQwt verwenden, hat es eine Kurvenanpassung Modul . (Sie könnten wahrscheinlich auch den Code von SciPy stehlen, um dies ebenfalls zu tun).

7
Nick Bastin