pyplot
y orientada a objetosLo primero que vamos a hacer es activar el modo inline - de esta manera las figuras aparecerán automáticamente incrustadas en el notebook.
%matplotlib inline
Importamos los paquetes necesarios:
import numpy as np
import matplotlib.pyplot as plt
La biblioteca matplotlib es gigantesca y es difícil hacerse una idea global de todas sus posibilidades en una primera toma de contacto. Es recomendable tener a mano la documentación y la galería:
from IPython.display import HTML
HTML('<iframe src="http://matplotlib.org/gallery.html#pylab_examples" width="800" height="600"></iframe>')
Si hacemos clic en cualquiera de las imágenes, accedemos al código fuente que la ha generado:
HTML('<iframe src="http://matplotlib.org/examples/pylab_examples/annotation_demo.html" width="800" height="600"></iframe>')
plot
¶La interfaz pyplot
proporciona una serie de funciones que operan sobre un estado global - es decir, nosotros no especificamos sobre qué gráfica o ejes estamos actuando. Es una forma rápida y cómoda de crear gráficas pero perdemos parte del control.
El paquete pyplot
se suele importar bajo el alias plt
, de modo que todas las funciones se acceden a través de plt.<funcion>
. La función más básica es la función plot
:
plt.plot([0, 0.1, 0.2, 0.5,0.6], [1, -1, 0, 3, -1])
[<matplotlib.lines.Line2D at 0x7f77925ac450>]
La función plot
recibe una sola lista (si queremos especificar los valores y) o dos listas (si especificamos x e y). Naturalmente si especificamos dos listas ambas tienen que tener la misma longitud.
La tarea más habitual a la hora de trabajar con matplotlib es representar una función. Lo que tendremos que hacer es definir un dominio y evaluarla en dicho dominio. Por ejemplo:
def f(x):
return np.exp(-x ** 2)
Definimos el dominio con la función np.linspace
, que crea un vector de puntos equiespaciados:
x = np.linspace(-1, 5, num=30)
Y representamos la función:
plt.plot(x, f(x), label="Función f(x)")
plt.xlabel("Eje $x$")
plt.ylabel("$f(x)$")
plt.legend()
plt.title("Función $f(x)$")
<matplotlib.text.Text at 0x7f779236b210>
Notamos varias cosas:
plt.
se actualiza el gráfico actual. Esa es la forma de trabajar con la interfaz pyplot.La función plot
acepta una serie de argumentos para personalizar el aspecto de la función. Con una letra podemos especificar el color, y con un símbolo el tipo de línea.
plt.plot(x, f(x), 'ro')
plt.plot(x, 1 - f(x), 'g--')
[<matplotlib.lines.Line2D at 0x7f7792343290>]
Esto en realidad son códigos abreviados, que se corresponden con argumentos de la función plot
:
plt.plot(x, f(x), color='red', linestyle='', marker='o')
plt.plot(x, 1 - f(x), c='g', ls='--')
[<matplotlib.lines.Line2D at 0x7f77919f3890>]
La lista de posibles argumentos y abreviaturas está disponible en la documentación de la función plot
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot.
La función scatter
muestra una nube de puntos, con posibilidad de variar también el tamaño y el color.
N = 100
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y)
<matplotlib.collections.PathCollection at 0x7f7791f05750>
Con s
y c
podemos modificar el tamaño y el color respectivamente. Para el color, a cada valor numérico se le asigna un color a través de un mapa de colores; ese mapa se puede cambiar con el argumento cmap
. Esa correspondencia se puede visualizar llamando a la función colorbar
.
s = 50 + 50 * np.random.randn(N)
c = np.random.randn(N)
plt.scatter(x, y, s=s, c=c, cmap=plt.cm.Blues)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f77911ab590>
plt.scatter(x, y, s=s, c=c, cmap=plt.cm.Oranges)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f7791107d90>
matplotlib trae por defecto muchos mapas de colores. En las SciPy Lecture Notes dan una lista de todos ellos:
La función contour
se utiliza para visualizar las curvas de nivel de funciones de dos variables y está muy ligada a la función np.meshgrid
. Veamos un ejemplo:
def f(x, y):
return np.cos(x) + np.sin(y) ** 2
x = np.linspace(-2, 2)
y = np.linspace(-2, 2)
xx, yy = np.meshgrid(x, y)
plt.contour(xx, yy, f(xx, yy))
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f7790f79410>
La función contourf
es casi idéntica pero rellena el espacio entre niveles. Podemos especificar manualmente estos niveles usando el cuarto argumento:
zz = f(xx, yy)
plt.contourf(xx, yy, zz, np.linspace(-0.5, 2.0))
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f77906da910>
Para guardar las gráficas en archivos aparte podemos usar la función plt.savefig
. matplotlib usará el tipo de archivo adecuado según la extensión que especifiquemos. Veremos esto con más detalle cuando hablemos de la interfaz orientada a objetos.
x
array([-1. , -0.79310345, -0.5862069 , -0.37931034, -0.17241379, 0.03448276, 0.24137931, 0.44827586, 0.65517241, 0.86206897, 1.06896552, 1.27586207, 1.48275862, 1.68965517, 1.89655172, 2.10344828, 2.31034483, 2.51724138, 2.72413793, 2.93103448, 3.13793103, 3.34482759, 3.55172414, 3.75862069, 3.96551724, 4.17241379, 4.37931034, 4.5862069 , 4.79310345, 5. ])
f(x)
array([ 3.67879441e-01, 5.33117686e-01, 7.09185234e-01, 8.65994832e-01, 9.70710971e-01, 9.98811646e-01, 9.43400884e-01, 8.17952307e-01, 6.50996579e-01, 4.75607235e-01, 3.18960733e-01, 1.96356377e-01, 1.10961373e-01, 5.75595853e-02, 2.74083260e-02, 1.19802640e-02, 4.80694649e-03, 1.77048075e-03, 5.98593712e-04, 1.85777072e-04, 5.29262471e-05, 1.38410522e-05, 3.32266179e-06, 7.32187295e-07, 1.48107572e-07, 2.75011817e-08, 4.68753445e-09, 7.33426522e-10, 1.05338655e-10, 1.38879439e-11])
fig, axes = plt.subplots()
axes.plot(x, f(x), 'ro', label="Función F(x)")
axes.set_xlim(-2, 4)
axes.set_ylim(-1, 2)
fig.savefig("grafica1.png")
fig, axes = plt.subplots(1, 2, sharey=True)
axes[0].plot(x, f(x), color="blue")
axes[0].set_xlabel("Eje x")
axes[1].plot(x, -f(x), 'r')
axes[1].set_xlabel("Eje x de la gráfica derecha")
<matplotlib.text.Text at 0x7f70c765f750>
x = np.random.randn(100)
y = np.random.randn(100)
s = 200 * np.random.randn(100)
c = np.random.randn(100)
plt.scatter(x, y, s, c, cmap=plt.cm.BrBG_r)
<matplotlib.collections.PathCollection at 0x7f70c7338b50>
x = np.linspace(-2, 2)
y = np.linspace(-2, 2)
xx, yy = np.meshgrid(x, y)
def g(x, y):
return np.cos(x) + np.sin(y) ** 2
zz = g(xx, yy)
fig, axes = plt.subplots()
axes.contourf(xx, yy, zz, np.linspace(-1, 1), cmap=plt.cm.autumn)
<matplotlib.contour.QuadContourSet at 0x7f70c6dc52d0>
fig, axes = plt.subplots
!cat temperaturas.csv
STATION,DATE,TMAX,TMIN GHCND:USW00094728,20130101,44,-33 GHCND:USW00094728,20130102,6,-56 GHCND:USW00094728,20130103,0,-44 GHCND:USW00094728,20130104,28,-11 GHCND:USW00094728,20130105,56,0 GHCND:USW00094728,20130106,78,11 GHCND:USW00094728,20130107,72,28 GHCND:USW00094728,20130108,89,17 GHCND:USW00094728,20130109,94,39 GHCND:USW00094728,20130110,83,44 GHCND:USW00094728,20130111,78,28 GHCND:USW00094728,20130112,83,56 GHCND:USW00094728,20130113,100,61 GHCND:USW00094728,20130114,133,33 GHCND:USW00094728,20130115,33,17 GHCND:USW00094728,20130116,28,0 GHCND:USW00094728,20130117,61,17 GHCND:USW00094728,20130118,17,-39 GHCND:USW00094728,20130119,106,-11 GHCND:USW00094728,20130120,117,-11 GHCND:USW00094728,20130121,0,-33 GHCND:USW00094728,20130122,-28,-106 GHCND:USW00094728,20130123,-67,-117 GHCND:USW00094728,20130124,-56,-111 GHCND:USW00094728,20130125,-44,-106 GHCND:USW00094728,20130126,-28,-94 GHCND:USW00094728,20130127,11,-72 GHCND:USW00094728,20130128,22,-17 GHCND:USW00094728,20130129,94,22 GHCND:USW00094728,20130130,150,39 GHCND:USW00094728,20130131,161,-11 GHCND:USW00094728,20130201,-6,-44 GHCND:USW00094728,20130202,-17,-72 GHCND:USW00094728,20130203,-11,-44 GHCND:USW00094728,20130204,-11,-50 GHCND:USW00094728,20130205,0,-22 GHCND:USW00094728,20130206,39,-17 GHCND:USW00094728,20130207,0,-33 GHCND:USW00094728,20130208,11,-28 GHCND:USW00094728,20130209,0,-61 GHCND:USW00094728,20130210,22,-78 GHCND:USW00094728,20130211,72,11 GHCND:USW00094728,20130212,67,22 GHCND:USW00094728,20130213,67,6 GHCND:USW00094728,20130214,78,6 GHCND:USW00094728,20130215,128,28 GHCND:USW00094728,20130216,50,-6 GHCND:USW00094728,20130217,0,-78 GHCND:USW00094728,20130218,17,-83 GHCND:USW00094728,20130219,94,6 GHCND:USW00094728,20130220,33,-39 GHCND:USW00094728,20130221,11,-44 GHCND:USW00094728,20130222,33,-39 GHCND:USW00094728,20130223,56,22 GHCND:USW00094728,20130224,83,11 GHCND:USW00094728,20130225,72,0 GHCND:USW00094728,20130226,67,17 GHCND:USW00094728,20130227,83,22 GHCND:USW00094728,20130228,106,39 GHCND:USW00094728,20130301,72,22 GHCND:USW00094728,20130302,44,-6 GHCND:USW00094728,20130303,44,-17 GHCND:USW00094728,20130304,56,-28 GHCND:USW00094728,20130305,94,-6 GHCND:USW00094728,20130306,56,33 GHCND:USW00094728,20130307,33,6 GHCND:USW00094728,20130308,56,-6 GHCND:USW00094728,20130309,128,17 GHCND:USW00094728,20130310,100,22 GHCND:USW00094728,20130311,122,44 GHCND:USW00094728,20130312,139,61 GHCND:USW00094728,20130313,111,33 GHCND:USW00094728,20130314,50,-17 GHCND:USW00094728,20130315,83,-11 GHCND:USW00094728,20130316,50,0 GHCND:USW00094728,20130317,33,-17 GHCND:USW00094728,20130318,17,-22 GHCND:USW00094728,20130319,61,6 GHCND:USW00094728,20130320,72,0 GHCND:USW00094728,20130321,44,-11 GHCND:USW00094728,20130322,50,-22 GHCND:USW00094728,20130323,78,0 GHCND:USW00094728,20130324,83,6 GHCND:USW00094728,20130325,44,22 GHCND:USW00094728,20130326,117,28 GHCND:USW00094728,20130327,117,22 GHCND:USW00094728,20130328,106,28 GHCND:USW00094728,20130329,128,44 GHCND:USW00094728,20130330,150,44 GHCND:USW00094728,20130331,122,67 GHCND:USW00094728,20130401,167,28 GHCND:USW00094728,20130402,61,6 GHCND:USW00094728,20130403,78,6 GHCND:USW00094728,20130404,117,6 GHCND:USW00094728,20130405,178,50 GHCND:USW00094728,20130406,111,17 GHCND:USW00094728,20130407,128,44 GHCND:USW00094728,20130408,228,106 GHCND:USW00094728,20130409,278,106 GHCND:USW00094728,20130410,233,128 GHCND:USW00094728,20130411,156,83 GHCND:USW00094728,20130412,83,50 GHCND:USW00094728,20130413,144,50 GHCND:USW00094728,20130414,139,78 GHCND:USW00094728,20130415,150,67 GHCND:USW00094728,20130416,172,83 GHCND:USW00094728,20130417,217,128 GHCND:USW00094728,20130418,150,106 GHCND:USW00094728,20130419,217,128 GHCND:USW00094728,20130420,156,61 GHCND:USW00094728,20130421,128,28 GHCND:USW00094728,20130422,128,50 GHCND:USW00094728,20130423,117,50 GHCND:USW00094728,20130424,206,67 GHCND:USW00094728,20130425,189,78 GHCND:USW00094728,20130426,194,100 GHCND:USW00094728,20130427,217,89 GHCND:USW00094728,20130428,206,106 GHCND:USW00094728,20130429,139,111 GHCND:USW00094728,20130430,200,106 GHCND:USW00094728,20130501,206,83 GHCND:USW00094728,20130502,222,94 GHCND:USW00094728,20130503,189,94 GHCND:USW00094728,20130504,206,89 GHCND:USW00094728,20130505,178,78 GHCND:USW00094728,20130506,206,78 GHCND:USW00094728,20130507,233,111 GHCND:USW00094728,20130508,172,128 GHCND:USW00094728,20130509,200,122 GHCND:USW00094728,20130510,261,150 GHCND:USW00094728,20130511,211,161 GHCND:USW00094728,20130512,211,106 GHCND:USW00094728,20130513,144,72 GHCND:USW00094728,20130514,161,56 GHCND:USW00094728,20130515,206,111 GHCND:USW00094728,20130516,261,167 GHCND:USW00094728,20130517,222,144 GHCND:USW00094728,20130518,183,133 GHCND:USW00094728,20130519,150,128 GHCND:USW00094728,20130520,261,144 GHCND:USW00094728,20130521,300,200 GHCND:USW00094728,20130522,256,150 GHCND:USW00094728,20130523,267,178 GHCND:USW00094728,20130524,183,72 GHCND:USW00094728,20130525,122,72 GHCND:USW00094728,20130526,189,89 GHCND:USW00094728,20130527,228,106 GHCND:USW00094728,20130528,200,133 GHCND:USW00094728,20130529,278,144 GHCND:USW00094728,20130530,322,222 GHCND:USW00094728,20130531,322,239 GHCND:USW00094728,20130601,322,228 GHCND:USW00094728,20130602,311,206 GHCND:USW00094728,20130603,256,189 GHCND:USW00094728,20130604,239,139 GHCND:USW00094728,20130605,233,144 GHCND:USW00094728,20130606,211,150 GHCND:USW00094728,20130607,172,150 GHCND:USW00094728,20130608,250,139 GHCND:USW00094728,20130609,267,172 GHCND:USW00094728,20130610,211,167 GHCND:USW00094728,20130611,267,178 GHCND:USW00094728,20130612,244,183 GHCND:USW00094728,20130613,206,128 GHCND:USW00094728,20130614,222,117 GHCND:USW00094728,20130615,267,161 GHCND:USW00094728,20130616,267,183 GHCND:USW00094728,20130617,289,206 GHCND:USW00094728,20130618,289,178 GHCND:USW00094728,20130619,250,150 GHCND:USW00094728,20130620,267,167 GHCND:USW00094728,20130621,278,178 GHCND:USW00094728,20130622,289,183 GHCND:USW00094728,20130623,311,211 GHCND:USW00094728,20130624,333,233 GHCND:USW00094728,20130625,328,228 GHCND:USW00094728,20130626,294,233 GHCND:USW00094728,20130627,300,228 GHCND:USW00094728,20130628,294,228 GHCND:USW00094728,20130629,283,217 GHCND:USW00094728,20130630,300,228 GHCND:USW00094728,20130701,250,222 GHCND:USW00094728,20130702,278,222 GHCND:USW00094728,20130703,283,228 GHCND:USW00094728,20130704,306,239 GHCND:USW00094728,20130705,322,244 GHCND:USW00094728,20130706,333,256 GHCND:USW00094728,20130707,333,256 GHCND:USW00094728,20130708,317,228 GHCND:USW00094728,20130709,311,233 GHCND:USW00094728,20130710,294,239 GHCND:USW00094728,20130711,289,244 GHCND:USW00094728,20130712,250,200 GHCND:USW00094728,20130713,272,194 GHCND:USW00094728,20130714,322,233 GHCND:USW00094728,20130715,344,256 GHCND:USW00094728,20130716,344,250 GHCND:USW00094728,20130717,361,261 GHCND:USW00094728,20130718,367,272 GHCND:USW00094728,20130719,356,283 GHCND:USW00094728,20130720,339,272 GHCND:USW00094728,20130721,317,244 GHCND:USW00094728,20130722,300,239 GHCND:USW00094728,20130723,306,228 GHCND:USW00094728,20130724,283,200 GHCND:USW00094728,20130725,200,178 GHCND:USW00094728,20130726,283,183 GHCND:USW00094728,20130727,278,211 GHCND:USW00094728,20130728,256,211 GHCND:USW00094728,20130729,294,206 GHCND:USW00094728,20130730,283,194 GHCND:USW00094728,20130731,283,194 GHCND:USW00094728,20130801,244,189 GHCND:USW00094728,20130802,283,194 GHCND:USW00094728,20130803,256,200 GHCND:USW00094728,20130804,267,189 GHCND:USW00094728,20130805,256,167 GHCND:USW00094728,20130806,278,178 GHCND:USW00094728,20130807,267,211 GHCND:USW00094728,20130808,272,211 GHCND:USW00094728,20130809,294,233 GHCND:USW00094728,20130810,283,211 GHCND:USW00094728,20130811,272,183 GHCND:USW00094728,20130812,278,211 GHCND:USW00094728,20130813,250,200 GHCND:USW00094728,20130814,233,161 GHCND:USW00094728,20130815,256,150 GHCND:USW00094728,20130816,278,178 GHCND:USW00094728,20130817,289,178 GHCND:USW00094728,20130818,244,200 GHCND:USW00094728,20130819,261,189 GHCND:USW00094728,20130820,311,200 GHCND:USW00094728,20130821,322,222 GHCND:USW00094728,20130822,256,217 GHCND:USW00094728,20130823,278,217 GHCND:USW00094728,20130824,267,183 GHCND:USW00094728,20130825,283,178 GHCND:USW00094728,20130826,289,200 GHCND:USW00094728,20130827,306,217 GHCND:USW00094728,20130828,300,217 GHCND:USW00094728,20130829,267,217 GHCND:USW00094728,20130830,294,211 GHCND:USW00094728,20130831,300,228 GHCND:USW00094728,20130901,289,239 GHCND:USW00094728,20130902,278,233 GHCND:USW00094728,20130903,278,200 GHCND:USW00094728,20130904,278,183 GHCND:USW00094728,20130905,267,178 GHCND:USW00094728,20130906,222,139 GHCND:USW00094728,20130907,267,150 GHCND:USW00094728,20130908,283,178 GHCND:USW00094728,20130909,228,139 GHCND:USW00094728,20130910,306,200 GHCND:USW00094728,20130911,356,250 GHCND:USW00094728,20130912,306,211 GHCND:USW00094728,20130913,250,150 GHCND:USW00094728,20130914,194,122 GHCND:USW00094728,20130915,228,106 GHCND:USW00094728,20130916,228,133 GHCND:USW00094728,20130917,183,100 GHCND:USW00094728,20130918,222,106 GHCND:USW00094728,20130919,256,128 GHCND:USW00094728,20130920,261,156 GHCND:USW00094728,20130921,250,161 GHCND:USW00094728,20130922,206,122 GHCND:USW00094728,20130923,189,100 GHCND:USW00094728,20130924,228,83 GHCND:USW00094728,20130925,228,111 GHCND:USW00094728,20130926,217,144 GHCND:USW00094728,20130927,206,139 GHCND:USW00094728,20130928,228,133 GHCND:USW00094728,20130929,222,139 GHCND:USW00094728,20130930,239,133 GHCND:USW00094728,20131001,278,150 GHCND:USW00094728,20131002,283,178 GHCND:USW00094728,20131003,256,172 GHCND:USW00094728,20131004,300,189 GHCND:USW00094728,20131005,244,178 GHCND:USW00094728,20131006,211,183 GHCND:USW00094728,20131007,244,156 GHCND:USW00094728,20131008,194,122 GHCND:USW00094728,20131009,167,117 GHCND:USW00094728,20131010,183,122 GHCND:USW00094728,20131011,200,156 GHCND:USW00094728,20131012,222,156 GHCND:USW00094728,20131013,183,133 GHCND:USW00094728,20131014,189,111 GHCND:USW00094728,20131015,222,117 GHCND:USW00094728,20131016,194,133 GHCND:USW00094728,20131017,228,161 GHCND:USW00094728,20131018,200,128 GHCND:USW00094728,20131019,178,111 GHCND:USW00094728,20131020,172,100 GHCND:USW00094728,20131021,189,100 GHCND:USW00094728,20131022,194,106 GHCND:USW00094728,20131023,128,72 GHCND:USW00094728,20131024,122,50 GHCND:USW00094728,20131025,117,44 GHCND:USW00094728,20131026,128,50 GHCND:USW00094728,20131027,144,78 GHCND:USW00094728,20131028,161,61 GHCND:USW00094728,20131029,133,67 GHCND:USW00094728,20131030,156,83 GHCND:USW00094728,20131031,189,117 GHCND:USW00094728,20131101,211,150 GHCND:USW00094728,20131102,200,128 GHCND:USW00094728,20131103,128,28 GHCND:USW00094728,20131104,78,17 GHCND:USW00094728,20131105,128,50 GHCND:USW00094728,20131106,161,94 GHCND:USW00094728,20131107,178,67 GHCND:USW00094728,20131108,100,44 GHCND:USW00094728,20131109,100,33 GHCND:USW00094728,20131110,161,67 GHCND:USW00094728,20131111,117,61 GHCND:USW00094728,20131112,111,-5 GHCND:USW00094728,20131113,39,-16 GHCND:USW00094728,20131114,111,6 GHCND:USW00094728,20131115,139,67 GHCND:USW00094728,20131116,156,72 GHCND:USW00094728,20131117,156,106 GHCND:USW00094728,20131118,183,106 GHCND:USW00094728,20131119,106,22 GHCND:USW00094728,20131120,67,0 GHCND:USW00094728,20131121,111,17 GHCND:USW00094728,20131122,139,106 GHCND:USW00094728,20131123,122,-5 GHCND:USW00094728,20131124,-10,-49 GHCND:USW00094728,20131125,17,-49 GHCND:USW00094728,20131126,83,6 GHCND:USW00094728,20131127,167,17 GHCND:USW00094728,20131128,17,-10 GHCND:USW00094728,20131129,39,-16 GHCND:USW00094728,20131130,39,-38 GHCND:USW00094728,20131201,94,22 GHCND:USW00094728,20131202,94,50 GHCND:USW00094728,20131203,117,33 GHCND:USW00094728,20131204,111,50 GHCND:USW00094728,20131205,156,89 GHCND:USW00094728,20131206,167,28 GHCND:USW00094728,20131207,50,0 GHCND:USW00094728,20131208,6,-16 GHCND:USW00094728,20131209,39,-5 GHCND:USW00094728,20131210,28,-10 GHCND:USW00094728,20131211,6,-27 GHCND:USW00094728,20131212,-10,-49 GHCND:USW00094728,20131213,17,-49 GHCND:USW00094728,20131214,11,-55 GHCND:USW00094728,20131215,44,-10 GHCND:USW00094728,20131216,6,-38 GHCND:USW00094728,20131217,0,-43 GHCND:USW00094728,20131218,28,-49 GHCND:USW00094728,20131219,83,-10 GHCND:USW00094728,20131220,117,50 GHCND:USW00094728,20131221,183,106 GHCND:USW00094728,20131222,217,161 GHCND:USW00094728,20131223,178,56 GHCND:USW00094728,20131224,56,-32 GHCND:USW00094728,20131225,-5,-71 GHCND:USW00094728,20131226,22,-10 GHCND:USW00094728,20131227,44,-5 GHCND:USW00094728,20131228,128,22 GHCND:USW00094728,20131229,89,50 GHCND:USW00094728,20131230,72,-49 GHCND:USW00094728,20131231,0,-60 GHCND:USW00094728,20140101,6,-43
datos = np.loadtxt("temperaturas.csv", usecols=(1, 2, 3), skiprows=1, delimiter=',')
fig, axes = plt.subplots()
x = np.arange(len(datos[:, 1]))
temp_media = (datos[:, 1] + datos[:, 2]) / 2
axes.plot(x, datos[:, 1], 'r')
axes.plot(x, datos[:, 2], 'b')
axes.plot(x, temp_media, 'k')
[<matplotlib.lines.Line2D at 0x7f70c6b449d0>]