Gráficos tridimensionais no Python [PARTE I] / Three-dimensional plots on Python [PART I]

Faaaaaaala cientista! Tudo certo?
Hoje vamos começar uma série de posts sobre gráficos 3D no Python. Vamo lá?

Hey scientist! How is it going?
Today we’ll start a post series about 3D plots on Python. Let’s do it!

Pra começar essa série estudaremos um gráfico 3D bem bacana, modificado desse exemplo aqui. O código-fonte usado nesse post está no repositório do Programando Ciência, dá uma olhada: http://www.github.com/alexandrejaguar/programandociencia. Instalou o Anaconda? Ou a versão Python do seu sistema? E o Spyder? Corre lá, instala o que falta e volta nesse post depois!

To start this series we’ll study a nice 3D plot, modified from this example. The source code of this post is on our repository, check it out: http://www.github.com/alexandrejaguar/programandociencia. Have you installed Anaconda? Or the Python version of your system? What about Spyder? Go for it, install what is missing and come back later!

Primeiro criamos os eixos tridimensionais (valeu Welton Vaz!), importamos as bibliotecas necessárias, a pyplot (presente na matplotlib) e a numpy:

First we create the 3D axes (thanks Welton Vaz!) import the libraries that we’ll use, pyplot (from matplotlib) and numpy:

from mpl_toolkits.mplot3d import Axes3D  # ajuda do Welton Vaz: https://github.com/weltonvaz

import matplotlib.pyplot as plt
import numpy as np

Depois, definimos duas constantes: n_angles (número de ângulos) e n_radii (número de raios). Vamos usar os valores 72 e 4, respectivamente.

After that we define two constants: n_angles (number of angles) and n_radii (number of radii). Let’s use 72 and 4, respectively.

n_angles = 72
n_radii = 4

Agora vamos criar um vetor de raios com a função linspace(); esse vetor vai de 0,125 a 1 e é dividido no número de raios que definimos anteriormente. Ainda não incluímos zero, pra não duplicar os pontos depois.

Now we’ll create a radii vector using linspace(); this vector goes from 0.125 to 1 and it’s divided on the radii number which we defined previously. We won’t include zero yet, in order to not duplicate points.

radii = np.linspace(0.125, 1.0, n_radii)

Faremos a mesma coisa com os ângulos: num intervalo de 0 a 2*pi, teremos o número de ângulos definidos anteriormente. Veja que o número final do intervalo entra (endpoint=True).

We’ll do the same thing with the angles: from 0 to 2*pi, we’ll have the number of angles defined previously. Note that the interval final number is in (endpoint=True).

angles = np.linspace(0, 2*np.pi, n_angles, endpoint=True)

Então, para cada raio, repetiremos o vetor dos ângulos, criando uma malha. Essa malha representará os pontos da nossa função.

Then, for each radius, we repeat the angle vector, creating a grid. This grid will represent the points of our function.

angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)

Agora os pontos são convertidos de coordenadas polares (raio e ângulo) para coordenadas cartesianas (x e y). Aqui adicionamos o zero, usando append:

Now the points are converted from polar coordinates (radius and angle) to cartesian coordinates (x and y). Here we’ll add zero, using append:

x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())

Então podemos aplicar uma função nos pontos da malha. Escolhemos a função abaixo:

Then we can apply a function on the grid points. We chose the function below:

z = np.sin(-x*(y**2))+np.cos((x**2)*-y)

Depois criamos uma figura e indicamos a projeção em 3D.

After that we create a figure and indicate the 3D projection.

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

Finalmente, usamos a função plot_trisurf() para gerar nosso gráfico. Veja que o mapa de cores escolhido foi o ‘Oranges’, e o comprimento da linha é de 0,1. Quer testar mapas de cores diferentes? Veja quantas opções há nessa página aqui! Altere também o comprimento de linha e veja como o gráfico se comporta.

Finally, we use the function plot_trisurf() to generate our plot. Check that the we chose the colormap ‘Oranges’, and the line width is 0.1. Would you like to try different colormaps? Check the several options of this page here! Change also the line width and see how this plot behaves.

ax.plot_trisurf(x, y, z, cmap='Oranges', linewidth=0.1)
plt.show()

Pronto! O gráfico resultante é esse aqui:

There you go! The resulting plot is this one:

ex_trisurf

E é isso aí cientista! Faça testes com outras funções e veja os resultados. É só alterar a linha z = np.sin(-x*(y**2))+np.cos((x**2)*-y) e continuar os outros comandos.
Pra fechar, e nosso sorteio? Vai ficar de fora? Veja aqui como participar!
Por hoje é só! Um giga abraço!

That’s it for today scientist! Make some tests with another functions and see the results. Just change the line z = np.sin(-x*(y**2))+np.cos((x**2)*-y) and follow the other commands.
Gigaregards!


Gostou? Curta e compartilhe com seus amigos!
Curta a gente também no Facebook: www.facebook.com/programandociencia
Estou no Twitter! Siga-me se puder! @alexdesiqueira

Like this? Please comment and share with your friends!
Like us also on Facebook: www.facebook.com/programandociencia
I’m on Twitter! Follow me if you can! @alexdesiqueira

One thought on “Gráficos tridimensionais no Python [PARTE I] / Three-dimensional plots on Python [PART I]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s