Gráficas con Python =================== En este cuaderno veremos un conjunto de ejemplos para generar gráficas empleando `Matplotlib `__. *Matplotlib* es una biblioteca para generar gráficos matemáticos avanzados con Python. Dentro de esta biblioteca se proporciona un módulo llamado *pyplot* que proporciona unas funciones muy similares a las capacidades gráficas de MATLAB. Éste es el módulo que mostraremos aquí. Para mostrar gráficas en un cuaderno lo más práctico es insertarlas en el texto. Para eso tenemos que utilizar una directiva que modifica el comportamiento por defecto del cuaderno. Si no lo hiciéramos las figuras se verían en ventanas independientes, que es muy difícil de seguir. Si no utilizas `IPython Notebook `__ esta directiva no es necesaria. .. code:: python %matplotlib inline Para ilustrar el uso de ``pyplot`` vamos a usar unos datos de temperaturas generados aleatoriamente. Los detalles no son relevantes para lo que se pretende mostrar en este cuaderno. .. code:: python import random def leer_temperaturas(): # 12 temperaturas ordenadas mx = sorted([ round(random.uniform(0.0, 40.0), 2) for x in range(12) ]) # las reordenamos para que se parezca más a un año normal mx = mx[::2] + mx[::-2] # mínimos restando algo a los máximos mn = [ m - random.uniform(5.0, .3*m) for m in mx ] return mn, mx Una gráfica básica de estas temperaturas puede realizarse con la función ``plot`` y la función ``show``. .. code:: python import matplotlib.pyplot as plt tmin, tmax = leer_temperaturas() plt.plot(tmax) plt.plot(tmin) plt.show() .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_5_0.png Pero evidentemente lo podemos hacer mejor y eso cuenta en tu calificación del trabajo en grupo. En primer lugar una gráfica debe indicar qué es lo que representa. Para eso tenemos que poner las unidades, título y una leyenda con lo que representa cada línea. .. code:: python plt.title(u'Temperatura en Madrid (año 2015)', fontsize='x-large') plt.xlabel('mes') plt.ylabel(u'temperatura (ºC)') plt.plot(tmax, label=u'T máxima') plt.plot(tmin, label=u'T mínima') leyenda = plt.legend(loc='upper right', shadow=True, fontsize='large') plt.show() .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_7_0.png Convendría que los colores de las líneas sirvieran para identificar lo que representan. Por ejemplo, la temperatura máxima podría ser roja, mientras que la mínima podría ser azul. También es útil identificar los puntos de los que tenemos valores en lugar de pintar las líneas como si fuera un continuo. .. code:: python plt.title(u'Temperatura en Madrid (año 2015)', fontsize='x-large') plt.xlabel('mes') plt.ylabel(u'temperatura (ºC)') plt.plot(tmax, 'ro--', label=u'máxima') plt.plot(tmin, 'bo--', label=u'mínima') leyenda = plt.legend(loc='upper right', shadow=True, fontsize='large') plt.show() .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_9_0.png El mes convendría representarlo con el texto correspondiente, no con un número. .. code:: python plt.title(u'Temperatura en Madrid (año 2015)', fontsize='x-large') plt.xlabel('mes') plt.ylabel(u'temperatura (ºC)') plt.xticks(range(12),['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']) plt.plot(tmax, 'ro--', label=u'máxima') plt.plot(tmin, 'bo--', label=u'mínima') leyenda = plt.legend(loc='upper right', shadow=True, fontsize='large') plt.show() .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_11_0.png O bien con las etiquetas de los meses rotadas. .. code:: python plt.title(u'Temperatura en Madrid (año 2015)', fontsize='x-large') plt.xlabel('mes') plt.ylabel(u'temperatura (ºC)') plt.xticks(range(12), ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'], rotation=45) plt.plot(tmax, 'ro--', label=u'máxima') plt.plot(tmin, 'bo--', label=u'mínima') leyenda = plt.legend(loc='upper right', shadow=True, fontsize='large') plt.show() .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_13_0.png Para grabarlo como un archivo PNG o PDF basta llamar a ``savefig`` en lugar de ``show``. .. code:: python plt.title(u'Temperatura en Madrid (año 2015)', fontsize='x-large') plt.ylabel(u'temperatura (ºC)') plt.xticks(range(12), ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'], rotation=45) plt.plot(tmax, 'ro--', label=u'máxima') plt.plot(tmin, 'bo--', label=u'mínima') leyenda = plt.legend(loc='upper right', shadow=True, fontsize='large') plt.savefig('plot.pdf') .. image:: Gr%C3%A1ficas_files/Gr%C3%A1ficas_15_0.png Esto es lo mínimo necesario para el trabajo en grupo, pero leyendo la documentación seguro que podrás mejorar el resultado. Ten en cuenta que lo que se busca en una gráfica no es que sea vistosa, sino que se vea con facilidad lo que se pretende mostrar en ella.