Python para ciencias e ingeniería
|nbazurtog@gmail.com

Unipanamericana
Visualización y manipulación de datos para toma de decisiones

Matplotlib/Pylab
Permite generar gráficas del tipo
Visual Python
Genera rápidamente animaciones de procesos dependientes del tiempo que tienen lugar en el espacio 3d.
El propósito de la computación científica son los insights (descubrimientos, conocimiento profundo) no los números
Para entender el significado de lo calculado necesitamos post-procesamiento, análisis estadístico y visualización gráfica de los datos.

Matplotlib (Pylab)
Es una biblioteca de trazado de Python orientada a objetos. Se puede utilizar en:
- Scripts Python.
- El shell de Python.
- IPython.
- Jupyter notebook.
- Servidores de aplicaciones web.

Pylab es una interfaz para el mismo conjunto de funciones que imita la interfaz de trazado Matlab.
vs
Pylab
Más cómodo para trazados sencillos.
Da un control mucho más detallado sobre cómo se crean las tramas
Text
Text
Text
¿Qué puedo hacer?
Cómo importarlos
import nombre_libreria as nombre_alias
pylab
ó
matplotlib.pyplot
numpy
El trazado casi siempre necesita arreglos de datos numéricos y es por esta razón que el módulo numpy se usa mucho.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange (-3.14, 3.14, 0.01)
y = np.sin(x)
plt.plot(x, y)
plt.show()Matplotlib
Mismo código
import pylab
import numpy as N
x = N.arange (-3.14, 3.14, 0.01)
y = N.sin(x)
pylab.plot(x, y)
pylab.show()Pylab
Con ambos usamos plot y show.
La diferencia es el paquete importado y las características de personalización que habilita Matplotlib.
Modo en línea
%matplotlib inline
Pero... y si voy a visualizar datos sería bueno ver las cosas en la consola
Para Jupyther y IPython qtconsole, basta usar este comando mágico y los gráficos aparecen dentro de nuestra consola
No se preocupe si aparece una advertencia, son componentes que importa.


Guardar una figura
Una vez creamos la figura usando plot y hemos añadido ejes,etiquetas y lo que se requiera se puede guardar de dos formas ese "plot"
1
2
Mostrar la figura con show y guardarla manualmente, oprimiendo el icono / opción de guardar.
Guardandola desde nuestro código con el comando savefig (el formato va atado a la extensión que le doy)
import pylab
import numpy as N
x = N.arange(-3.14, 3.14, 0.01)
y = N.sin(x)
pylab.plot(x, y, label='sin(x)')
pylab.savefig('myplot.png') # guarda un archivo png
pylab.savefig('myplot.eps') # guarda un archivo eps
pylab.savefig('myplot.pdf') # guarda un archivo pdf PNG
JPG
EPS
SVG
PGF
Ajuste del plot
import pylab
import numpy as N
x = N.arange(-3.14, 3.14, 0.01)
y1 = N.sin(x)
y2 = N.cos(x)
pylab.figure(figsize=(5, 5))
pylab.plot(x, y1, label='sin(x)')
pylab.plot(x, y2, label='cos(x)')
#Detalles del plot
pylab.legend()
pylab.grid()
pylab.xlabel('x')
pylab.title('Este es el título de la gráfica')
pylab.show()
Los cuadros de colores indican qué habilita cada comando.
Comandos para personalizar el plot
figure(figsize=(5,5)) indica el tamaño de la figura(5 pulgadas por 5)
plot(x,y1,label=’sin(x)’) la palabra label define el nombre de esa lína y se verá en la leyenda.
¿¿Si llamamos plot repetidamente qué pasa??
axis([-2,2,-1,1]) fija que el área desplegada en un rango. X de -2 a 2 y y de -1 a 1
legend() desplegará una leyenda con los labels definidos previamente.
grid() habilita una cuadricula de fondo.
xlabel(’...’) y ylabel(’...’) define las etiquetas de los ejes

También puedo personalizar los colores ancho y demás estilo, muy similar a Matlab.
plot(x,y,’og’) graficará círculos (o) en verde (g)
plot(x,y,’-r’) graficará una línea (-) en rojo (r)
plot(x,y,’-b’,linewidth=2) graficará una línea azul (-b) con dos pixeles de ancho linewidth=2 el cual es dos veces el de por defecto.
Para más información y comandos ejecute help("pylab.plot") en la consola de Python.
Graficar más de una curva
1
¿En el mismo gráfico?
¡Eso es lo que pasa con el plot repetido!

import numpy as N
t = N . arange (0 ,2* N . pi ,0.01)
import pylab
pylab . plot (t , N . sin ( t ) , label = ' sin ( t )' )
pylab . plot (t , N . cos ( t ) , label = ' cos ( t )' )
pylab . legend ()
pylab . show ()
Graficar más de una curva
2
El comando pylab.subplot permite arreglar diferentes gráficos dentro de una misma ventana de figura
import numpy as N
t = N . arange (0 , 2 * N . pi , 0.01)
import pylab
pylab . subplot (2 , 2 , 1) # Una matrix de 2x2 y selecciono la primera figura
pylab . plot (t , N . sin ( t ))
pylab . xlabel ( 't ')
pylab . ylabel ( 'sin ( t ) ')
pylab . subplot (2 , 2 , 2) # Una matrix de 2x2 y selecciono la segunda figura
pylab . plot (t , N . cos ( t ))
pylab . xlabel ( 't ')
pylab . ylabel ( ' cos ( t ) ')
pylab . subplot (2 , 2 , 3) # Una matrix de 2x2 y selecciono la tercera figura
pylab . plot (t , N . tan ( t ))
pylab . xlabel ( 't ')
pylab . ylabel ( ' tan ( t ) ')
pylab . subplot (2 , 2 , 4) # Una matrix de 2x2 y selecciono la cuarta figura
pylab . plot (t , N . exp ( t ))
pylab . xlabel ( 't ')
pylab . ylabel ( ' exp ( t ) ')
pylab . show ()
Graficar más de una curva
3
Más de dos ventanas.
import pylab
pylab . figure (1) # primera ventana
pylab . plot ( range (10) , ’o ’)
pylab . figure (2) # segunda ventana
pylab . plot ( range (100) , ’x ’)
pylab . show ()Experimente con pylab.close() para cerrar una , algunas o todas las ventanas.
Histogramas
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma*np.random.randn(10000)
# Histograma de los datos
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
# Adiciona una línea de mejor ajuste, punteada de color rojo.
y = mlab.normpdf( bins, mu, sigma)
l = plt.plot(bins, y, 'r--', linewidth=1)
plt.xlabel('Inteligencias')
plt.ylabel('Probabilidad')
plt.title(r'$\mathrm{Histograma\ de\ IQ:}\ \mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
Matrices de datos
imshow(X)
Muestra la imagen en X a los ejes actuales. X puede ser una matriz o una imagen PIL. Si X es una matriz, puede tener las siguientes formas y tipos:
- MxN - Valores a mapear (float o int)
- MxNx3 - RGB (float o uint8)
- MxNx4 - RGBA (float o uint8)
El valor de cada componente de arrays flotantes MxNx3 y MxNx4 debe estar en el rango 0.0 to 1.0. Los arreglos MxN son mapeados a colores basados en la norma(mapear escalar a escalar) y el el cmap (mapear el escalar normalizado a un color).
#Ejemplo 1
import matplotlib.pyplot as plt
import numpy as np
plt.imshow(np.random.random((50,50)));
plt.colorbar()
plt.show()
#Ejemplo 2
import pylab as plt
import numpy as np
Z=np.array(((1,2,3,4,5),(4,5,6,7,8),(7,8,9,10,11)))
im = plt.imshow(Z, cmap='hot') # cmap indica el mapa de colores a manejar
plt.colorbar(im, orientation='horizontal')
plt.show()

# Mapa de colores 'jet' (el que viene por defecto)
plt . imshow (Z , cmap = cm . jet )
# Reversa los colores en jet
plt . imshow (Z , cmap = cm . jet_r )
# Reversa los colores en jet
plt . imshow (Z , cmap = cm . jet_r )
# hace aislamiento a través de la reducción del número de colores a 10
mycmap = cm . get_cmap ( ’ jet ’ , 10) # 10 colores discretos
#Uso de los tres
import numpy as np
import matplotlib . mlab as mlab
import matplotlib . pyplot as plt
import matplotlib . cm as cm # Submodulo de Colour Map
# Creo una matriz Z con ciertos datos
delta = 0.025
x = y = np . arange ( -3.0 , 3.0 , delta )
X , Y = np . meshgrid (x , y )
Z = mlab . bivariate_normal (X , Y , 3.0 , 1.0 , 0.0 , 0.0)
Nx , Ny = 1 , 3
plt . subplot ( Nx , Ny , 1) # El siguiente plot será mostrado en el primer subplot entre la matriz de subplots Nx x Ny
plt . imshow (Z , cmap = cm . jet ) # default colourmap ’ jet ’
plt . title ( " colourmap jet " )
plt . subplot ( Nx , Ny , 2) # siguiente plot para el segundo subplot
plt . imshow (Z , cmap = cm . jet_r ) # reverse colours in jet
plt . title ( " colourmap jet_r " )
plt . subplot ( Nx , Ny , 3)
mycmap = cm . get_cmap ( 'jet' , 10) # 10 discrete colors
plt . imshow (Z , cmap = mycmap )
plt . title ( " colourmap jet \ n (10 colores ) " )
plt . show ()Para usar diferentes mapas de colores, se hace uso del módulo matplotlib.cm (cm por Colour Map). Podemor seleccionar colourmaps de un conjunto que ya provee los mapas y se pueden modificar (reduciendo el número de colores del mapa )

y el 3D ?
Se pueden hacer gráficas 3D en Matplotlib, dentro de un cartesiano 3D
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve')
ax.legend()
plt.show()

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Grab some test data.
X, Y, Z = axes3d.get_test_data(0.05)
# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()

y el 3D ?

Sin embargo si lo que quiero modelar, requiere de una animación en el tiempo, como temas sobre física, aparece Visual Python
import visual , math
ball = visual . sphere ()
box = visual . box ( pos =[0 , -1 , 0] , width =4 , length =4 , height =0.5)
trace = visual . curve ( radius =0.2 , color = visual . color . green )
for i in range (1000):
t = i * 0.1
y = math . sin ( t )
# Actualiza la posición de la bola
ball . pos = [t , y , 0]
trace . append ( ball . pos )
# Asegura sólo 24 frames por segundo
visual . rate (24)
Manipulación y exportación
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')Generar un reporte
import pandas as pd
import numpy as np
df = pd.read_csv('investments.csv', sep=';')
df1 = df[['funded_year', 'funded_quarter', 'funding_round_type', 'raised_amount_usd']]
df1 = df1[df.funded_year >= 2007]
df1 = df1[df1.funding_round_type.isin(['angel', 'private_equity', 'seed', 'venture', 'undisclosed'])]
df1 = df1.fillna(0)
def to_int(x):
try:
x = int(x.replace(' ', ''))
except (AttributeError, ValueError):
return 0
df1.raised_amount_usd = df1.raised_amount_usd.map(to_int)
df1.raised_amount_usd = df1.raised_amount_usd.astype(int)
table1 = pd.pivot_table(df1, index=['funding_round_type'],
columns=['funded_year', 'funded_quarter'],
values=['raised_amount_usd'],
aggfunc=[lambda x: len(x)],fill_value=0)
table2 = pd.pivot_table(df1, index=['funding_round_type'],
columns=['funded_year', 'funded_quarter'],
values=['raised_amount_usd'],
aggfunc=[np.sum],fill_value=0)
writer = pd.ExcelWriter('report.xlsx')
table1.to_excel(writer, 'Sheet1')
table2.to_excel(writer, 'Sheet2')
writer.save()¿Y si tengo una plantilla?
Módulo openpyxl
import openpyxl
from openpyxl import load_workbook
def update_range(worksheet, data, cell_range=None, named_range=None):
"""
Updates an excel worksheet with the given data.
:param worksheet: an excel worksheet
:param data: data used to update the worksheet cell range (list, tuple, np.ndarray, pd.Dataframe)
:param cell_range: a string representing the cell range, e.g. 'AB12:XX23'
:param named_range: a string representing an excel named range
"""
def clean_data(data):
if not isinstance(data, (list, tuple, np.ndarray, pd.DataFrame)):
raise TypeError('Invalid data, data should be an array type iterable.')
if not len(data):
raise ValueError('You need to provide data to update the cells')
if isinstance(data, pd.DataFrame):
data = data.values
elif isinstance(data, (list, tuple)):
data = np.array(data)
return np.hstack(data)
def clean_cells(worksheet, cell_range, named_range):
# check that we can access a cell range
if not any((cell_range, named_range) or all((cell_range, named_range))):
raise ValueError('`cell_range` or `named_range` should be provided.')
# get the cell range
if cell_range:
try:
cells = np.hstack(worksheet[cell_range])
except (CellCoordinatesException, AttributeError):
raise ValueError('The cell range provided is invalid, cell range must be in the form XX--[:YY--]')
else:
try:
cells = worksheet.get_named_range(named_range)
except (NamedRangeException, TypeError):
raise ValueError('The current worksheet {} does not contain any named range {}.'.format(
worksheet.title,
named_range))
# checking that we have cells to update, and data
if not len(cells):
raise ValueError('You need to provide cells to update.')
return cells
cells = clean_cells(worksheet, cell_range, named_range)
data = clean_data(data)
# check that the data has the same dimension as cells
if len(cells) != data.size:
raise ValueError('Cells({}) should have the same dimension as the data({}).'.format(len(cells), data.size))
for i, cell in enumerate(cells):
cell.value = data[i]Gracias

Para practicar
1.Realice la siguiete figura utilizando la funcion de plt.plot([X], [Y])

Para practicar
2. Grafique la funcion de sin2x entre -1 y 5

Para practicar
3. Grafique las funciones x2 y 1 – x2 en un mismo plano opcional = puede diferenciarlas por colores o forma de pintarse

4. En que se diferencia la funcion scatter y corcobar, realice un ejemplo utilizando las 2.
5. Utilizando la funcion de contour y meshgrid grafique las lineas suavizadas de la funcion 2*sin2x + 2*cos2x entre -10 y 10

Visualización
By nychi713
Visualización
- 880