2017-05-29 5 views
2

Nach Aktualisierung der Matplotlib-Version von 1.3.1 auf 2.0.2, wenn ich plot_trisurf verwenden möchte, um eine TIN durch 3d-Punkte zu generieren, bekam ich ein unverständliches Ergebnis. Mein Testcode lautet wie folgt:Plot_trisurf von Matplotlib 2.0.2

import sys 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.ticker import MaxNLocator 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 
import numpy 
from numpy.random import randn 
from scipy import array, newaxis 

chunk = numpy.loadtxt('test.xyz') #test.xyz contains 38010 points, 
DATA=numpy.array(chunk) 
Xs = DATA[:,0] 
Ys = DATA[:,1] 
Zs = DATA[:,2] 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0) 
fig.colorbar(surf) 

ax.xaxis.set_major_locator(MaxNLocator(5)) 
ax.yaxis.set_major_locator(MaxNLocator(6)) 
ax.zaxis.set_major_locator(MaxNLocator(5)) 

fig.tight_layout() 
plt.show() 

Die Datei test.xyz enthält 38010 Punkte. Ein Teil davon zeigt wie folgt, die komplette Datei kann gefunden werden here.

512743.63 5403547.33 308.68 
512743.62 5403547.33 308.70 
512743.61 5403547.33 308.72 
512743.60 5403547.34 308.68 
512743.60 5403547.33 308.73 
512741.50 5403547.36 309.05 
512741.50 5403547.36 309.07 
512741.49 5403547.46 309.09 
512741.48 5403547.46 309.07 
512741.47 5403547.46 309.10 
512741.47 5403547.45 309.13 
512741.46 5403547.37 309.04 
512739.39 5403547.51 309.10 
512739.39 5403547.48 309.34 
512739.38 5403547.60 309.25 
512739.37 5403547.71 309.15 
512739.39 5403547.49 310.65 
512739.39 5403547.48 310.70 
512739.38 5403547.49 310.69 
512739.37 5403547.48 310.72 
512739.36 5403547.39 310.64 
512739.32 5403547.41 309.20 
512737.33 5403547.26 313.14 
512737.33 5403547.37 313.09 
512737.32 5403547.38 313.03 
512737.30 5403547.37 313.12 
512737.30 5403547.26 313.14 
512735.22 5403547.41 311.72 
512735.22 5403547.43 312.29 
512735.22 5403547.49 312.59 
512735.21 5403547.51 312.48 
512735.20 5403547.60 312.53 
512735.19 5403547.61 312.48 
512735.18 5403547.72 312.40 
512735.18 5403547.71 312.49 
512735.17 5403547.71 312.51 
512735.16 5403547.70 312.58 
512735.15 5403547.61 312.52 

nach dem Update wird das Ergebnis wie folgt angezeigt: ]

Ich denke, es ist falsch, weil ich genug Punkte biete eine TIN zu erzeugen, aber das Ergebnis scheint nur einen kleinen Teil des Punktes zu verwenden . Vor dem Aktualisieren der Matplotlib kann ich ein Ergebnis erhalten wie: ]

+0

vielen Dank für Ihre Antwort beziehen, aber ich biete eine Datei mit 38010 Punkten. Die obigen Daten zeigen nur einen sehr kleinen Teil, um das Datenformat zu verdeutlichen – zxgao

+0

Das detaillierte wird in [link] (https://github.com/zxgdll/problem-about-matplotlib2.0.2) – zxgao

+0

Ich kann das bestätigen Das Trisurf-Diagramm zeichnet nur eine Teilmenge der Punkte auf. Ich kenne den Grund dafür nicht, aber es muss irgendwo in der Triangulation oder im Trisurf-Plot selbst sein. Ich fügte dem [GitHub-Problem] (https://github.com/matplotlib/matplotlib/issues/8682), das Sie aufstellten, etwas reproduzierbaren Code hinzu. – ImportanceOfBeingErnest

Antwort

0

Vielen Dank für alle Antworten. Dieses Problem wurde gelöst und das detaillierte wurde in Problem about plot_trisurf of matplotlib 2.0.2 gezeigt. Und hier war es eine Freude, mein Ergebnis zu zeigen. Das Problem ist eine endliche Genauigkeit bei der Berechnung der Delaunay-Triangulation in qhull, die nahe Punkte (nach einer komplizierten Definition des Wortes "nahe") als identisch betrachtet, so dass die Triangulation einfacher als gewünscht ist. Der Datensatz ist ein extremer (in einer schlechten) für die endliche Genauigkeit, da die Verteilung der Punkte um ihren Mittelwert klein ist (x.mean() = 512767, x.max() - x.min() = 134, y .mean() = 303, y.max() - y.min() = 5403707). Dies wurde durch Ian Thomas erklärt. So habe ich mein Testcode wie folgt korrigiert:

import sys 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.ticker import MaxNLocator 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 
import numpy 
from numpy.random import randn 
from scipy import array, newaxis 

chunk = numpy.loadtxt('test.xyz') #test.xyz contains 38010 points, 
DATA=numpy.array(chunk) 
Xs = DATA[:,0] 
Ys = DATA[:,1] 
Zs = DATA[:,2] 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
#surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0) 
surf = ax.plot_trisurf(Xs-Xs.mean(), Ys-Ys.mean(), Zs, cmap=cm.jet, linewidth=0) 
fig.colorbar(surf) 

ax.xaxis.set_major_locator(MaxNLocator(5)) 
ax.yaxis.set_major_locator(MaxNLocator(6)) 
ax.zaxis.set_major_locator(MaxNLocator(5)) 

fig.tight_layout() 
plt.show() 

Vorher wurde das Ergebnis wie folgt angezeigt: enter image description here

Nachdem wurde das Ergebnis wie folgt angezeigt: enter image description here

So zu summieren Dies war nicht wirklich ein Problem zwischen verschiedenen matplotlib-Versionen und die aktuelle Version ist gut genug, um mit den meisten Anwendungsfällen fertig zu werden. Und wenn jemand hofft, dass die Achsen Ticklabes leicht korrigiert werden können, können Sie sich auf ImportanceOfBeingErnest's method.

Verwandte Themen