miércoles, 2 de diciembre de 2020

Dibujando Gráficos Sencillos en Python - Librería Matplotlib


 

Dibujando Gráficos Sencillos en Python - Librería Matplotlib

En este post vamos a explicar como crear gráficos sencillos para representar datos en Python.

Para ello usaremos la libreria Matplotlib.

Lo primero, como siempre, es crear un entorno virtual donde instalaremos todos las librerías necesarias.

Para ello creamos un directorio de trabajo (yo lo llamaré src) y dentro de él teclearemos:

$ python3 -m venv miEntorno

Una vez realizado lo anterior, procedemos a activar el entorno:

$ source miEntorno/bin/activate

Procedemos a instalar Matplotlib

(miEntorno) pi@rapsberry:~/scr$ pip install matplotlib

Aunque podríamos ya escribir el código de Python directamente en un archivo y luego ejecutarlo cada vez que hiciéramos alguna modificación, por comodidad vamos a utilizar Jupyter Notebook, al final del capítulo, veremos como hacerlo directamente en un archivo de Python.

Jupyter Notebook es un entorno de trabajo interactivo q permite desarrollar código en Python de manera dinámica, a la vez que integrar en un mismo documento tanto bloques de texto como gráficos e imágenes. Lo vas a ver más claro en cuanto lo instalemos y nos pongamos a funcionar con él.

Siempre dentro de nuestro entorno virtual, lo instalamos con:

(miEntorno) pi@rapsberry:~/scr$ pip install jupyter

y lo ejecutamos con la instrucción:

(miEntorno) pi@rapsberry:~/scr$ jupyter notebook

Si has realizado los pasos correctamente verás como se inicia el navegador web y te aparecerá una pantalla parecida a esta:







A la derecha selecciona New y cuando aparezca el desplegable selecciona Python3.

Comenzaremos creando el gráfico más básico que se puede hacer con Matplotlib, que es dibujar un punto o varios puntos con el comando plot. Verás como la cosa es muy sencilla. La forma general será:

plt.plot(posición x, posición y, marker=' ', color =' ')

Los argumentos marker y color son opcionales. Si no se ponen Matplotlib pone los suyos por defecto. Si quieres tú personalizar los colores, en vez de dejar que los elija el programa, los más frecuentes son los siguientes:

Colores comunes en Matplolib

‘c’ Cián

‘b’ Azul

‘g’ Verde

‘y’ Amarillo

‘k’ Negro

‘w’ Blanco

‘r’ Rojo

‘m’ Magenta

Después de dicho el matiz anterior, seguimos construyendo el gráfico. Para ello usaremos el siguiente código:


















En la primera línea importamos la librería matplolib.pyplot con el nombre de plt.

A continuación usamos lo que en Jupyter Notebook se conoce como función mágica (la distinguiremos porque usa el signo % delante de la función) %matplotlib notebook. Esto es sumamente útil ya que nos permitirá dibujar nuevos gráficos o añadir cosas sobre un gráfico que ya este creado. Es decir, nos permite añadir cosas una vez que se haya renderizado el código que hayamos puesto. Si no pusiéramos esta opción no se podría modificar la figura una vez renderizada, habría que crear otra nueva.

Para finalizar usamos el código que realmente dibuja el punto en el lugar(x=5, y=5) que es:

plt.plot(5,5,'o')

Ya ves que con poco código tenemos un bonito gráfico dibujado.

La secuencia es bien simple. En primer lugar ponemos la cordenada del eje de las x, luego la del eje de las y. La tercera posición hace referencia a la figura que se utilizará para dibujar el punto, en el ejemplo un circulo pequeño señalizado con el simbolo 'o'. Puedes utilizar un montón de símbolos para dibujar los puntos:

'.'point marker
','pixel marker
'o'circle marker
'v'triangle_down marker
'^'triangle_up marker
'<'triangle_left marker
'>'triangle_right marker
'1'tri_down marker
'2'tri_up marker
'3'tri_left marker
'4'tri_right marker
's'square marker
'p'pentagon marker
'*'star marker
'h'hexagon1 marker
'H'hexagon2 marker
'+'plus marker
'x'x marker
'D'diamond marker
'd'thin_diamond marker
'|'vline marker
'_'hline marker

Para ejecutar el código y que te salga el gráfico puedes usar la función "Run" en el menú de la parte superior que ejecuta la celda sobre la que estés o bien pulsar la combinación de teclas Ctrl+Enter. 

Y más sencillo aun es añadir una etiqueta para el eje de las x, para el eje de las y o también una descripción del gráfico. Pulsa en la celda donde tenemos el código, pulsa un intro y añade el siguiente código:

# Etiqueta del eje x
plt.xlabel("Eje de las X")
# Etiqueta del eje y
plt.ylabel("Eje de las Y")
# Título del Gráfico
plt.title("Gráfico de ejemplo de la instrucción Plot")

Luego ejecuta la celda con Ctrl+Enter

Verás de nuevo como se vuelve a generar el gráfico con las leyendas añadidas. 


Podríamos añadir tantos puntos como quisiéramos agregando al código un nuevo:

plt.plot(dato_en_el_eje_x, dato_en_el_eje_y, "figura")

Si te fijas, cada vez que se dibuja un punto (salvo que lo especificáramos nosotros) el programa dibuja el punto de un color diferente.

Como curiosidad si quisieras hacer un donuts con puntos usando Python este sería el código a utilizar:

import matplotlib.pyplot as plt
# https://matplotlib.org/3.1.1/
from random import random #genera numeros aleatorios entre (0,1)

n=5000 # número de puntos a dibujar
p=q=0

plt.figure(figsize=(6,6)) #tamaño del grafico en pulgadas 1 pulgada = 2,54 cm

for i in range(n):
# Esta es la parte que crea el Donuts.
    p=random()*8-4 #Limitamos x para que se este entre -4,4
    q=random()*8-4 #Limitamos y para que se este entre -4,4
    r=(p**2+q**2)**(1/2) #por el teorema de Pitágoras nos da la distancia al centro
    if 2<r<4: #Solo dejamos imprimir los puntos que tengan una distancia entre 2 y 4
        x,y=p,q
        plt.plot(x,y,'o',markersize=1) #markersize es el tamaño de los puntos.

plt.show()



Gráficos Lineales

Y al igual que hemos dibujado un punto, también podemos dibujar una línea o líneas formada por varios puntos usando las listas de Python. Vamos a usar aquí también la instrucción plt.show() para forzar que el resultado se muestre como una imagen y evitar la salida de texto que aparecía en la parte inferior de los ejemplos anteriores.

Si ejecutamos dos o más veces la función plot antes de ejecutar la función show(), todas las gráficas se mostraran en el mismo conjunto de ejes:



















Como ya dijimos, sino especificamos los colores de cada gráfica, estos saldrán de forma predefinida.

Además matplotlib se pude integrar también para usar conjunto de datos de las librerías numpy o panda.

Vamos a utilizar por ejemplo numpy para crear datos con los que poder realizar otro ejemplo de gráfica. Suponemos que tenemos instalado Numpy en nuestro entorno virtual. 

[1] Importamos las librerias necesarias y la función mágica que ya vimos antes.

[2] Utilizamos la librería numpy para crear un array que contenga 100 números decimales del 0 al 2.

[3] Por último trazamos los puntos del eje x e y. Aquí la única novedad es que asignamos una leyenda a cada uno de los gráficos con la etiqueta label. Al final renderizamos todas con la instrucción plt.legend()




Poner varios gráficos juntos en cuadriculas


Puede que en alguna ocasión nos interese poner dos gráficos juntos para poder comparar sus datos. Imaginemos una tabla compuesta por filas y columnas y en la que en cada celda podríamos poner un gráfico. Por ejemplo una tabla compuesta de una fila y dos columnas en la que en cada celda colocaremos un gráfico. Pues esto se puede hacer de forma sencilla con la instrucción plt.subplot(número) o plt.subplot(nº de filas, nº de columnas, posición en la tabla). Ambas son equivalentes. 

El primer número indica el número de filas que tendrá la tabla. El segundo el número de columnas que tendrá la tabla y finalmente el tercero indica la posición del gráfico dentro de la misma.

Por ejemplo, el siguiente cuaderno de jupyter dibujará un único grafico global que contendrá dos sub_gráficos dentro de una tabla de 2 filas y 1 columna, en la que cada gráfico estará en una de las celdas.



Gráficos Circulares.


Los gráficos circulares nos sirven para representar porcentajes o porciones. Podemos realizar este tipo de gráficos usando la función pie, en lugar de plot que habíamos visto hasta ahora.

Para poner un ejemplo del código en Jupyter para este tipo de gráficos vamos a imaginar una casa de 25 viviendas en la que cada hogar tiene una mascota. Se distribuyen de la siguiente forma:

                                                Mascota    |    Frecuencia
                                                Perros                    12
                                                Gatos                      9
                                                Peces                      3
                                                Tortugas                 1

Para representar el porcentaje de mascotas en el edificio podemos dibujar un gráfico circular. Para ello el código sería el siguiente:



Observa que lo primero que hemos hecho es importar la librería marplotlib. Luego utilizando listas de Python definimos los nombres y los números de las mascotas. Posteriormente utilizamos la función pie. Esta acepta un primer argumento que contiene los valores absolutos de cada item, además, de utilizar el argumento labels que contiene las etiquetas correspondientes.

Si quisiéramos indicar automáticamente los porcentajes de cada mascota lo podemos hacer con el argumento autopct. Todo el código sería el mismo, solamente le introduciríamos este nuevo argumento:

plt.pie(mascotas, labels=nombres, autopct="%0.1f%%")
# "%0.1f%%" indica que el % se representará con un decimal, si lo quisieramos
# con dos decimales utilizaríamos "%0.2f%%"




En matplotlib existen una multitud de opciones que se pueden especificar, como por ejemplo cambiar el color de cada quesito, pero son tantas que es mejor consultar el manual.

Una opción que puede resultar útil en el caso de los gráficos circulares es la posibilidad de separar del bloque uno o más de los quesitos de la gráfica. Para ello se debe pasar una lista o una tupla con valores entre cero y n al argumento explode, que indican el desfase respecto al centro del gráfico. El cero indica que la porción se quede como está, es decir que no haya ningún desplazamiento y si pones un número distinto n, este indica un desplazamiento equivalente a n*r, donde r es el radio del gráfico circular.

En nuestro ejemplo vamos a separa la porción que corresponde a los perros para que destaque frente a las demás.




Gráficos de Barras


Los gráficos de barras siguen la misma secuencia que el resto de gráficos, solo que la función que utilizamos es la denominada bar, no tiene más misterio.


Si quieres el gráfico con las barras en horizontal utiliza el mismo código exactamente que el ejemplo anterior pero usando la función barh.



Ejecutando Matplotlib directamente en un archivo de python.


Para finalizar este capítulo, si quisiéramos hacer lo mismo, pero no a través de Jupyter, sino ejecutando directamente un archivo de python, lo primero que tendríamos que hacer sería instalar en el entorno virtual la librería tkinter que nos permitirá generar y ver el gráfico en nuestra pantalla. Tecleamos:


(miEntorno) pi@rapsberry:~/scr$ sudo apt-get install python3-tk


Luego creamos el archivo ejemplo.py y creamos un grafico sencillo de los que ya hemos visto:


import matplotlib.pyplot as plt
plt.plot([1,3,6,8])
plt.plot([1,6,7,5])
plt.ylabel('Eje Y')
plt.xlabel('Eje x')
plt.title('Ejemplo del comando Plot')
plt.show()

Lo guardamos y ejecutamos ($ python3 ejemplo.py)



Si no queremos ver el gráfico por pantalla, no necesitamos instalar la libreria tkinter, ni usar la instrucción final plt.show() para renderizar el gráfico. Por ejemplo, podemos guardar en un archivo el gráfico generado para tratarlo posteriormente, usando la instrucción:

plt.savefig('nombre_del_grafico.extensión', bbox_inches='tight', dpi=)

Puedes guardar el gráfico con varias extensiones como png, jpg, svg

Los argumentos opcionales son:

bbox_inches='tight', se extiende o reduce el área de la figura guardada para incluir a todos los componentes de ella, eliminado también los espacios blancos sobrantes en los bordes.

dpi= resolución -> Indica la resolución con la que queremos guardar el gráfico. Ej dpi=300

Ejemplo:

import matplotlib.pyplot as plt
plt.plot([1,3,6,8])
plt.plot([1,6,7,5])
plt.ylabel('Eje Y')
plt.xlabel('Eje x')
plt.title('Ejemplo del comando Plot')
plt.savefig('miGrafico.png')

Si ahora comprobamos nuestro directorio de trabajo veremos como se ha creado un archivo llamado miGrafico.png que contiene el gráfico que hemos creado.


Puedes encontrar más información sobre gráficos y también el funcionamiento de la librería plotly en este repositorio de GITHUB.

No hay comentarios:

Publicar un comentario