curso python basico
Gratificando con Matplotlib
Generalidades de Matplotlib
Para ésta parte vamos a usar una terminal de Python (no de iPython que es la que generalmente usamos)
Cargando la librería en el entorno.
Cuando se va a usar la librería se debe de cargar en el entorno (como ya se vio anteriormente)
import matplotlib.pyplot as plt
Las dos zonas principales donde se dibujaran o sobre las que se interactuará serán:
- figure: Es una instancia de matplotlib.figure.Figure. Y es la ventana donde irá el o los gráficos en sí.
Sintaxis:import matplotlib.pyplot as plt plt.figure #Se debe de tener en cuenta que ptl en este caso traduce matplotlib
- axes:: Es una instancia de matplotlib.axes.Axes, que es el gráfico en sí donde se dibujará todo lo que le digamos y está localizada dentro de una figure
Sintaxis:import matplotlib.pyplot as plt plt.axes #Se debe de tener en cuenta que ptl en este caso traduce matplotlib
Ventanas, y configuración de sesión.
Lo primero que se va a necesitar es que la sesión esté en modo interactivo, esto es: que cada que se realice un cambio en ésta, se muestre automáticamente.
plt.isinteractive()
cuando ejecute esta linea la respuesta es false entonces tiene el modo interactivo desactivado. Para cambiar de modo interactivo de a activo se usa plt.ion() y para regresar al modo interactivo apagado se usa plt.ioff().
- Ejemplo: Ahora con el modo interactivo encendido, hagamos la primera gráfica.
plt.plot([1,7,3,-3,5])
Otras funcionalidades interesantes son las que provee, las funciones asociadas plt, hold() y ishold(), la primera permite decidir si queremos que los gráficos se sobrescriban, que en el mismo gráfico tengamos diferentes gráficas representadas, o para que el gráfico se limpie y se dibuje la nueva gráfica cada vez. La segunda permite saber el estado de hold(). Si usamos plt.ishold() nos responderá True o False.
- Ejemplo:
plt.plot(np.random.rand(10)) plt.plot(np.random.rand(10)) plt.show()
Para borrar todos los gráficos en el modo interactivo se usa plt.clf(), o plt.close() para cerrar la ventana.
También se pueden usar diferentes ventanas de gráficos al mismo tiempo. Esto se hace nombrando a cada una de las ventanas en las que vamos a trabajar cuando se llama plt.figure('nombre').
- Ejemplo:
import matplotlib.pyplot as plt import numpy as np plt.figure('scatter') # Crea una ventana titulada 'scatter' plt.figure('plot') # Crea una ventana titulada 'plot' a = np.random.rand(100) # Generamos un vector de valores aleatorios b = np.random.rand(100) # Generamos otro vector de valores aleatorios """Le decimos que la ventana activa en la que vamos a dibujar es la ventana 'scatter'""" plt.figure('scatter') plt.scatter(a,b) # Dibujamos un scatterplot en la ventana 'scatter' plt.figure('plot') # Ahora cambiamos a la ventana 'plot' plt.plot(a,b)
Si no se quiere dibujar los gráficos en dos ventanas, y mas bien tener varios gráficos en la misma. Es posible hacer eso sin problemas con la ayuda de plt.subplot(). Con plt.subplot() podemos indicar el número de filas y columnas que corresponderán a como dividimos la ventana.
- Ejemplo:
import matplotlib.pyplot as plt plt.ion() # Nos ponemos en modo interactivo # Dividimos la ventana en una fila y dos # columnas y dibujamos el primer gráfico plt.subplot(1,2,1) plt.plot((1,2,3,4,5)) # Dividimos la ventana en una fila y dos # columnas y dibujamos el segundo gráfico plt.subplot(1,2,2) plt.plot((5,4,3,2,1))
- Actividad 1
Modificar características de las gráficas
En el siguiente script se puede ver algunas de las modificaciones que se pueden hacer en las gráficas.
import matplotlib.pyplot as plt plt.ion() # Nos ponemos en modo interactivo plt.figure('valores por defecto')# Creamos una ventana donde dibujamos el gráfico con la configuración por defecto plt.suptitle('Titulo valores por defecto') # Esto sirve para poner título dentro de la ventana plt.plot((1,2,3,4,5), label = 'por defecto') # Hacemos el plot plt.legend(loc = 2)# Colocamos la leyenda en la esquina superior izquierda plt.rc('lines', linewidth = 2)# A partir de aquí todas las líneas que dibujemos irán con ancho doble plt.rc('font', size = 18)# A partir de aquí las fuentes que aparezcan en cualquier gráfico en la misma sesión tendrán mayor tamaño plt.figure('valores modificados') plt.suptitle('Titulo valores modificados') plt.plot((1,2,3,4,5), label = u'linea más ancha y letra más grande') plt.legend(loc = 1)
Otras posibles configuraciones de la gráfica se pueden ver en la ayuda de ipython y online.
Configuración del gráfico
Con plt.axes(), que sirve para llamar y/o configurar a un crea de gráfico. Podemos definir la posición, el tamaño, el color del {rea del fondo. En el siguiente ejemplo se pueden ver algunas configuraciones.
import matplotlib.pyplot as plt import numpy as np plt.ion() # Ponemos la sesión como interactiva si no está plt.axes() # Coloca un área de gráfico con los valores por defecto # Dibuja una exponencial de 0 a 10 plt.plot(np.exp(np.linspace(0,10,100))) # Dibuja una nueva área de gráfica colocada y con ancho y largo definido por [0.2,0.55,0.3,0.3] y con gris como color de fondo plt.axes([0.2,0.55,0.3,0.3], axisbg = 'gray') plt.plot(np.sin(np.linspace(0,10,100)), 'b-o', linewidth = 2)
- Actividad:Modifique los valores del área e identifique que cambia cuando modifica cada número
Es posible usar plt.axes() como sustituto de plt.subplot() si se quiere dibujar gráficos que no tengan que tener una forma ‘regular’ dentro de la ventana. En este caso si se quiere borrar el área del gráfico podemos usar plt.delaxes().
También se puede hacer que no aparezca la ‘caja’ donde se dibuja el gráfico con plt.box() o si no hay ‘caja’ y queremos que aparezca podemos llamar a plt.box() y volver a hacer aparecer la ‘caja’. Otra cosa de utilidad es colocar una rejilla en el gráfico mediante plt.grid().
Nota: Se pueden hacer también axes polares con plt.axes( polar = True), rejillas para polares con plt.rgrid() y plt.thetagrids()
Matplotlib dibuja los ejes tal que se ajusten al gráfico pero si eso no es lo que nos interese en algún momento, entonces se puede hacer uso de plt.axis(). Esta Nos permite definir la longitud de los ejes, si queremos que aparezcan los mismos, si queremos que estos estén escalados,... Si solo nos interesa configurar uno de los ejes y dejar que el otro lo maneje matplotlib podemos usar plt.xlim(), plt.xscale(),plt.ylim() y plt.yscale().
Si queremos dejar el eje x o el eje y con escala logarítmica podemos usar, respectivamente, plt.semilogx() o plt.semilogy(). Podemos dibujar un segundo eje x o un segundo eje y usando plt.twinx() o plt.twiny, respectivamente.
También podemos establecer unos márgenes alrededor de los límites de los ejes usando plt.margins(). Por último, podemos etiquetar nuestros ejes con plt.xlabel() y plt.ylabel()
- Ejemplo:
import numpy as np import matplotlib.pyplot as plt plt.ion() plt.plot(np.arange(100), 'b') # Dibujamos una línea recta azul plt.xlabel('Valores de x') # Ponemos etiqueta al eje x plt.ylabel(u'Línea azul') # Ponemos etiqueta al eje y plt.twinx() # Creamos un segundo eje y # Dibuja una exponencial de 0 a 5 con la y representada en el # segundo eje y plt.plot(np.exp(np.linspace(0,5,100)), 'g') plt.ylabel(u'Línea verde') # Ponemos etiqueta al segundo eje y # Limitamos los valores del eje x para que vayan desde -10 a 110 plt.xlim(-10,110)
Las funciones plt.axvline() y plt.axhline() dibujan líneas verticales y horizontales en la x o en la y que le digamos mientras que plt.axvspan y plt.axhspan dibujan recuadros entre las coordenadas x o y que queramos, respectivamente.
- Ejemplo:
import numpy as np import matplotlib.pyplot as plt plt.ion() # Ponemos el modo interactivo # Dibujamos un scatterplot de valores aleatorios plt.scatter(np.random.randn(1000),np.random.randn(1000)) # Dibujamos una línea vertical verde centrada en x = -0.5 plt.axvline(-0.5, color = 'g') # Dibujamos una línea vertical verde centrada en x = 0.5 plt.axvline(0.5, color = 'g') # Dibujamos una línea horizontal verde centrada en x = -0.5 plt.axhline(-0.5, color = 'g') # Dibujamos una línea horizontal verde centrada en x = 0.5 plt.axhline(0.5, color = 'g') # Dibujamos un recuadro azul vertical entre x[-0.5,0.5] # con transparencia 0.25 plt.axvspan(-0.5,0.5, alpha = 0.25) # Dibujamos un recuadro azul horizontal entre x[-0.5,0.5] # con transparencia 0.25 plt.axhspan(-0.5,0.5, alpha = 0.25)
El uso del texto dentro de las gráficas se muestra en el siguiente ejemplo:
- Ejemplo:
plt.ion() # Ponemos modo interactivo import matplotlib.pyplot as plt import numpy as np import calendar # Para generar el lugar del primer días de cada mes en un año dias = [np.array(calendar.mdays)[0:i].sum()+ 1 for i in np.arange(12)+1] # Creamos una lista con los nombres de los meses meses = calendar.month_name[1:13] plt.axes([0.1,0.2,0.8,0.65]) # Creamos un plot con 365 valores plt.plot(np.arange(1,366), np.random.rand(365), label = 'valores al azar') plt.xlim(-5,370) # Los valores del eje y variarán entre -5 y 370 plt.ylim(0,1.2) # Los valores del eje y variarán entre 0 y 1.2 plt.legend() # Creamos la caja con la leyenda plt.title(u'Ejemplo de título') # Ponemos un título # Ponemos un título superior plt.suptitle(u'Ejemplo de título superior') # Pedimos que se vean subrrayas de división en los ejes plt.minorticks_on() # Colocamos las etiquetas, meses, en las posiciones, días, # con color azul y rotadas 45o plt.xticks(dias, meses, size = 'small', color = 'b', rotation = 45) plt.xlabel(u't (días)') plt.ylabel('Media diaria')
Otros tipos de gráfico son plt.plot_date(), que es similar a plt.plot() considerando uno o ambos ejes como fechas, y plt.plotfile(), que dibuja directamente desde los datos de un fichero.
Otro tipo de gráfico sería el que podemos obtener con plt.stem(). Dibuja líneas
verticales desde una línea base.
- Ejemplo:
plt.ion() # Nos ponemos en modo interactivo x = np.arange(25) + 1 # Valores de x y = np.random.rand(25) * 10. # Valores de y # Valores de y normalizados. Esta nueva serie tiene media 0 y desvicación estándar 1 y_norm = (y - y.mean()) / y.std() # Colocamos los límites del eje x plt.xlim(np.min(x) - 1, np.max(x) + 1) # Colocamos los límites del eje y plt.ylim(np.min(y_norm)-1, np.max(y_norm)+1) # Dibujamos los valores por encima de la media plt.stem(x[y_norm > 0],y_norm[y_norm > 0],linefmt='k-.',markerfmt='go',basefmt='b-') # Dibujamos los valores por debajo de la media plt.stem(x[y_norm < 0],y_norm[y_norm < 0],linefmt='k-.',markerfmt='ro',basefmt='b-') # Colocamos el título del gráfico plt.title(u'Representación de (x, f(x))') plt.xlabel('valores x') # Colocamos la etiqueta en el eje x plt.ylabel('valores f(x)') # Colocamos la etiqueta en el eje y
- Actividad: Comentar el siguiente código, diciendo en cada paso que es lo que hace.
plt.ion() x = np.arange(100) y = np.random.rand(100) plt.plot(x,y, color = 'black', label = '(x, f(x)') plt.plot(x[y > 0.9], y[y > 0.9],'bo', label = 'f(x) > 0.9') plt.axhspan(0.9, 1, alpha = 0.1) plt.ylim(0,1.2) plt.legend() plt.title(u'Parejas ordenadas (x, f(x))') plt.xlabel('X') plt.ylabel('f(x)')