1. INTRODUCCIÓN

Numpy es una biblioteca de Python para funciones matemáticas de alto nivel especialmente diseñada para trabajar con matrices (arrays) y vectores. Al estar escrita en C aporta una mayor velocidad y flexibilidad para trabajar con datasets (conjuntos de datos del mismo tipo) y son una excelente alternativa a las listas de Python.

Pandas es una extensión de Numpy para manipulación y análisis de datos que trabaja con dataframes (conjuntos de datos que pueden ser o no de distintos tipos).

Tanto los datasets como los dataframes son estructuras rectangulares de datos que se almacenan en filas y columnas, la única diferencia es que mientras las matrices almacenan un unico tipo de datos, los dataframes pueden contener distintos tipos de datos.

Matplotlib es una biblioteca de Python para la generación de gráficos a partir de datos contenidos en listas o arrays, fue diseñada para recordar a Matlab.



Para instalar ejecutar en la consola de comandos:

pip install numpy

pip install pandas

pip install matplotlib

2. NUMPY

2.1 Nociones básicas sobre matrices

La forma convencional de importar Numpy es mediante su alias np. Vamos a crear una lista y su equivalente en matriz:

In [57]:
import numpy as np

lista = [10,20,30]
matriz = np.array([10,20,30])

print(lista)
print(matriz)
[10, 20, 30]
[10 20 30]

Podemos acceder a sus elementos de la misma forma, por ejemplo al segundo elemento, recuerda que en Python se empieza a contar desde 0:

In [24]:
print(lista[1])
print(matriz[1])
20
20

Ahora veremos qué pasa al multiplicar por 2:

In [29]:
a = lista*2
b = matriz*2

print(a)
print(b)
[10, 20, 30, 10, 20, 30]
[20 40 60]

Cronometramos cuánto se tarda en hacer la misma operación con una lista y una matriz:

In [61]:
%%time

a =  [numero for numero in range (0,1000000)]

z= []
for i in range(0,len(a)):
    r = a[i] * 2
    z.append(r)
Wall time: 394 ms
In [62]:
%%time

a =  [numero for numero in range (0,1000000)]

a2= np.array(a)

z2 = a2*2
Wall time: 154 ms

Ahora vemos cuánto ocupan en memoria la lista y la matriz:

In [36]:
import sys

print("la lista ocupa",sys.getsizeof(z),"bytes")
print("la matriz ocupa",sys.getsizeof(z2),"bytes")
la lista ocupa 8697464 bytes
la matriz ocupa 4000096 bytes

2.2 Matriz unidimensional

Pasamos una lista a matriz:

In [4]:
import numpy as np

lista_2 = [2,3,4,5]
matriz_2 = np.array(lista_2)

print(matriz_2)
[2 3 4 5]

Podemos declarar una matriz lineal con:

np.linspace(start = 0, stop = 10, num = 5, dtype = float)

In [91]:
b = np.linspace(1,10,10,dtype=int)
print(b)
[ 1  2  3  4  5  6  7  8  9 10]

2.3 Matriz bidimensional

Podemos tener matrices de múltiples dimensiones:

In [5]:
A = np.array([(1,2,3),(7,8,9),(13,14,15),(19,20,21)])
A
Out[5]:
array([[ 1,  2,  3],
       [ 7,  8,  9],
       [13, 14, 15],
       [19, 20, 21]])
In [89]:
A[2,1]
Out[89]:
14
In [68]:
print("Nº de dimensiones:",A.ndim)
print("Nº de elementos:",A.size)
print("Forma de la matriz (filas, columnas):",A.shape)
Nº de dimensiones: 2
Nº de elementos: 12
Forma de la matriz (filas, columnas): (4, 3)

2.4 Matriz tridimensional

Vamos a generar una matriz tridimensional con numeros enteros aleatorios del 1 al 5:

In [96]:
B = np.random.randint(1,6,size = (3,3,3))
B
Out[96]:
array([[[2, 3, 4],
        [1, 4, 1],
        [1, 5, 1]],

       [[1, 3, 3],
        [4, 3, 2],
        [5, 4, 5]],

       [[1, 3, 4],
        [3, 5, 4],
        [4, 5, 2]]])
In [97]:
print("Nº de dimensiones:",B.ndim)
print("Nº de elementos:",B.size)
print("Forma de la matriz (dimensión, filas, columnas):",B.shape)
Nº de dimensiones: 3
Nº de elementos: 27
Forma de la matriz (dimensión, filas, columnas): (3, 3, 3)

Si quisieramos acceder al elemento situado en la 1ª dimensión, 3ª fila, 2ª columna (recuerda que se empieza a contar desde 0):

In [98]:
B[0,2,1]
Out[98]:
5

2.5 Otras funcionalidades

Lo expuesto hasta ahora solo ha sido una breve introducción a la biblioteca Numpy y a cómo trabajar con matrices pero sería conveniente profundizar más porque es un gran soporte para matemáticas.

In [99]:
pi = np.pi
print(pi)
3.141592653589793

Puedes encontrar más información en este Tutorial de Numpy.

  • Presentación
  • El array multidimensional ndarray
  • Creación de arrays
  • Tipos de datos
  • Indexado y selección
  • Redimensionamiento de arrays
  • Ordenación de arrays
  • Operaciones con arrays
  • Unión de arrays
  • Funciones universales
  • Funciones de conjuntos
  • Funciones matemáticas
  • Funciones para arrays booleanos
  • Funciones de álgebra lineal
  • Funciones polinómicas
  • Otras funciones
  • Lectura y escritura de ficheros
  • Números aleatorios

3. PANDAS

3.1 Dataframes

La forma convencional de importar Pandas es mediante su alias pd pero como una de sus funciones más importantes es la creación de dataframes empezaremos llamando a las dos. Vamos a crear un dataframe simple para ver rápidamente lo que podemos hacer con esta biblioteca.

Creamos un diccionario en el que las claves serán los nombres de las columnas y los valores serán listas con los registros o filas de nuestra tabla. Evidentemente tendremos que asignar el mismo número de registros para cada columna. Asignamos a la variable df la conversión del diccionario a dataframe.

In [2]:
import pandas as pd
from pandas import DataFrame

coches = {'marca': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'precio': [22000,25000,27000,35000]}

df = DataFrame(coches, columns = ['marca', 'precio'])

df
Out[2]:
marca precio
0 Honda Civic 22000
1 Toyota Corolla 25000
2 Ford Focus 27000
3 Audi A4 35000

Vemos el tipo de la variable df, su longitud y su tamaño:

In [132]:
print("tipo:",type(df))
print("longitud:",len(df))
print("tamaño:",df.size)
tipo: <class 'pandas.core.frame.DataFrame'>
longitud: 4
tamaño: 8

Si queremos listar los nombres de las columnas:

In [116]:
list(df)
Out[116]:
['marca', 'precio']

Si queremos listar por columnas:

In [121]:
df.marca
Out[121]:
0       Honda Civic
1    Toyota Corolla
2        Ford Focus
3           Audi A4
Name: marca, dtype: object
In [144]:
columnas = df[['precio','marca']]
print(columnas)
   precio           marca
0   22000     Honda Civic
1   25000  Toyota Corolla
2   27000      Ford Focus
3   35000         Audi A4

Si queremos el primer elemento de una columna:

In [134]:
df.precio[0]
Out[134]:
22000

Si queremos listar la primera fila:

In [135]:
df.loc[0]
Out[135]:
marca     Honda Civic
precio          22000
Name: 0, dtype: object

Ahora veremos cómo realizar cálculos estadísticos para analizar nuestros datos:

In [137]:
df.precio.describe()
Out[137]:
count        4.000000
mean     27250.000000
std       5560.275773
min      22000.000000
25%      24250.000000
50%      26000.000000
75%      29000.000000
max      35000.000000
Name: precio, dtype: float64

Nos dice que tenemos 4 registros en precio, la media aritmética sería 27250, la desviación típica 5560.275773, el valor mínimo 22000, el máximo 35000, el cuartil inferior 24250, la mediana 26000 y el cuartil superior 29000.

Podemos pedir también solo uno de los parámetros si así lo deseamos, por ejemplo la media aritmética:

In [139]:
df.precio.mean()
Out[139]:
27250.0

3.2 Series

Podemos serializar una lista para trabajar con ella:

In [140]:
datos = [2,3,4,5,64,5,7]
serie = pd.Series(datos)
print(serie)
0     2
1     3
2     4
3     5
4    64
5     5
6     7
dtype: int64
In [141]:
serie.describe()
Out[141]:
count     7.000000
mean     12.857143
std      22.608469
min       2.000000
25%       3.500000
50%       5.000000
75%       6.000000
max      64.000000
dtype: float64

Y si quisieramos pasar de pandas a lista:

In [143]:
lista = serie.tolist()
lista
Out[143]:
[2, 3, 4, 5, 64, 5, 7]

Veamos otro ejemplo con listas anidadas:

In [59]:
campos = [['nombre', 'teléfono', 'email'], ['dirección', 'código postal'], ['información']]
agenda = pd.Series(campos)
agenda
Out[59]:
0     [nombre, teléfono, email]
1    [dirección, código postal]
2                 [información]
dtype: object

Ahora compactaremos la serie para eliminar los anidamientos:

In [62]:
agenda2 = agenda.apply(pd.Series).stack().reset_index(drop=True)
agenda2
Out[62]:
0           nombre
1         teléfono
2            email
3        dirección
4    código postal
5      información
dtype: object

Si queremos agregar más elementos:

In [63]:
agenda2 = agenda2.append(pd.Series(['A', 'B']))
agenda2
Out[63]:
0           nombre
1         teléfono
2            email
3        dirección
4    código postal
5      información
0                A
1                B
dtype: object

si queremos listar por orden alfabético:

In [64]:
agenda2 = agenda2.sort_values()
agenda2
Out[64]:
0                A
1                B
4    código postal
3        dirección
2            email
5      información
0           nombre
1         teléfono
dtype: object

3.3 Exportar e importar

In [5]:
df
Out[5]:
marca precio
0 Honda Civic 22000
1 Toyota Corolla 25000
2 Ford Focus 27000
3 Audi A4 35000

Exportamos nuestro dataframe de coches a formato csv o a excel:

In [6]:
exportar_csv = df.to_csv ('coches.csv', index = None, header=True)
In [ ]:
# Para exportar a Excel -> pip install openpyxl
exportar_excel = df.to_excel ('coches.xlsx', index = None, header=True)

Ahora importamos el csv:

In [155]:
autos = pd.read_csv('coches.csv')
autos
Out[155]:
marca precio
0 Honda Civic 22000
1 Toyota Corolla 25000
2 Ford Focus 27000
3 Audi A4 35000

3.4 Otras funcionalidades

Puedes encontrar más información en este Tutorial de Pandas.

  • Presentación
  • Introducción a las estructuras de datos de pandas
  • Creación de series y dataframes
  • Inspección de series y dataframes
  • Selección de datos
  • Edición de series y dataframes
  • Unión de series y dataframes
  • Operaciones con estructuras pandas
  • Reindexación
  • Ordenación y clasificación
  • Aplicación de funciones y mapeado
  • Gestión de valores nulos
  • Agrupaciones
  • Herramientas de visualización
  • Lectura y escritura de ficheros

4. PRÁCTICA: ANALIZAR ENCUESTAS

4.1 Obtener datos de encuestas

El periódico El País ofrece el detalle de todas las Encuestas Electorales que se han ido publicando desde las últimas elecciones generales. En la misma página podemos encontrar el archivo CSV con todos los datos, procederemos a descargarlo y ver qué podemos hacer con ellos.



Descargar TABLA.CSV (5 Kb)

4.2 Crear dataframe

In [2]:
import pandas as pd
from pandas import DataFrame

# Leer csv
tabla = pd.read_csv('tabla.csv')

# Crear dataframe
datos = DataFrame(tabla)

# Imprimir datos
datos
Out[2]:
date house sample turnout PSOE PP Cs UP VOX ERC JxC PNV BIL COM CC NAS
0 17/10/19 electopanel 1250.0 69.1 26.8 22.3 10.0 12.900 10.3 4.1 1.20 1.50 1.00 0.00 0.60 0.4
1 17/10/19 gad3 NaN NaN 28.7 23.0 8.3 11.200 11.9 NaN NaN NaN NaN 0.00 NaN NaN
2 17/10/19 invymark NaN NaN 29.6 20.6 11.2 11.300 9.0 NaN NaN NaN NaN 0.00 NaN NaN
3 17/10/19 sociométrica NaN NaN 26.1 21.5 9.7 11.800 11.7 3.3 1.80 1.40 0.90 0.00 0.30 0.3
4 16/10/19 nc report NaN 65.1 27.2 22.8 9.8 12.700 10.6 4.1 NaN 1.70 NaN 0.00 NaN NaN
5 16/10/19 ipsos 2000.0 NaN 26.7 21.7 9.4 12.300 11.8 4.0 1.80 1.40 NaN 0.00 NaN NaN
6 15/10/19 celeste-tel 1100.0 65.3 27.0 22.3 11.1 13.400 9.1 4.2 1.50 1.60 1.00 0.00 0.70 0.4
7 14/10/19 sigma dos NaN NaN 27.5 20.6 9.8 13.200 10.7 4.0 1.50 1.60 NaN 0.00 NaN NaN
8 11/10/19 sociométrica 1000.0 NaN 27.4 20.9 9.3 12.300 10.5 3.2 1.70 1.40 1.10 0.00 0.30 0.2
9 8/10/19 electopanel 1250.0 NaN 27.5 22.0 9.0 12.000 10.5 4.0 1.60 1.50 1.00 0.00 0.60 0.4
10 9/10/19 gad3 3121.0 NaN 28.4 22.2 8.6 11.900 11.8 NaN NaN NaN NaN 0.00 NaN NaN
11 9/10/19 hamalgama 1000.0 65.9 26.4 22.5 10.6 13.400 9.8 4.2 1.60 1.50 1.00 0.00 0.60 0.5
12 5/10/19 sigma dos 1600.0 NaN 27.9 21.3 10.0 12.600 10.2 3.6 1.70 1.60 NaN 0.00 NaN NaN
13 4/10/19 keydata NaN 68.6 28.4 20.0 11.6 12.100 9.1 3.6 1.60 1.30 1.00 0.00 0.40 NaN
14 3/10/19 celeste-tel 1100.0 65.7 27.2 21.8 12.2 13.900 7.5 4.2 1.60 1.60 1.00 0.00 0.70 0.5
15 3/10/19 simple lógica 1046.0 66.3 29.1 19.1 10.0 12.500 12.2 NaN NaN NaN NaN 0.00 NaN NaN
16 2/10/19 gad3 NaN 67.0 27.2 20.9 11.0 12.400 10.6 NaN NaN NaN NaN 0.00 NaN NaN
17 4/10/19 keydata NaN 68.6 28.4 20.0 11.6 12.100 9.1 3.6 1.60 1.30 1.00 0.00 0.40 NaN
18 2/10/19 sociométrica 1000.0 NaN 27.2 20.7 10.6 11.700 10.9 3.5 1.80 1.30 1.10 0.00 0.40 0.3
19 2/10/19 hamalgama 900.0 NaN 26.1 22.1 11.7 13.500 8.5 4.3 1.70 1.60 1.00 NaN 0.60 0.5
20 2/10/19 invymark NaN NaN 29.9 20.5 11.7 11.200 7.7 NaN NaN NaN NaN 0.00 NaN NaN
21 2/10/19 imop 1227.0 65.7 28.3 20.1 10.7 12.000 10.8 3.3 2.20 1.60 1.00 0.00 NaN NaN
22 1/10/19 gesop 1005.0 NaN 28.0 19.6 10.4 12.200 10.3 3.2 1.80 NaN NaN 0.00 NaN NaN
23 1/10/19 sigma dos 1000.0 NaN 28.9 21.2 10.1 12.200 9.2 3.8 1.70 1.80 NaN 0.00 NaN NaN
24 1/10/19 electopanel 1200.0 NaN 26.0 22.4 10.5 12.300 8.7 4.0 1.60 1.60 1.00 0.00 0.60 0.4
25 24/9/19 sondaxe 1001.0 NaN 26.1 19.1 10.3 12.100 10.0 NaN NaN 1.30 NaN 0.00 NaN NaN
26 24/9/19 gad3 1207.0 NaN 27.2 21.4 11.3 12.400 9.6 3.9 2.00 1.60 1.00 0.00 0.40 0.5
27 22/9/19 celeste-tel 1100.0 65.6 29.4 22.1 13.4 14.100 7.0 4.2 1.70 1.60 1.10 0.70 0.60 0.5
28 20/9/19 nc report 1000.0 65.0 28.6 22.0 13.7 13.600 7.5 NaN NaN NaN NaN NaN NaN NaN
29 19/9/19 ipsos 1837.0 69.5 28.0 19.8 14.2 15.200 9.8 3.7 1.70 1.50 NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
43 04/09/2019 invymark NaN NaN 34.4 20.1 11.5 12.200 6.7 NaN NaN NaN NaN NaN NaN NaN
44 29/08/2019 sociométrica 1100.0 NaN 31.3 18.1 12.2 13.900 9.7 4.1 1.80 1.60 1.10 0.80 0.40 0.4
45 28/08/2019 sigma dos 1000.0 NaN 33.4 19.0 11.8 14.200 8.3 4.3 1.10 1.50 NaN NaN NaN NaN
46 24/08/2019 nc report NaN 66.6 29.5 21.9 13.9 13.100 7.7 3.6 1.80 1.50 1.10 0.50 0.60 0.5
47 08/08/2019 electopanel 2500.0 64.1 29.3 21.0 12.5 13.200 9.0 4.5 2.00 1.60 1.10 0.90 0.60 0.4
48 11/08/2019 nc report NaN 67.6 29.7 21.8 14.1 12.900 7.8 3.5 2.00 1.50 1.20 0.40 0.70 0.6
49 06/08/2019 celeste-tel 1100.0 67.0 30.9 20.2 14.3 13.400 8.3 3.7 1.80 1.50 0.90 0.40 0.60 0.5
50 05/08/2019 keydata NaN 72.7 31.5 18.7 14.4 13.400 7.6 NaN NaN NaN NaN NaN NaN NaN
51 04/08/2019 simple lógica 1074.0 68.0 31.4 17.2 14.9 13.800 11.0 NaN NaN NaN NaN NaN NaN NaN
52 01/08/2019 invymark NaN NaN 36.1 17.0 12.6 12.300 6.5 NaN NaN NaN NaN NaN NaN NaN
53 25/07/2019 sociométrica 1000.0 NaN 29.3 18.2 16.2 14.300 8.7 NaN NaN NaN NaN NaN NaN NaN
54 25/07/2019 electopanel 1200.0 64.2 29.2 20.8 12.3 13.200 9.5 NaN NaN NaN NaN NaN NaN NaN
55 17/07/2019 invymark NaN NaN 36.7 16.1 12.9 12.500 7.3 NaN NaN NaN NaN NaN NaN NaN
56 12/07/2019 metroscopia 1251.0 NaN 31.0 19.0 13.0 13.000 8.0 NaN NaN NaN NaN NaN NaN NaN
57 07/07/2019 simple lógica 1037.0 70.2 32.7 17.9 13.1 15.200 9.3 NaN NaN NaN NaN NaN NaN NaN
58 07/07/2019 keydata NaN 72.1 31.2 17.4 16.6 13.100 7.6 3.9 1.50 1.30 1.10 NaN 0.40 NaN
59 02/07/2019 invymark 1200.0 NaN 36.6 15.5 13.2 12.900 7.6 NaN NaN NaN NaN NaN NaN NaN
60 04/07/2019 demoscopia servicios NaN 72.4 31.3 21.5 16.2 11.200 7.7 NaN NaN NaN NaN NaN NaN NaN
61 04/07/2019 celeste-tel 1100.0 67.6 31.2 19.9 14.4 13.237 8.4 3.8 1.80 1.50 0.90 0.40 0.60 0.5
62 24/06/2019 electopanel 8800.0 NaN 32.1 20.2 12.5 12.200 9.0 NaN NaN NaN NaN NaN NaN NaN
63 21/06/2019 sigma dos 1000.0 NaN 32.6 19.4 13.1 13.200 8.0 4.2 1.70 1.50 NaN NaN NaN NaN
64 19/06/2019 invymark NaN NaN 35.9 15.1 14.0 12.900 8.1 NaN NaN NaN NaN NaN NaN NaN
65 19/06/2019 gad3 NaN 70.0 30.8 20.6 16.2 13.000 5.6 NaN NaN NaN NaN NaN NaN NaN
66 12/06/2019 nc report 1000.0 68.8 30.5 20.2 14.9 12.700 NaN 3.6 1.90 1.60 1.10 0.40 0.70 0.6
67 09/06/2019 celeste-tel 1100.0 68.1 30.6 19.4 14.6 13.200 8.7 3.9 1.90 1.50 1.00 0.40 0.70 0.5
68 09/06/2019 simple lógica 1090.0 75.9 32.0 15.7 19.7 13.400 8.9 NaN NaN NaN NaN NaN NaN NaN
69 06/06/2019 demoscopia servicios 1000.0 NaN 30.4 21.1 17.6 10.800 7.9 NaN NaN NaN NaN NaN NaN NaN
70 29/05/2019 invymark NaN NaN 33.6 15.4 15.1 13.300 8.4 NaN NaN NaN NaN NaN NaN NaN
71 10/05/2019 simple lógica 1058.0 75.6 33.7 18.6 21.7 14.800 3.2 NaN NaN NaN NaN NaN NaN NaN
72 29/04/2019 Elecciones 1000000.0 71.8 28.7 16.7 15.9 14.300 10.3 3.9 1.91 1.51 0.99 0.66 0.53 0.4

73 rows × 16 columns

4.3 Analizar datos

Podemos observar que tenemos 73 filas y 16 columnas, y que los campos que no tienen datos aparecen como NaN. Ahora si queremos listar los nombres de las columnas:

In [4]:
list(datos)
Out[4]:
['date',
 'house',
 'sample',
 'turnout',
 'PSOE',
 'PP',
 'Cs',
 'UP',
 'VOX',
 'ERC',
 'JxC',
 'PNV',
 'BIL',
 'COM',
 'CC',
 'NAS']

Si queremos obtener todos los datos de una columna, por ejemplo PSOE:

In [5]:
datos.PSOE
Out[5]:
0     26.8
1     28.7
2     29.6
3     26.1
4     27.2
5     26.7
6     27.0
7     27.5
8     27.4
9     27.5
10    28.4
11    26.4
12    27.9
13    28.4
14    27.2
15    29.1
16    27.2
17    28.4
18    27.2
19    26.1
20    29.9
21    28.3
22    28.0
23    28.9
24    26.0
25    26.1
26    27.2
27    29.4
28    28.6
29    28.0
      ... 
43    34.4
44    31.3
45    33.4
46    29.5
47    29.3
48    29.7
49    30.9
50    31.5
51    31.4
52    36.1
53    29.3
54    29.2
55    36.7
56    31.0
57    32.7
58    31.2
59    36.6
60    31.3
61    31.2
62    32.1
63    32.6
64    35.9
65    30.8
66    30.5
67    30.6
68    32.0
69    30.4
70    33.6
71    33.7
72    28.7
Name: PSOE, Length: 73, dtype: float64

Podemos obtener un cálculo estadístico fácilmente, por ejemplo de Unidas Podemos:

In [6]:
datos.UP.describe()
Out[6]:
count    73.000000
mean     13.052562
std       1.062717
min      10.800000
25%      12.300000
50%      13.100000
75%      13.500000
max      16.000000
Name: UP, dtype: float64

Observamos que la media aritmética es de un 13,05% de intención de voto y que los datos están bastante agrupados puesto que la desviación típica es de 1,06.

Ahora vamos a ver los datos de C's:

In [7]:
datos.Cs.describe()
Out[7]:
count    73.000000
mean     12.706849
std       2.450869
min       8.300000
25%      11.000000
50%      12.700000
75%      14.000000
max      21.700000
Name: Cs, dtype: float64

Podemos observar que mientras la media es de un 12,7% la desviación típica de 2,45 nos indica que los datos están más dispersos que los de UP.

4.4 Generar gráficas con MATPLOTLIB

Como el objetivo es aprender a hacer gráficas y no hacer un estudio riguroso sobre las encuestas, antes de realizar la gráfica eliminaremos algunos registros que están mal ordenados o duplicados para simplificar el gráfico. Hay que decir también que aunque el formato de las fechas esté mal no perderemos el tiempo en corregirlo.

In [55]:
f = datos.drop([0,1,3,4,5,6,7,8,9,10,11,12,13,14,17],axis=0)
In [56]:
%matplotlib inline

import matplotlib.pyplot as plt

# Establecemos el eje X con las fechas
x = f.date

# Y creamos las variables de los 5 primeros partidos
psoe = f.PSOE
pp = f.PP
cs = f.Cs
up = f.UP
vox = f.VOX

# Nombre de las funciones
nombre1 = 'PSOE'
nombre2 = 'PP'
nombre3 = "C's"
nombre4 = 'UP'
nombre5 = 'VOX'


# Definimos el tamaño del gráfico
fig, axes = plt.subplots(figsize=(18,9))


# Título del gráfico
título = ("Intención de voto")
axes.set_title(título)

# Etiquetas de los ejes X e Y
axes.set_xlabel("Fecha")
axes.set_ylabel("Porcentaje de voto")
axes.set_xticklabels(x,rotation=90 )

# Rejilla 
axes.grid(True)

# Creamos la gráfica
axes.invert_xaxis()
axes.plot(x,psoe,'red', x,pp,'blue', x,cs,'orange', x,up,'purple', x, vox, 'green')
axes.legend([nombre1, nombre2, nombre3, nombre4, nombre5])

# Guardamos foto
# fig.savefig(título + '.png', dpi=300)
Out[56]:
<matplotlib.legend.Legend at 0x1e6c3a67548>

4.5 Otras funcionalidades

Con Matplotlib podemos realizar también histogramas, gráficos de barras, diagramas de dispersión, etc.

Puedes encontrar más información en este Tutorial de Matplotlib.