Universidad de Oviedo Grado en F´ısica Introducción a la F´ısica

Transcripción

Universidad de Oviedo Grado en F´ısica Introducción a la F´ısica
Universidad de Oviedo
Grado en Fı́sica
Introducción a la Fı́sica Computacional
Julio Manuel Fernández Dı́az, Rosario Dı́az Crespo
Curso 2014-15
Representaciones gráficas en 2D y 3D
Práctica 8
Representaciones gráficas en 2D y 3D
8.1.
Objetivo
Familiarizarse con los módulos de representaciones gráficas de Python incluidos en el paquete
Matplotlib.
8.2.
Gráficas en 2D
Existen diversos paquetes de módulos para representar gráficas en 2D y 3D. Usaremos el paquete
Matplotlib, considerado como una especie de ‘estándar’.
Para representaciones en 2D usaremos el módulo Matplotlib.pyplot, que contiene una colección
R
de funciones que son similares a las usadas en Matlab
.
Más información está disponible en
http://matplotlib.sourceforge.net/
8.2.1.
Cómo funciona Matplotlib
Matplotlib tiene el concepto de ‘figura actual’, también con el ‘área de dibujo actual’ y ‘ejes actuales’,
pudiendo cambiarse en cada momento cualquiera de ellos.
Una figura puede contener subfiguras (diferentes zonas de dibujo), y se pueden anotar con tı́tulos,
tı́tulos de ejes, etc.
El módulo de dibujo es matplotlib.pyplot
1
Universidad de Oviedo
8.2.2.
Departamento de Fı́sica
Cómo usar pyplot
Para evitar ‘contaminaciones’ del espacio global de variables y funciones lo importaremos ası́:
import matplotlib.pyplot as plt
El primer comando gráfico que empleemos crea una figura a la que irán los elementos gráficos que
se vayan añadiendo.
Para crear expresamente una nueva figura usaremos
plt.figure()
8.2.3.
Salida interactiva o a fichero
Los comandos gráficos no se irán mostrando en pantalla hasta que se utilice el comando
plt.show()
Sin embargo es posible que no nos interese mostrar los resultados en pantalla sino en un fichero
gráfico con el comando
plt.savefig()
Ejemplo 8.2.1. Un ejemplo simple
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16])
plt.title(’Una figura simple’)
plt.xlabel(u’algunos números’)
plt.ylabel(’cuadrados’)
plt.show()
La u inicial de u’algunos números’ sirve para introducir una cadena de caracteres Unicode, con
lo que se permiten acentos, eñes, etc.
Introducción a la Fı́sica Computacional
2
Universidad de Oviedo
Departamento de Fı́sica
Ejemplo 8.2.2. Realice la representación gráfica de los puntos:
(1, 2), (2, 6), (3.3, 5.4), (4.9, 6.7),
etiquetando el eje Ox con ‘x’ y el eje Oy con ‘dı́as’.
El tı́tulo de la figura debe ser ‘Figura 8.2.2’.
Una solución
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
puntos = [(1.1, 2.1), (2, 6),
(3.3, 5.4), (4.9, 6.7)]
x = [p[0] for p in puntos]
y = [p[1] for p in puntos]
plt.plot(x, y, ’s’)
plt.xlabel(’x’)
plt.ylabel(u’dı́as’)
plt.title("Figura 14.34")
plt.show()
Salida gráfica del ejercicio
Introducción a la Fı́sica Computacional
3
Universidad de Oviedo
Departamento de Fı́sica
Figura 14.34
7
6
d as
5
4
3
2
1.0
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
x
8.2.4.
Dibujo de funciones
Para dibujar funciones necesitamos obtener dos listas (o vectores) con las x y las y de puntos de la
curva:
import matplotlib.pyplot as plt
x = [0.2*i for i in range(25)]
x3 = [v**3 for v in x]
plt.plot(x, x, ’bs’) # dibuja y = x
plt.plot(x, x3, ’r^’) # dibuja y = x3
plt.xlabel(’x’); plt.ylabel(’y’)
plt.axis([0, 6, 0, 80])
plt.show()
plt.plot(x, x, ’bs’) indica que queremos dibujar una curva con los puntos cuyas abscisas y
ordenadas vienen dadas por x, en color azul (b) con cuadrados (‘squares’); plt.plot(x, x3, ’r^’)
otra curva en color rojo (r) con triángulos (ˆ) en la que las abscisas son x y las ordenadas los cubos
de las abscisas.
plt.axis([0, 6, 0, 80]) indica que los ejes tienen los lı́mites xmin = 0, xmax = 6, ymin = 0,
ymax = 80.
El resultado es:
Introducción a la Fı́sica Computacional
4
Universidad de Oviedo
Departamento de Fı́sica
80
70
60
y
50
40
30
20
10
0
0
1
2
3
x
4
5
6
Ejemplo 8.2.3. Realice la representación gráfica de la función cos x usando 50 puntos entre 0 y 10.
Etiquete el eje Ox con ‘x’ y el eje Oy con ‘cos(x)’.
El tı́tulo de la figura debe ser ‘La función coseno’.
Una solución
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
from math import cos
xmax = 10.0; delta = xmax/50
x = [delta*i for i in range(51)]
cx = [cos(v) for v in x]
plt.plot(x, cx, ’b-’)
plt.xlabel(’x’)
plt.ylabel(’cos(x)’)
plt.title(u"La función coseno")
plt.show()
Introducción a la Fı́sica Computacional
5
Universidad de Oviedo
Departamento de Fı́sica
Salida gráfica del ejercicio
La funci n coseno
1.0
cos(x)
0.5
0.0
0.5
1.0
0
2
4
6
8
10
x
8.2.5.
Control de los ejes
Los ejes se controlan con el comando axis, como antes hemos visto. Sin embargo se puede indicar
con una cadena de caracteres otros lı́mites automáticos.
Por ejemplo, para hacer que ambos ejes tengan unidades iguales se utiliza
plt.axis(’equal’)
De esta manera las circunferencias parecen realmente circulares.
Ejemplo 8.2.4. Un ejemplo con ejes iguales
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
from math import cos, sin
from numpy import *
ang = linspace(0, 2*pi, 50)
r = 3.0
plt.plot(r*cos(ang), r*sin(ang), ’b-’)
plt.xlabel(’x’); plt.ylabel(’y’)
plt.title("Una circunferencia")
plt.axis(’equal’)
plt.show()
Introducción a la Fı́sica Computacional
6
Universidad de Oviedo
Departamento de Fı́sica
Salida gráfica del ejemplo
Una circunferencia
3
2
y
1
0
1
2
8.2.6.
3
3
2
1
0
1
2
3
x
Etiquetando las curvas
Se pueden incluir leyendas para etiquetar las curvas mediante la orden legend. Para ello previamente
hay que dibujar la curva incluyendo un argumento label:
plt.plot(x, x3, ’r^’, label=’x^3’)
y luego usar:
plt.legend()
Se pueden proporcionar también argumentos a legend para indicar la posición de la leyenda y otros
atributos.
Ejercicio 8.2.1. Añada a la figura del ejercicio 2 previamente resuelto la curva de sin x en el mismo
rango, en color rojo y con rayas discontinuas.
Etiquete la figura con ‘funciones trigonométricas’ con la leyenda correspondiente (‘cos x’, ‘sin x’)
para las dos curvas.
Ejercicio 8.2.2. Diseñe una función denominada funplot que dibuje una función f entre dos
abscisas, xmin, xmax usando en total np puntos. También se le debe pasar el tipo de lı́nea y la
leyenda (que no dibujará si no se proporciona).
8.2.7.
Guardando la figura
El comando savefig guarda la figura en un fichero gráfico para su posterior manipulación con otros
programas.
Introducción a la Fı́sica Computacional
7
Universidad de Oviedo
Departamento de Fı́sica
Si le ponemos un nombre de fichero con una extensión como emf, eps, pdf, png, ps, y otros,
guardará el fichero con ese formato:
plt.savefig("velocidad.eps")
(Consúltese el manual para otras opciones.)
8.2.8.
Controlando propiedades de las lı́neas
Se pueden controlar las propiedades de las lı́neas usando la función setp. Para ello debe invocarse
a plot mediante:
lines = plt.plot(x, x, ’bs’, x, x3, ’r^’)
Poir ejemplo, para cambiar el estilo de la lı́nea:
plt.setp(lines, linestyle = ’:’)
(Véase el manual de referencia de Matplotlib para tener
una lista de las propiedades modificables.)
8.2.9.
Varias subfiguras
Se pueden dibujar en la misma figura varias gráficas (con diferentes ejes cada una) usando el comando
subplot, que se invoca de la siguiente manera:
plt.subplot(numfilas, numcolumnas, numfigura)
Las figuras se numeran de izquierda a derecha y de arriba abajo. plt.subplot(2, 4, ...) serı́a
la orden para dos filas y cuatro columnas, numeradas:
1 2 3 4
5 6 7 8
Ejemplo 8.2.5. Un ejemplo con subfiguras
import matplotlib.pyplot as plt
from numpy import *
def f(t): return exp(-t)*cos(2*pi*t)
t1 = arange(0.0, 5.0, 0.1)
t2 = arange(0.0, 5.0, 0.02)
plt.subplot(2,1,1)
plt.plot(t1, f(t1), ’bo’, t2, f(t2), ’k’)
plt.subplot(2,1,2)
plt.plot(t2, cos(2*pi*t2), ’r--’)
plt.show()
Introducción a la Fı́sica Computacional
8
Universidad de Oviedo
Departamento de Fı́sica
Salida gráfica del ejemplo
1.0
0.8
0.6
0.4
0.2
0.0
0.2
0.4
0.6
0.8
0
1
2
3
4
5
1
2
3
4
5
1.0
0.5
0.0
8.2.10.
0.5
1.0
0
Otros comandos de dibujo (hay más)
hist para dibujar histogramas
bar para representar barras verticales
errorbar para dibujar barras de error
loglog para usar ejes logarı́tmicos
semilogx para usar eje Ox logarı́tmico
semilogy para usar eje Oy logarı́tmico
scatter para realizar diagramas de dispersión
polar para diagramas polares
contour para dibujar lı́neas de contorno
contourf para dibujar rellenos de contorno
quiver para dibujar campos vectoriales
Ejemplo 8.2.6. Un ejemplo de contourf
import matplotlib.pyplot as plt
from numpy import ogrid
# ogrid retorna un mallado bidimensional
x,y = ogrid[-1:1:0.01, -1:1:0.01]
z = 3*y*(3*x**2-y**2)/4
plt.contourf(z, extent=[-1,1,-1,1])
plt.show()
Introducción a la Fı́sica Computacional
9
Universidad de Oviedo
Departamento de Fı́sica
Salida gráfica del ejemplo
1.0
0.5
0.0
0.5
1.0
1.0
0.5
0.0
0.5
1.0
Ejemplo 8.2.7. La función y = axb se representa mejor con escalas logarı́tmicas en ambos ejes,
usando loglog (realmente sale una recta).
Realice la representación gráfica de la función anterior con a = 10.0, b = 0.3, entre 10−3 y 10
usando 50 puntos.
Una solución
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
a, b = 10.0, 0.3
xmin, xmax, np = 1.0e-3, 10.0, 50
delta = (xmax-xmin)/np
x = [xmin+delta*i for i in range(51)]
y = [a*v**b for v in x]
plt.loglog(x, y, ’b-’)
plt.xlabel(’x’)
plt.ylabel(’y’)
plt.show()
Introducción a la Fı́sica Computacional
10
Universidad de Oviedo
Departamento de Fı́sica
Salida gráfica del ejercicio
y
10
10
2
1
0
10
-3
10
10
-2
10
-1
10
0
10
1
x
8.2.11.
Anotando figuras
Se puede incluir una cadena de caracteres en un punto (xt, yt) mediante el comando text:
plt.text(xt, yt, "Turner")
Se puede añadir una flecha usando annotate:
plt.annotate("Lin", xy = (xa, ya), xytext = (xt, yt),
arrowprops=dict(facecolor=’black’, shrink=0.05, width=1))
que coloca el texto en las coordenadas (xt, yt), con una flecha que tiene su punta en (xa, ya).
Ejemplo 8.2.8. Dibuje la función y = 0.2 exp(−(x + 3)2 ) entre las abscisas −5 y 0, y las ordenadas
0 y 0.3, etiquetando el máximo de la función con ‘máximo’ y una flecha indicativa.
Una solución
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
from math import exp
xmin, xmax, ymin, ymax, np = -5.0, 0.0, 0.0, 0.3, 50
delta = (xmax-xmin)/np
x = [xmin+delta*i for i in range(np+1)]
y = [0.2*exp(-(v+3.0)**2) for v in x]
Introducción a la Fı́sica Computacional
11
Universidad de Oviedo
Departamento de Fı́sica
plt.plot(x, y, ’b-’)
plt.xlabel(’x’); plt.ylabel(’y’)
plt.axis([xmin, xmax, ymin, ymax])
plt.annotate(u"máximo", xy = (-3.0, 0.2), xytext = (-1.5, 0.25),
arrowprops=dict(facecolor=’black’, shrink=0.05, width=1))
plt.show()
Salida gráfica del ejercicio
mximo
0.25
y
0.20
0.15
0.10
0.05
0.005
8.3.
4
3
x
2
1
0
Gráficas en 3D
Para visualización de curvas y superficies en 3D usaremos el módulo matplotlib.mplot3d.
Evidentemente no existe posibilidad fı́sica de representar en 3D sino que se recurre a proyecciones
sobre la pantalla (2D).
Más información está disponible en
http://matplotlib.sourceforge.net/
mpl toolkits/mplot3d/tutorial.html
8.3.1.
Usando mplot3d
Para usar ese módulo se debe usar el submódulo Axes3D de la manera siguiente:
import matplotlib.pyplot as plt
from mpl toolkits.mplot3d import Axes3D
Introducción a la Fı́sica Computacional
12
Universidad de Oviedo
Departamento de Fı́sica
Luego se asocia la figura que se crea con el comando Axes3D a unos ejes, ax, en 3D:
fig = plt.figure()
ax = Axes3D(fig)
8.3.2.
Dibujo de curvas con mplot3d
Ahora ya se pueden dibujar curvas proyectadas en la pantalla mediante:
ax.plot(x, y, z, label=’una curva’)
ax.legend()
plt.show()
(obviamente después de definir los vectores x, y, z)
Ejemplo 8.3.1. Un ejemplo de curva en 3D
from mpl toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from numpy import *
fig = plt.figure()
ax = Axes3D(fig)
th = linspace(-4*pi, 4*pi, 100)
z = linspace(-2, 2, 100)
r = z**2 + 1; x = r*sin(th); y = r*cos(th)
ax.plot(x, y, z, label=’una curva’)
ax.legend()
plt.show()
Salida gráfica del ejemplo
Introducción a la Fı́sica Computacional
13
Universidad de Oviedo
Departamento de Fı́sica
una curva
1.5
1.0
0.5
0.0
0.5
1.0
1.5
4
3
8.3.3.
4
2
3
1
2
1
0
1
2
3
4
0
1
2
3
Superficies con mplot3d
También se pueden dibujar superficies proyectadas en la pantalla mediante ax.plot surface(x,
y, z).
El mapa de colores que se asocian a los valores de z se puede variar, usando por ejemplo los
suministrados en el módulo cm que se importa mediante
from matplotlib import cm
Veamos ahora el mismo ejemplo que hemos representado antes con contourf.
Ejemplo 8.3.2. Un ejemplo de superficie en 3D
from mpl toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from numpy import *
fig = plt.figure()
ax = Axes3D(fig)
xv = arange(-1, 1, 0.05); yv = arange(-1, 1, 0.05)
x, y = meshgrid(xv, yv); z = 3*y*(3*x**2-y**2)/4
ax.plot surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet)
ax.set xlabel("x"); ax.set ylabel("y"); ax.set zlabel("z")
plt.show()
Salida gráfica del ejemplo
Introducción a la Fı́sica Computacional
14
Universidad de Oviedo
Departamento de Fı́sica
1.0
0.5
z
0.0
0.5
1.0
0.5
0.0
0.5
0.5
0.0
x
y
0.5
Salida gráfica con contourf
1.0
0.5
0.0
0.5
1.0
1.0
0.5
0.0
0.5
1.0
Ejemplo 8.3.3. Dibuje la función
z = 0.2 sin x exp(−(x + 3)2 ) exp(−(y + 2)2 )
con x ∈ [−0, 0], y ∈ [−5, 0].
Una solución
Introducción a la Fı́sica Computacional
15
Universidad de Oviedo
Departamento de Fı́sica
from mpl toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from numpy import *
fig = plt.figure(); ax = Axes3D(fig)
xv = arange(-5, 0, 0.1); yv = arange(-5, 0, 0.1)
x, y = meshgrid(xv, yv)
z = 0.2*sin(x)*exp(-(x+3)**2)*exp(-(y+2)**2)
ax.plot surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet)
ax.set xlabel("x"); ax.set ylabel("y"); ax.set zlabel("z")
plt.show()
Salida gráfica del ejercicio
0.06
0.04
0.02
z
0.00
0.02
0.04
0.06
0.08
4
3
x
2
2
1
y
3
4
1
Ejercicio 8.3.1. Represente la función z = (sin x)(sin 3y) en el rango x ∈ [0.1, 1.1], y ∈ [0.1, 1.1].
Introducción a la Fı́sica Computacional
16

Documentos relacionados