.

Traduzir

terça-feira, 20 de julho de 2010

Criando figuras 3D com python e matplotlib

Olá a todos.
Eu estava precisando de gerar uns gráficos 3d de um trabalho que estou fazendo, então descobri que é possível fazer esses gráfico com python usando o módulo matplotlib.  A figura abaixo é um exemplo do que eu estou falando:




As letras gregas que dão nomes ao eixos são obtidas usando comandos nativos de latex ($\rho$, $\mu$, $\theta$).

Veja como é relativamente simples usar essa ferramenta.

O primeiro passo é importar os módulos necessários.

from numpy import *
import pylab as p
import mpl_toolkits.mplot3d.axes3d as p3

Note que o módulo usado para gerar o gráfico 3d chama-se "mpl_toolkits.mplot3d.axes3d".

Vamos definir as variáveis e a função z=f(x,y).

# u e v são variávies paramétricas.
# u é um vetor  que varia de  0 a 2*pi, com 100 elementos
u=r_[0:2*pi:100j]
# v é um vetor  que varia de  0 a 2*pi, com 100 elementos
v=r_[0:pi:100j]
# x, y, e z são as coordenadas no pontos para se criar o gráfico
#
x=10*outer(cos(u),sin(v))
y=10*outer(sin(u),sin(v))
z=10*outer(ones(size(u)),cos(v))


Agora vamos gerar o gráfico e salva-lo em um arquivo png.


fig=p.figure()
ax = p3.Axes3D(fig)
ax.plot_wireframe(x,y,z)
ax.set_xlabel(r'$ \rho $')
ax.set_ylabel(r'$ \mu $')
ax.set_zlabel(r'$ \theta $')
p.savefig('fig3d.png')

Segue o código completo abaixo:

from numpy import *
import pylab as p
import mpl_toolkits.mplot3d.axes3d as p3

# u and v are parametric variables.
# u is an array from 0 to 2*pi, with 100 elements
u=r_[0:2*pi:100j]
# v is an array from 0 to 2*pi, with 100 elements
v=r_[0:pi:100j]
# x, y, and z are the coordinates of the points for plotting
# each is arranged in a 100x100 array
x=10*outer(cos(u),sin(v))
y=10*outer(sin(u),sin(v))
z=10*outer(ones(size(u)),cos(v))
fig=p.figure()
ax = p3.Axes3D(fig)
ax.plot_wireframe(x,y,z)
ax.set_xlabel(r'$ \rho $')
ax.set_ylabel(r'$ \mu $')
ax.set_zlabel(r'$ \theta $')
p.savefig('fig3d.png')


Para quem quiser saber mais, veja http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/index.html

Até a próxima.