2016-06-05 3 views
1

Мне нужно создать 3D-график в matplotlib. Я читаю значения Z из текстового файла, сформированного как 1D-массив. Эти данные представляют значение для каждой точки на квадрате 50 × 50. Итак, первые 50 значений для точек (0,0), (1,0) ... (49,0), следующие 50 для (0,1), (1,1) и так далее. До сих пор я написал следующий код:Как сделать 3D-график в matplotlib из данных z = f (x, y) читать из файла

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() 

Но, конечно, он не работает. Я искал в Интернете какие-то подсказки, но без каких-либо успехов. Может ли кто-нибудь показать мне, как я должен это сделать? Я был бы более чем благодарен.

ответ

1

Во-первых, вы забыли импортировать Axes3D: import matplotlib.pyplot as plt.

Во-вторых, у вас код имеет странную бессмысленную строку: values[50*50*nb:50*50*(nb+1)] и вложение неправильное в вашем коде.

В-третьих, построить регулярно координатные данные вам не нужно plot_trisurf, используйте 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

Посмотрите на примеры: http://matplotlib.org/examples/mplot3d/surface3d_demo.html

+0

Спасибо за ответ. Я отредактировал исходный код, чтобы значения теперь были одобрены. Я должен был удалить слишком много при редактировании. Проблема в том, что я не знаю, как отформатировать мои данные, чтобы их можно было передать в plot_surface. В этом примере и в любом другом, что я посмотрел, он был просто создан на основе функции (здесь np.sqrt). – rodrykbyk

+0

Не имеет значения, как генерируются данные (Z), данные просто должны иметь ту же форму, что и массивы X и Y. X, Y для 'plot_surface' должны быть сетчатыми сетками (2D-массив того же размера). – Serenity

+0

Хорошо, я сформировал свои данные как 2D-массив, и он сработал: D. Спасибо. – rodrykbyk