Найти - Пользователи
Полная версия: формат данных в matplotlib
Начало » Python для новичков » формат данных в matplotlib
1
math.beginer
Дан текстовый файл, содержащий координаты примитивов (четырехугольных и трехугольных площадок) некоторой трехмерной поверхности. Помогите считать из файла эти координаты и отобразить их:

#!/usr/bin/python
from numpy import *
import pylab as p
#import matplotlib.axes3d as p3
import mpl_toolkits.mplot3d.axes3d as p3

# Здесь нужно как-то считать данные

fig=p.figure()
ax = p3.Axes3D(fig)
# x, y, and z are 100x100 arrays
ax.plot_surface(x,y,z)
ax.set_xlabel('x_1')
ax.set_ylabel('x_2')
ax.set_zlabel('x_3')
p.show()
Проблема в том, что мне не понятно в каком порядке нужно располагать координыты точек.

Спасибо.





Данные в текстовом файле записаны так:
0.0000000000 0.0000000000 1.0000000000
0.1081190184 0.0000000000 0.9941379572
0.1075065026 0.0114923473 0.9941379572
0.0000000000 0.0000000000 1.0000000000


0.0000000000 0.0000000000 1.0000000000
0.1075065026 0.0114923473 0.9941379572
0.1056758951 0.0228544818 0.9941379572
0.0000000000 0.0000000000 1.0000000000


0.0000000000 0.0000000000 1.0000000000
0.1056758951 0.0228544818 0.9941379572
0.1026479375 0.0339576658 0.9941379572
0.0000000000 0.0000000000 1.0000000000
...
asv13
советую повторить примеры отсюда
http://jenyay.net/Programming/Python3d
собственно сразу видно что X и Y - двумерные массивы

офтоп - а что .beginer с одной N ? ))
math.beginer
asv13
советую повторить примеры отсюда
http://jenyay.net/Programming/Python3d
собственно сразу видно что X и Y - двумерные массивы
в Питон совсем новичек. Помогите стартануть,

1. как правильно считать данные, нужно чтобы в вектора x,y,z попали свои числа, понимаю что д.б. что-то типа

[x,y,z] = [[float(i) for i in line.split()] for line in open('surf')]
но пока не справился с синтаксисом.


2. как переконвертировать координаты x,y,z в 2Д массивы X,Y,Z

площадки в текстовом файле расположены произвольно и возникает вопрос “примет ли произвольный порядок plot_surface(x,y,z)”

А может на Питон возможной альтернативное решение, пусть и неэффективное, считывать каждую площадку и прорисовывать?
doza_and
У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.
math.beginer
doza_and
У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.
А как нарисовать площадку заданную своими четырмя координатами?
asv13
matplotlib - можно наверное и заставить, но все таки эта библиотека заточена для построения функций а не отдельных “площадок”.

Я бы смотрел в сторону библиотек для 3D, MayaVi например. Можно скачать бинарники здесь http://pythonxy.googlecode.com/files/EnthoughtToolSuite-3.6.0_py26.exe
примеры будут в папке Python26/Doc/
doza_and
вот вам слегка модифицированный пример из документации который иллюстрирует последовательное рисование фигур
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

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

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 20 * np.outer(np.sin(u), np.sin(v))
z = 5 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

plt.show()
Довольно просто использовать vpython, он получше подходит для таких примитивов как у вас
math.beginer
doza_and
Довольно просто использовать vpython, он получше подходит для таких примитивов как у вас
Действительно, vpyhon сильно облегчит работу!

1. Скажите, а это все возможности vpyhon по рисованию примитивов
cylinder Start with cylinder: much of what is said here applies to other objects as well.
arrow label
cone frame: combining several objects into one
pyramid faces: low-level object for special purposes
sphere Additional Attributes: visible, frame, display, class, members
ring Convenient Defaults
box Rotating an Object
ellipsoid Specifying Colors
curve Deleting an Object
helix
Чем бы мне наприсовать площадку, заданную четырмя вершинами и так чтобы с одна сторона была внешняя другая внутренняя (одна отражала сильно свет другая не очень). Маленькими box придеться строить или я что-то другое не заметил? curve не подходит, т.к. не получается поверхности, а получаются рамки (проволочная фигура, а она мне не нужна и ее gnuplot правильно строит с гораздо меньшими усилиями)

2. запускаю скрипт, появляется окно с рисунком и это окно не позволяет повертеть изображение или его сохранить, только нажать на крестик и прервать. Поддержка vpython стала возможной после установки:
python-visual - VPython 3D scientific visualization library
Использую Ubuntu 10.10.
math.beginer
Уважаемые форумчане, что-то получилось в octave, помогите переложить. Вроде можно, т.к. matplotlib д.б. похож на Matlab. Может какие книги по 3Д графиге в Питон порекомендуете.


Рабочий код
#!/usr/bin/octave -q
M=load('surf');
x=reshape(M(:,1),4,[]);
y=reshape(M(:,2),4,[]);
z=reshape(M(:,3),4,[]);
patch(x,y,z,'r');
view(3);
pause
Кроме patch неплохо работает и fill.


Не очень рабочий, т.к. триангуляция в нем не для замкнутой фигуры
M=load('surf');
x=M(1:end,1)';
y=M(1:end,2)';
z=M(1:end,3)';
tri = delaunay(x,y);
#trimesh(tri,x,y,z)
trisurf(tri,x,y,z)
#trimesh(tri,x,y,zeros(size(x)))
pause
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB