Kiko Correoso

Lanzando proyectiles (con ayuda de vpython)

La mayoría de vosotros habréis resuelto el típico problema del lanzamiento de un proyectil que describe una trayectoria parabólica. Las ecuaciones que describen el movimiento son:

  • Vector posición

$latex x = v_{0x} t + x_0$
$latex y = -frac{1}{2} g t^{2} + v_{0y} t + y_0$

  • Vector velocidad

$latex v_x = v_{0x}$ con $latex v_{0x} = v_0 cos alpha$
$latex v_y = -g t + v_{0y}$ con $latex v_{0y} = v_0 sin alpha$
Hoy vamos a intentar resolverlo de forma gráfica con la ayuda de python y vpython. La biblioteca vpython une python con una librería gráfica 3D de forma que, como vamos a ver, hacer animaciones 3D sencillas se convierte en un juego.
[sourcecode language=”python”]
import visual as vs
import numpy as np
## valores iniciales (modifícalos bajo tu responsabilidad)
v0 = 20 ## v en m/s
alfa = 60 ## ángulo en grados
vel_fotogramas = 10  ## la velocidad del video
## Constantes
g = 9.81 ## Aceleración de la gravedad
## ecuaciones
v0x = v0 * np.cos(np.deg2rad(alfa))
v0z = v0 * np.sin(np.deg2rad(alfa))
t_total = 2 * v0z / g
x_final = v0x * t_total
## Empezamos con visual python (vpython)
## Creamos el ‘suelo’
suelo = vs.box(pos = (x_final/2., -1, 0),
size = (x_final, 1, 10), color = vs.color.green)
## Creamos el ‘cañón’
canyon = vs.cylinder(pos = (0, 0, 0),
axis = (2 * np.cos(np.deg2rad(alfa)), 2 * np.sin(np.deg2rad(alfa)), 0))
## Creamos el proyectil y una línea que dejará la estela del proyectil
bola = vs.sphere(pos = (0, 0, 0))
bola.trail = vs.curve(color=bola.color)
## Creamos la flecha que indica la dirección del movimiento (vector velocidad)
flecha = vs.arrow(pos = (0, 0, 0),
axis = (v0x, v0z, 0), color = vs.color.yellow)
## texto (ponemos etiquetas para informar de la posición del proyectil)
labelx = vs.label(pos = bola.pos, text= ‘posicion x = 0 m’, xoffset=1,
yoffset=80, space=bola.radius, font=’sans’, box = False,
height = 10)
labely = vs.label(pos = bola.pos, text= ‘posicion y = 0 m’, xoffset=1,
yoffset=40, space=bola.radius, font=’sans’, box = False,
height = 10)
## Animamos todo el cotarro!!!
t = 0
while t <= t_total:
bola.pos = (v0x * t, v0z * t – 0.5 * g * t**2, 0)
flecha.pos = (v0x * t, v0z * t – 0.5 * g * t**2, 0)
flecha.axis = (v0x, v0z – g * t, 0)
bola.trail.append(pos=bola.pos)
labelx.pos = bola.pos
labelx.text = ‘posicion x = %s m’ % str(v0x * t)
labely.pos = bola.pos
labely.text = ‘posicion y = %s m’ % str(v0z * t – 0.5 * g * t**2)
t = t + t_total / 100.
vs.rate(vel_fotogramas)
[/sourcecode]
Voy a explicar brevemente lo que hace el código:
Leer más »Lanzando proyectiles (con ayuda de vpython)

Matrópolis

Aquí siempre andamos trasteando con código. Para relajar un poco el lado técnico del blog hoy os traemos una frikada que sabemos os gustará. Ya lo puso Juanlu hace unos días por nuestro twitter pero si no lo has visto aún, aquí lo tienes: “Matropolis: Científicos del mundo uníos (también… Leer más »Matrópolis

Manual de introducción a matplotlib.pyplot (IX): Miscelánea

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0 ]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
[/sourcecode]
Después de dar un repaso por toda la librería, obviando algunas funciones estadísticas y eventos, vamos a acabar este tutorial viendo algunas funciones que sirven para leer y guardar imágenes.
Imaginad que queréis usar una imagen de fondo, por ejemplo vuestro nombre, o las siglas de creative commons o una foto,…, en vuestros gráficos. Para el ejemplo que vamos a ver a continuación vamos a usar la imagen que está en el siguiente enlace como fondo (guardadala en local para poder leerla).
[sourcecode language=”python”]
background = plt.imread(‘Cc.large.png’) # Leemos la imagen que queremos usar de fondo, lo que escribáis entre comillas es la ruta a la imagen
x = np.arange(background.shape[1]) # Definimos valores de x
y = np.random.rand(background.shape[0]) * background.shape[0] # Definimos valores de y
plt.plot(x, y) # Dibujamos la serie
plt.imshow(background, alpha = 0.25) # Creamos el fondo con una transparencia del 0.10 (1 es opaco y 0 es transparente)
[/sourcecode]
El resultado es el siguiente:

Con plt.imread lo que hacemos es leer una imagen y convertirla en un numpy array que más tarde podemos utilizar como queramos (en este caso, como fondo para la imagen). Con plt.imshow lo que hemos hecho es mostrar la imagen en pantalla. Por último, que sepáis que también existe plt.imsave, que permite guardar un numpy array como una imagen.
Leer más »Manual de introducción a matplotlib.pyplot (IX): Miscelánea

The amazing Spyder, man!!!

Spyder es la abreviación de Scientific PYthon Development EnviRonment. Según la documentación oficial, Spyder es un potente entorno de desarrollo interactivo para Python con edición avanzada, ‘testeo’ interactivo y capacidades de introspección y depuración (debugging) y, esto es lo que nos interesa, un entorno de computación numérica gracias al soporte de IPython y de populares librerías como numpy, scipy y matplotlib (todas conocidas ya por aquí).
Se puede instalar tanto en Linux como en Windows (y en Mac para los amantes de Alcatraz). En el siguiente enlace podéis ver documentación para la instalación y los requerimientos previos para poder instalarlo.
En un vistazo general podemos ver que es muy adaptable a nuestras necesidades (o manías) permitiendo:

  • definir accesos rápidos,
  • Gestionar el PYTHONPATH de manera visual

  • Acceso a la documentación de las librerías más importantes (Numpy, Scipy, Matplotlib,…) desde la ayuda del propio IDE
  • Acceso directo a herramientas (y documentación) Qt.
  • Configuración del coloreado de la sintáxis
  • Podemos colocar los paneles como mejor nos convenga. En general, yo lo configuro con un explorador de archivos a la izquierda, el editor a la derecha y abajo cosas útiles como consolas, el historial, y el explorador de variables:
  • Pero con el mismo ratón se puede recolocar todo de forma sencilla y se puede elegir que aparece en la pantalla desde el menú ‘view | Windows and toolbars’:

Puedes ver más pantallazos en el siguiente enlace.
El editor en sí permite resaltar código Python, C/C++ y Fortran, completado de código, permite analizar el código con pylint, depurar con pdb (o winpdb), avisos y errores en tiempo real con pyflakes,… Lo mínimo que lleva hoy en día cualquier editor potente.
Leer más »The amazing Spyder, man!!!

Manual de introducción a matplotlib.pyplot (VIII): Texto y anotaciones

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0 ]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… En esta ocasión nos interesa ver como podemos meter anotaciones, tablas,…, en nuestros gráficos.
A lo largo de las anteriores entregas del tutorial hemos podido ver algunas formas de tener anotaciones típicas para el título, los ejes, leyenda,… (title, suptitle, xlabel, ylabel, figtext, legend,…). En este caso vamos a revisar las posibilidades de escribir texto personalizado mediante el uso de plt.text, plt.arrow, plt.annotate y plt.table.
Leer más »Manual de introducción a matplotlib.pyplot (VIII): Texto y anotaciones

Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1, matplotlib 1.1.0, netcdf4-python 0.9.9 y Basemap 1.0.2]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
from mpl_toolkits.basemap import Basemap as Bm
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… Ahora vamos a ver un último capítulo sobre tipos de gráficos. En esta última entrada sobre los tipos de gráfico hemos metido gráficos que quizá no estén muy relacionados entre sí por lo que quizá este capítulo puede parecer un poco cajón desastre.
Leer más »Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

Manual de introducción a matplotlib.pyplot (VI): Tipos de gráfico (III)

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… Ahora vamos a continuar viendo tipos de gráficos disponibles desde matplotlib.pyplot. En este caso nos vamos a centrar en otros gráficos que, quizá, sean menos usados que los vistos hasta ahora. Algunos ya los hemos visto en otras entradas, como gráficos polares, gráficos de contornos [1] [2],…
Vamos a empezar por ver un gráfico tipo tarta de quesitos o tipo tarta o como lo queráis traducir (en inglés se llama pie chart). Estos sos los típicos gráficos que ponen en los periódicos con los resultados de elecciones o cosas así. En este caso vamos a ver un ejemplo real a partir de los datos de las visitas por países a este humilde blog:
[sourcecode language=”python”]
plt.ion() # Ponemos el modo interactivo
visitas = [43.97, 9.70, 7.42, 6.68, 3.91, 3.85, 3.62, 3.43, 3.16, 3.04] # Definimos un vector con el % de visitas del top ten de países
visitas = np.append(visitas, 100. – np.sum(visitas)) # Introducimos un último elemento que recoge el % de visitas de otros países fuera del top ten
paises = [u’España’, u’México’, ‘Chile’, ‘Argentina’, ‘Colombia’, ‘Ecuador’, u’Perú’, ‘USA’, ‘Islandia’, ‘Venezuela’, ‘Otros’] # Etiquetas para los quesitos
explode = [0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0] # Esto nos ayudará a destacar algunos quesitos
plt.pie(visitas, labels = paises, explode = explode) # Dibuja un gráfico de quesitos
plt.title(u’Porcentaje de visitas por país’)
[/sourcecode]
El resultado se puede ver en el gráfico siguiente. Como habréis adivinado, explode sirve para separar quesitos del centro de la tarta. En este caso hemos separado los quesitos de USA e Islandia para destacar los países no hispanohablantes:

Leer más »Manual de introducción a matplotlib.pyplot (VI): Tipos de gráfico (III)