Parte 3 - Visualización con matplotlib

¿Qué es matplotlib?

  • Estándar de facto para visualización en Python
  • Pretende ser similar a las funciones de visualización de MATLAB
  • Diferentes formas de usarla: interfaz pyplot y orientada a objetos

Lo primero que vamos a hacer es activar el modo inline - de esta manera las figuras aparecerán automáticamente incrustadas en el notebook.

In [1]:
%matplotlib inline

Importamos los paquetes necesarios:

In [2]:
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:

In [12]:
from IPython.display import HTML
HTML('<iframe src="http://matplotlib.org/gallery.html#pylab_examples" width="800" height="600"></iframe>')
Out[12]:

Si hacemos clic en cualquiera de las imágenes, accedemos al código fuente que la ha generado:

In [13]:
HTML('<iframe src="http://matplotlib.org/examples/pylab_examples/annotation_demo.html" width="800" height="600"></iframe>')
Out[13]:

Interfaz pyplot

Función 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:

In [3]:
plt.plot([0, 0.1, 0.2, 0.5,0.6], [1, -1, 0, 3, -1])
Out[3]:
[<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:

$$f(x) = e^{-x^2}$$
In [4]:
def f(x):
    return np.exp(-x ** 2)

Definimos el dominio con la función np.linspace, que crea un vector de puntos equiespaciados:

In [5]:
x = np.linspace(-1, 5, num=30)

Y representamos la función:

In [9]:
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)$")
Out[9]:
<matplotlib.text.Text at 0x7f779236b210>

Notamos varias cosas:

  • Con diversas llamadas a funciones dentro de plt. se actualiza el gráfico actual. Esa es la forma de trabajar con la interfaz pyplot.
  • Podemos añadir etiquetas, y escribir $\LaTeX$ en ellas. Tan solo hay que encerrarlo entre signos de dólar $$.

Personalización

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.

In [19]:
plt.plot(x, f(x), 'ro')
plt.plot(x, 1 - f(x), 'g--')
Out[19]:
[<matplotlib.lines.Line2D at 0x7f7792343290>]

Esto en realidad son códigos abreviados, que se corresponden con argumentos de la función plot:

In [34]:
plt.plot(x, f(x), color='red', linestyle='', marker='o')
plt.plot(x, 1 - f(x), c='g', ls='--')
Out[34]:
[<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.

Otro tipo de gráficas

La función scatter muestra una nube de puntos, con posibilidad de variar también el tamaño y el color.

In [37]:
N = 100
x = np.random.randn(N)
y = np.random.randn(N)

plt.scatter(x, y)
Out[37]:
<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.

In [48]:
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()
Out[48]:
<matplotlib.colorbar.Colorbar at 0x7f77911ab590>
In [49]:
plt.scatter(x, y, s=s, c=c, cmap=plt.cm.Oranges)
plt.colorbar()
Out[49]:
<matplotlib.colorbar.Colorbar at 0x7f7791107d90>

matplotlib trae por defecto muchos mapas de colores. En las SciPy Lecture Notes dan una lista de todos ellos:

matplotlib colormaps

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:

$$f(x) = \cos{x} + \sin^2{y}$$
In [50]:
def f(x, y):
    return np.cos(x) + np.sin(y) ** 2
In [52]:
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()
Out[52]:
<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:

In [60]:
zz = f(xx, yy)
plt.contourf(xx, yy, zz, np.linspace(-0.5, 2.0))
plt.colorbar()
Out[60]:
<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.

Interfaz orientada a objetos

In [24]:
x
Out[24]:
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.        ])
In [25]:
f(x)
Out[25]:
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])
In [28]:
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")
In [35]:
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")
Out[35]:
<matplotlib.text.Text at 0x7f70c765f750>
In [40]:
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)
Out[40]:
<matplotlib.collections.PathCollection at 0x7f70c7338b50>
$$g(x, y) = \cos(x) + \sin(y)^2$$
In [45]:
x = np.linspace(-2, 2)
y = np.linspace(-2, 2)

xx, yy = np.meshgrid(x, y)
In [47]:
def g(x, y):
    return np.cos(x) + np.sin(y) ** 2
In [48]:
zz = g(xx, yy)
In [55]:
fig, axes = plt.subplots()

axes.contourf(xx, yy, zz, np.linspace(-1, 1), cmap=plt.cm.autumn)
Out[55]:
<matplotlib.contour.QuadContourSet at 0x7f70c6dc52d0>
  • fig, axes = plt.subplots
  • Diferencias de conceptos

Ejemplo con datos reales

In [57]:
!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
In [61]:
datos = np.loadtxt("temperaturas.csv", usecols=(1, 2, 3), skiprows=1, delimiter=',')
In [65]:
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')
Out[65]:
[<matplotlib.lines.Line2D at 0x7f70c6b449d0>]

Referencias