2014-03-26 22 views
8

Es scheint, als ob matplotlib.tri.Triangulation eine fehlerhafte und möglicherweise falsche Implementierung der Delaunay-Triangulation verwendet, die durch qHull ersetzt werden soll.Verwenden von scipy.spatial.Delaunay anstelle der integrierten Version von Matplotlib.tri.Triangulation

Ich versuche, eine trisurf mpl_toolkits.mplot3d.plot_trisurf() zu plotten und läuft in ein paar Ausnahmen verwenden, die nicht hilfreich sind (IndexError s und KeyError s meist, ohne Hinweis darauf, was falsch genau ging).

Da scipy.spatial.Delaunay bereits verwendet qhull, ich frage mich, ob es eine Möglichkeit, ein matplotlib.tri.Triangulation Objekt für die Verwendung mit mpl_toolkits.mplot3d.plot_trisurf() mit scipy Implementierung von Delaunay-Triangulation zu bauen war.

Ich habe versucht, die delaunay.points direkt an matplotlib.tri.Triangulate über die triangles Parameter übergeben, aber dies ergibt eine ValueError: triangles min element is out of bounds.

+0

Wie Eine Seite nicht, das wird in 1.4 behoben, wenn Sie versuchen können, den aktuellen Master-Zweig zu verwenden. – tacaswell

Antwort

6

http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.Delaunay.html http://matplotlib.org/dev/api/tri_api.html

Sie müssen also von qhull zum Triangulation Konstruktor sowohl die Punkte und die Dreiecke passieren:

import numpy as np 
import scipy.spatial 
import matplotlib 
import math 

import matplotlib.tri as mtri 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

# First create the x and y coordinates of the points. 
n_angles = 20 
n_radii = 10 
min_radius = 0.15 
radii = np.linspace(min_radius, 0.95, n_radii) 
angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) 
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) 
angles[:, 1::2] += math.pi/n_angles 
x = (radii*np.cos(angles)).flatten() 
y = (radii*np.sin(angles)).flatten() 

# Create the Delaunay tessalation using scipy.spatial 
pts = np.vstack([x, y]).T 
tess = scipy.spatial.Delaunay(pts) 

# Create the matplotlib Triangulation object 
x = tess.points[:, 0] 
y = tess.points[:, 1] 
tri = tess.vertices # or tess.simplices depending on scipy version 
triang = mtri.Triangulation(x=pts[:, 0], y=pts[:, 1], triangles=tri) 

# Plotting 
z = x*x + y*y 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot_trisurf(triang, z) 
plt.show() 

Ausgang (mit matplotlib aktuellen Master): enter image description here

+0

Und wenn ich nur ein 2D-Array als Eingabe habe? – marco