Interpolation von Daten auf ein Meshgrid ohne Extrapolation (Numpy, Matplotlib, Scipy)
Verfasst: Sonntag 19. Mai 2024, 10:00
Ich habe das Problem, dass ich gerne Daten auf ein Meshgrid interpolieren möchte, diese aber nicht extrapoliert werden sollen, sondern nur zwischen vorhandenen Datenwerten interpoliert werden soll.
Konkret ist es folgendes Problem: Ich habe l, h und u werte. l und h spannen ein Querprofil auf und haben verschiedene geschwindigkeitswerte (u) die ich gern als Konturplot darstellen mag.
Ich denke die wichtigsten Teile meines Codes dabei sind
und so erstelle ich beispielsweise einen Konturplot
aktuelle habe ich 2 Datensätze eingeladen und es passiert beim ersten datensatz genau das was passieren soll: Alle Punkte außerhalb des Profils haben eine Geschwindigkeit von 0, alle innerhalb nicht. Beim zweiten ist das aber nicht so und die Punkte außerhalb bekommen die Geschwindigkeit vom untersten Wert zugeschrieben.
Das Profil ist quasi so aufgebaut, dass die "oberen Werte" alle eine einheitliche Höhe haben, die unteren aber verschiedene Höhen. Es ist also kein klassisches Recheck sondern eher ... hügelig.
Und bei den meisten datensätzen bekommen die Punkte außerhalb des profils eben den Wert des letzten punktes innerhalb des Profils zugeschrieben.
Cubic und linear habe ich auch schon als Interpolationsmethode ausprobiert, aber das klappt auch nicht.
Bei Cubic werden die Werte selbst eher falsch interpoliert und auf einmal sind da Datenspitzen die nicht da sein sollten.
Bei linear ist das problem nicht so extrem wie bei nearest, aber auch vorhanden.
Ich hoffe ich konnte mein Problem halbwegs verständlich erklären ... bilder hochladen geht leider nicht, sonst wäre es etwas einfacher
Konkret ist es folgendes Problem: Ich habe l, h und u werte. l und h spannen ein Querprofil auf und haben verschiedene geschwindigkeitswerte (u) die ich gern als Konturplot darstellen mag.
Ich denke die wichtigsten Teile meines Codes dabei sind
Code: Alles auswählen
grid_x1, grid_y1 = np.mgrid[min(l1):max(l1):1391j, min(h1):max(h1):23j]
grid_x2, grid_y2 = np.mgrid[min(l2):max(l2):1786j, min(h2):max(h2):31j]
matrix1 = np.vstack([l1, h1]).T
matrix2 = np.vstack([l2, h2]).T
vel1 = griddata(matrix1, u1, (grid_x1, grid_y1), method="nearest", fill_value=np.nan)
vel2 = griddata(matrix2, u2, (grid_x2, grid_y2), method="nearest", fill_value=np.nan)
Code: Alles auswählen
fig, axs = plt.subplots(nrows=3, ncols=1, layout="constrained")
fig.suptitle("Profil XS 2 - Vergleich Netz 2-0 und 2-1")
ax = axs[0]
contour = ax.contourf(grid_x1, grid_y1, vel1, levels=np.linspace(0, 2, 101), cmap=cm)
cbar = plt.colorbar(contour)
cbar.set_label("U Magnitude [m/s]")
cbar.set_ticks([0, 0.5, 1, 1.5, 2])
ax.xaxis.set_inverted(True)
ax.set_title("Netz 2-0")
ax.set_aspect(10/1)
aktuelle habe ich 2 Datensätze eingeladen und es passiert beim ersten datensatz genau das was passieren soll: Alle Punkte außerhalb des Profils haben eine Geschwindigkeit von 0, alle innerhalb nicht. Beim zweiten ist das aber nicht so und die Punkte außerhalb bekommen die Geschwindigkeit vom untersten Wert zugeschrieben.
Das Profil ist quasi so aufgebaut, dass die "oberen Werte" alle eine einheitliche Höhe haben, die unteren aber verschiedene Höhen. Es ist also kein klassisches Recheck sondern eher ... hügelig.
Und bei den meisten datensätzen bekommen die Punkte außerhalb des profils eben den Wert des letzten punktes innerhalb des Profils zugeschrieben.
Cubic und linear habe ich auch schon als Interpolationsmethode ausprobiert, aber das klappt auch nicht.
Bei Cubic werden die Werte selbst eher falsch interpoliert und auf einmal sind da Datenspitzen die nicht da sein sollten.
Bei linear ist das problem nicht so extrem wie bei nearest, aber auch vorhanden.
Ich hoffe ich konnte mein Problem halbwegs verständlich erklären ... bilder hochladen geht leider nicht, sonst wäre es etwas einfacher
