scipy.interpolate

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Slevin
User
Beiträge: 5
Registriert: Sonntag 26. August 2012, 21:54

Hallo,
zur Ausgangslage:
Ich habe eine 3D-Punktwolke für die es zu jedem (x,y)-Wert genau einen z-Wert gibt.
Ich suche nun nach einer Möglichkeit mir diese Punktwolke in einem 2D-Raster darstellen zu lassen und zwar so, dass die verschiedenen z-Werte durch unterschiedliche Farben dargestellt werden. Darüber hinaus sollen nicht nur die gegebenen Punkte dargestellt werden sondern es soll auch eine Interpolation zwischen den Punkten erfolgen.
Schlussendlich möchte ich noch erreichen, dass ich durch die Eingabe eines bestimmten z-Wertes nur eben jene Punkte angezeigt werden, die diesen z-Wert enthalten inkl. der Interpolation.

Meine 1. Idee war, zunächst alle Punkte herauszufiltern die den gesuchten z-Wert enthalten und dann zwischen diesen Punkten eine Interpolation mittels scipy.interpolate.interp1d zu erstellen, aber das führt nicht zum gewünschten Ergebnis, da ja die Interpolation auch abhängig von den übrigen ("herausgeschnittenen") z-Werten ist. Ich benötige also eine 2D-Interpolation und offensichtlich ist scipy.interpolate.griddata die Lösung. Da ich aber mehr oder weniger Programmier-Anfänger bin, kann ich mit dem Modul allein nicht viel anfangen, deshalb habe ich nach Beispiel-Codes gesucht die mein Vorhaben (Interpolation von 3D-Punkten und deren 2D-Darstellung) bereits realisieren, bin aber nicht fündig geworden =(

Es wäre also toll, wenn ihr mir mit einem Minimal-Beispiel zur Handhabung meines Problems weiterhelfen könntet.

Edit:
Falls relevant:
Wenn ich mir meine Punktwolke anzeigen lasse und von oben drauf schaue, dann haben verschiedene benachbarten Punkte auch verschiedene Abstände -> es ist bei der Draufsicht kein regelmäßiges Muster vorhanden.
Zudem beschreibt die Punktwolke auch keinen regelmäßigen Körper sondern vom Prinzip her eher eine "Berglandschaft"
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np


def main():
    N = 100
    
    points = np.random.random((N, 3))
    x, y, z = points[:,0], points[:,1], points[:,2]
    
    xi = np.linspace(0.0, 1.0, 100)
    yi = np.linspace(0.0, 1.0, 100)
    zi = griddata(x, y, z, xi, yi)
    
    plt.figure()
    cs = plt.contour(
        xi, yi, zi,
        5,
        linewidths=1.0,
        colors=("red", "green", "blue", "yellow", "purple"))
    plt.clabel(cs, inline=1, fontsize=8)
    plt.scatter(x, y, marker='x', color="black")
    plt.show()


if __name__ == "__main__":
    main()
Und noch ein wenig mehr in der Gallery, bzw. mit Füllung.

Edit: und mit etwas mehr Kontrolle über die Interpolation:

Code: Alles auswählen

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


def main():
    N = 100
    
    points = np.random.random((N, 3))
    x, y, z = points[:,0], points[:,1], points[:,2]
    
    xi = np.linspace(0.0, 1.0, 100)
    yi = np.linspace(0.0, 1.0, 100)
    zi = griddata(
        points[:,0:2],
        points[:,2],
        np.meshgrid(xi, yi),
        method="linear")
    
    plt.figure()
    cs = plt.contour(
        xi, yi, zi,
        5,
        linewidths=1.0,
        colors=("red", "green", "blue", "yellow", "purple"))
    plt.clabel(cs, inline=1, fontsize=8)
    plt.scatter(x, y, marker='x', color="black")
    plt.show()


if __name__ == "__main__":
    main()
Das Leben ist wie ein Tennisball.
BlackJack

Die xkcd-Optik ist ja witzig. :-D Die will ich auch in meinen Plots haben!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

BlackJack hat geschrieben:Die xkcd-Optik ist ja witzig. :-D Die will ich auch in meinen Plots haben!
Gibt es seit Version 1.3 über ``matplotlib.pyplot.xkcd()`` - damit sieht einfach jede Visualisierung viel wissenschaftlicher aus :D
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

EyDu hat geschrieben:Gibt es seit Version 1.3 über ``matplotlib.pyplot.xkcd()`` - damit sieht einfach jede Visualisierung viel wissenschaftlicher aus :D
OMFG! xkcd rules!

Code: Alles auswählen

import antigravity
Antworten