2016-06-05 34 views
1

Ich muss ein 3D-Diagramm in Matplotlib erstellen. Ich lese Z-Werte aus einer Textdatei, die als 1D-Array formatiert ist. Diese Daten repräsentieren den Wert für jeden Punkt auf einem 50x50-Quadrat. Also sind die ersten 50 Werte für Punkte (0,0), (1,0) .. (49,0), die nächsten 50 sind für (0,1), (1,1) und so weiter. Bisher habe ich folgenden Code geschrieben:So erstellen Sie ein 3D-Diagramm in Matplotlib aus Daten z = f (x, y) aus der Datei lesen

import matplotlib.pyplot as plt 
    import numpy as np 

    fp=open(path,"r") 
    a=fp.read() 
    buffer="" 
    data=[] 
    for i in a: 
     if i != ' ': 
      buffer=buffer+i 
     else: 
      data.append(float(buffer)) 
      buffer="" 
    fp.close() 


    values=data[50*50:50*50*2] 

    x=np.linspace(0,50,50) 
    y=np.linspace(0,50,50) 

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

    ax.plot_trisurf(x, y, values) 

    plt.show() 

Aber natürlich funktioniert es nicht. Ich suchte im Internet nach Hinweisen, aber ohne Erfolg. Kann mir jemand zeigen, wie ich es machen soll? Ich wäre mehr als dankbar.

Antwort

1

Zuerst haben Sie vergessen, Axes3D zu importieren: import matplotlib.pyplot as plt.

Zweitens haben Sie Code merkwürdig sinnlose Zeile: values[50*50*nb:50*50*(nb+1)] und Einzug ist falsch in Ihrem Code.

Drittens plotten regelmäßig gerasterten Daten, die Sie nicht plot_trisurf benötigen, verwenden plot_surface:

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

x=np.linspace(0,50,50) 
y=np.linspace(0,50,50) 
X, Y = np.meshgrid(x, y) 
values = np.sqrt(X**2 + Y**2) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot_surface(x, y, values) 
plt.show() 

enter image description here

Geben Sie für Beispiele: http://matplotlib.org/examples/mplot3d/surface3d_demo.html

+0

Dank für die Antwort. Ich habe den Quellcode bearbeitet, so dass die Werte jetzt in Ordnung sind. Ich muss bei der Bearbeitung zu viel gelöscht haben. Das Problem ist, dass ich nicht weiß, wie ich meine Daten formatiere, damit sie an plot_surface übergeben werden können. In diesem Beispiel und in jedem anderen, das ich angeschaut habe, wurde es nur basierend auf der Funktion generiert (np.sqrt hier). – rodrykbyk

+0

Es spielt keine Rolle, wie Daten (Z) erzeugt werden, Ihre Daten müssen nur die gleiche Form wie X- und Y-Arrays haben. X, Y für 'plot_surface' müssen ein Mesh-Grid sein (2D-Array der gleichen Größe). – Serenity

+0

Okay, ich habe meine Daten als 2D-Array formatiert und es hat funktioniert: D. Vielen Dank. – rodrykbyk