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