Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2011 16:10:35

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

Дан текстовый файл, содержащий координаты примитивов (четырехугольных и трехугольных площадок) некоторой трехмерной поверхности. Помогите считать из файла эти координаты и отобразить их:

#!/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
...



Офлайн

#2 Март 28, 2011 16:54:56

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

советую повторить примеры отсюда
http://jenyay.net/Programming/Python3d
собственно сразу видно что X и Y - двумерные массивы

офтоп - а что .beginer с одной N ? ))



Отредактировано (Март 28, 2011 16:56:30)

Офлайн

#3 Март 28, 2011 20:06:46

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

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

А может на Питон возможной альтернативное решение, пусть и неэффективное, считывать каждую площадку и прорисовывать?



Отредактировано (Март 28, 2011 21:23:45)

Офлайн

#4 Март 28, 2011 22:10:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

формат данных в matplotlib

У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.



Офлайн

#5 Март 28, 2011 23:17:27

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

doza_and
У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.
А как нарисовать площадку заданную своими четырмя координатами?



Офлайн

#6 Март 29, 2011 16:00:11

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

matplotlib - можно наверное и заставить, но все таки эта библиотека заточена для построения функций а не отдельных “площадок”.

Я бы смотрел в сторону библиотек для 3D, MayaVi например. Можно скачать бинарники здесь http://pythonxy.googlecode.com/files/EnthoughtToolSuite-3.6.0_py26.exe
примеры будут в папке Python26/Doc/



Офлайн

#7 Март 29, 2011 20:26:47

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

формат данных в matplotlib

вот вам слегка модифицированный пример из документации который иллюстрирует последовательное рисование фигур

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, он получше подходит для таких примитивов как у вас



Офлайн

#8 Март 30, 2011 12:13:52

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

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.



Офлайн

#9 Март 30, 2011 19:12:32

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

формат данных в matplotlib

Уважаемые форумчане, что-то получилось в 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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version