2010-12-06 20 views
6

Für das Leben von mir, dass ich nicht herausfinden kann, wie man die gleichen Ergebnisse wie this zu bekommen.matplotlib Farbe in 3d Plotten von einer x, y, z Datensatz ohne Kontur mit

Der Link erzeugt das farbige 3D-Plot ohne Kontur. Wenn ich dieselbe Technik verwende, aber mit meinem eigenen x, y, z Datensatz, bekomme ich nur eine Farbe.

Der Unterschied muss in der Art und Weise sein, die ich für die Handlung, die z-Daten bin zu erzeugen.

Wie auch immer, mit diesem:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.mlab import griddata 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 
import sys 

def xyz_ret(file): 
    f = open(file, 'r') 

    xyz = [] 
    for i in f: 
     ret = i.replace('\n','') 
     xyz.append(map(float,(ret.split('\t')))) 

    xyz = np.array(xyz) 
    return xyz[:,0],xyz[:,1],xyz[:,2]  


x,y,z = xyz_ret('300.txt') 

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

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap=cm.jet, 
     linewidth=0) 

ax.set_zlim3d(min(z), max(z)) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf, shrink=0.5, aspect=5) 

plt.show() 

Datensatz:

-2187.99902 9380.009151 0.0209 
-2187.00111 2474.994061 0.022 
-10755.98931 6119.598968 0.0296 
-5781.347693 609.427388 0.0301 
-8761.562524 1942.391853 0.0285 
-5695.576244 1894.624701 0.0251 
-3801.215106 1096.153308 0.0257 
-1616.821487 2452.940102 0.0182 
-5790.547537 2975.622971 0.022 
-8095.18467 4074.330871 0.0208 
-9997.367785 2771.330212 0.0264 
-10547.5635 4397.127096 0.0251 
-5781.706776 3984.545588 0.0191 
-3346.855289 4347.670408 0.0172 
-918.639762 4518.515925 0.0142 
-892.428381 5850.710005 0.0143 
-5844.499993 6516.904257 0.0204 
-10877.96951 6015.755723 0.0265 
-10813.37291 7704.306099 0.0302 
-7991.878303 7733.626264 0.0223 
-5861.073574 8725.943697 0.0217 
-3188.107715 6997.19893 0.0206 
-897.427629 7474.426336 0.0188 
-1388.841321 8786.642046 0.0194 
-3370.72325 8825.154803 0.0225 
-8561.226722 8851.111988 0.0285 
-10275.58972 8849.798032 0.0341 
-5853.645621 10113.77051 0.0255 
-8101.002878 10754.8429 0.0332 
-5765.080546 11378.95524 0.0299 
-3081.969839 10549.46676 0.0242 

Nur eine Farbe angezeigt wird. Beachten Sie auch, dass der Farbbalken keine Ticks enthält.

Können Sie mir erklären, was mein Problem ist?

+0

Ich würde sagen, Sie nicht Axes3D.plot_surface verwenden. Sie importieren Axes3D, aber Sie verwenden es nicht. – joaquin

+0

Es ist in ax = fig.add_subplot (111, projektion = '3d') verwendet, Wenn ich die Axes3d entfernen, wird das Skript Fehler in dieser Zeile. – hl3fx

Antwort

2

Der einfachste Weg, um Textdaten zu lesen ist über genfromtxt:

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

sys nicht erforderlich ist.

+0

hah, cool danke für den Leckerbissen! :) – hl3fx

+0

Ich benutze sys, um das Skript nach dem Zufallsprinzip zu beenden, während man das Programm testet. sys.exit() – hl3fx

16

Ich denke, es gibt ein Problem mit fill „diskontinuierlicher“ Oberfläche (Griddata). alt text

Code:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 
fig.colorbar(surf) 

plt.show() 

Bitte beachten Sie, dass, wenn Sie die Oberfläche über einen rechteckigen Bereich betrachten (xi x yi), dieser Code ordnungsgemäß funktioniert. Mit anderen Worten, wenn Sie unregelmäßige Kanten "abschneiden".

xi = np.linspace(-4000, -9000) 
yi = np.linspace(4000, 9000) 

alt text

+0

Vielen Dank für das Feedback. Ich versuche immer noch, es herauszufinden. Ich frage mich, ob es eine andere Möglichkeit gibt, die z-Daten ohne Verwendung von Grid-Daten zu erhalten? – hl3fx

+0

Wäre ein Symptom des Obigen auch das Fehlen von Häkchen in der Farbleiste? Ich denke, diese beiden Probleme stehen in direktem Zusammenhang. Im Beispielcode werden die Ticks angezeigt, die die verschiedenen Farben in z Höhe darstellen. Wenn Sie im Beispielcode Z drucken, wird ein Array von Listen mit Zahlen gefüllt angezeigt. Wenn Sie im obigen Code Z drucken, wird eine Liste von --- angezeigt. Irgendwelche Ideen? – hl3fx

+0

hmm, danke, dass du das gefunden hast. Jetzt, wie man die gebrochene Oberfläche repariert? Ich habe jemand anderen mit dem gleichen Problem hier gefunden: http://old.nabble.com/plot_surface-masked-array-tt27266471.html#a27266471. Leider gab es keine Antwort auf seine Frage. – hl3fx

2

ich nur mit dem ähnlichen Problem zu kämpfen.

Schließlich musste ich anstelle von Griddata natgrid (die here verwiesen wird, aber die Verknüpfung funktioniert nicht).

für mich den Trick mit dem Schneiden von Plotregion hat nicht funktioniert, es war immer in einer Farbe.

Wenn PyNGL Installation überprüfen, ob Sie die neueste Version von numpy haben.

Viel Glück

Verwandte Themen