2016-03-24 13 views
0

Ich benutze den LinearNDInterpolator für einige (x, y, z) Daten mit dem folgenden Skript. Ich kann jedoch nicht herausfinden, wie man von den interpolierten Daten zur Darstellung/Darstellung der Interpolation in Heatmap-Form geht? Fehle ich etwas wie das Einrichten eines Meshgrid basierend auf dem Minimum und Maximum von x und y? Jede Hilfe oder ein Beispiel wäre großartig!Plotten interpolierter Werte mit LinearNDInterpolator (Python)

import numpy as np 
import scipy.interpolate 

x = np.array([-4386795.73911443, -1239996.25110694, -3974316.43669208, 
       1560260.49911342, 4977361.53694849, -1996458.01768192, 
       5888021.46423068, 2969439.36068243, 562498.56468588, 
       4940040.00457585]) 

y = np.array([ -572081.11495993, -5663387.07621326, 3841976.34982795, 
       3761230.61316845, -942281.80271223, 5414546.28275767, 
       1320445.40098735, -4234503.89305636, 4621185.12249923, 
       1172328.8107458 ]) 

z = np.array([ 4579159.6898615 , 2649940.2481702 , 3171358.81564312, 
       4892740.54647532, 3862475.79651847, 2707177.605241 , 
       2059175.83411223, 3720138.47529587, 4345385.04025412, 
       3847493.83999694]) 

# Create coordinate pairs 
cartcoord = zip(x, y) 

# Interpolate 
interp = scipy.interpolate.LinearNDInterpolator(cartcoord, z) 

Edit: Basierend auf @ Spinor-Lösung und mit Python 2.7, der folgende Code gibt mir, was ich suche (Ansatz 1). Gibt es eine Möglichkeit, meine Dichte der interpolierten Punkte zu erhöhen?

Der Datensatz liefert die folgende Handlung: enter image description here

Unnötig zu sagen, ich nicht die Ergebnisse kreisförmig sein erwartet hatte, da der (lat, lon) Koordinaten von einem equirectrangular Projektionskarte getroffen werden. Bei weiteren Untersuchungen denke ich, dass dies einfach auf eine different projection abgebildet wird.

Antwort

3

Ich nehme an, dass Sie versuchen, Werte von z zu interpolieren.

Was passiert nun, wenn Sie die Interpolationsfunktion aufrufen? Es erzeugt die gesamte Landschaft der Eingänge (x und y) und der Ausgänge (z). Im obigen Code haben Sie zu keinem Zeitpunkt wirklich nach seinem Wert gefragt. Um diese Funktion zu verwenden, müssen Sie die Eingänge angeben und erhalten die interpolierte Ausgabe.

Sie haben die Funktion scipy.interpolate.LinearNDInterpolator verwendet, die durch Triangulieren der Eingabedaten und auf jedem Dreieck mit linearer baryzentrischer Interpolation erstellt wird. Abhängig von Ihren Eingaben gibt es wahrscheinlich Regionen, in denen dies zusammenbricht und Sie Nan erhalten. Zum Beispiel, versuchen Sie dies in Ihrem Code

print interp(-4386790, 3720137) 

Dies ist innerhalb der Grenzen der Min-Max-Ihre x und y. Wir könnten Nan über das Argument fill_value auf Null setzen, wenn das für Sie akzeptabel ist.

Lesen Sie in der Dokumentation. Oft finden Leute die folgende Funktion auch akzeptabel, scipy.interpolate.interp2d. Es verwendet stattdessen Spline-Interpolation. Im folgenden Code habe ich beide Funktionen implementiert (die erste mit nan Werten auf 0 gesetzt) ​​und sie auf einer Heatmap geplottet.

Wie für die Heatmap, ist es wie Sie vermutet haben. Sie müssen ein Raster von Werten erstellen. Unten sind meine Diagramme für LinearNDInterpolator mit nan auf Null und interp2d sowie die Codes.

Mit LinearNDInterpolator (cartcoord, z, fill_value = 0) enter image description here

Mit interp2d (x, y, z) enter image description here

P.S. Ich benutze Python3. Wenn Probleme in Python2 auftreten, entfernen Sie die Liste aus cartcoord = list (zip (x, y)).

import matplotlib.pyplot as plt 
import numpy as np 
import scipy.interpolate 

x = np.array([-4386795.73911443, -1239996.25110694, -3974316.43669208, 
       1560260.49911342, 4977361.53694849, -1996458.01768192, 
       5888021.46423068, 2969439.36068243, 562498.56468588, 
       4940040.00457585]) 

y = np.array([ -572081.11495993, -5663387.07621326, 3841976.34982795, 
       3761230.61316845, -942281.80271223, 5414546.28275767, 
       1320445.40098735, -4234503.89305636, 4621185.12249923, 
       1172328.8107458 ]) 

z = np.array([ 4579159.6898615 , 2649940.2481702 , 3171358.81564312, 
       4892740.54647532, 3862475.79651847, 2707177.605241 , 
       2059175.83411223, 3720138.47529587, 4345385.04025412, 
       3847493.83999694]) 

# Create coordinate pairs 
cartcoord = list(zip(x, y)) 


X = np.linspace(min(x), max(x)) 
Y = np.linspace(min(y), max(y)) 
X, Y = np.meshgrid(X, Y) 

# Approach 1 
interp = scipy.interpolate.LinearNDInterpolator(cartcoord, z, fill_value=0) 
Z0 = interp(X, Y) 
plt.figure() 
plt.pcolormesh(X, Y, Z0) 
plt.colorbar() # Color Bar 
plt.show() 

# Approach 2 
func = scipy.interpolate.interp2d(x, y, z) 
Z = func(X[0, :], Y[:, 0]) 
plt.figure() 
plt.pcolormesh(X, Y, Z) 
plt.colorbar() # Color Bar 
plt.show() 
+0

Tolle Lösung, komplett mit einem Beispiel und Beispielcode! Vielen Dank! Ich bearbeite meine Frage, um meine aktuellen Ergebnisse basierend auf @ Spinors Lösung zu integrieren, da es sich um eine Erweiterung desselben Themas handelt. – AaronJPung

+1

Um die Dichte zu erhöhen, ändern Sie die Funktion linspace in X = np.linspace (min (x), max (x), num = 100) und tun dies auch für Y. – Spinor8