Creación de gráficos con matplotlib


In [19]:
import numpy as np
import matplotlib.pyplot as plt

In [3]:
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X,C)
plt.plot(X,S)

plt.show()



In [4]:
# Crear un nuevo figure de tamaño 8x6 pulgadas, usando 100 píxeles por pulgada
plt.figure(figsize=(8,6), dpi=80)

# Crear un nuevo subplot de una grilla de 1x1
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# Dibujar coseno usando una línea contínua de color azul y de grosor 1 píxel
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")

# Dibujar coseno usando una línea contínua de color verde y de grosor 1 píxel
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")

# Colocar el límite del eje x
plt.xlim(-4.0,4.0)

# Colocar las marcas del eje x
plt.xticks(np.linspace(-4,4,9,endpoint=True))

# Colocar el límite del eje y
plt.ylim(-1.0,1.0)

# Colocar las marcas del eje y
plt.yticks(np.linspace(-1,1,5,endpoint=True))

# Guardar la figura con 72 píxeles por pulgada
# savefig("../figures/exercice_2.png",dpi=72)

# Mostrar el resultado en pantalla
plt.show()



In [21]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# Cambiar el color a rojo, y el grosor a 2.5
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")

# Cambiar el color a azul, y el grosor a 2.5
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")

plt.show()



In [22]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")

#Colocar las marcas de los ejes a valores con más sentido
plt.xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])

plt.show()



In [23]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])

#Colocando límites más cercanos a la función
plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

plt.show()



In [24]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")

#Colocando marcas con etiquetas personalizadas usando LaTeX
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], \
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

plt.show()



In [25]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], \
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

#Moviendo las líneas de los ejes al origen
ax = plt.gca()
#Eliminar la línea de la derecha
ax.spines['right'].set_color('none')
#Eliminar la línea superior
ax.spines['top'].set_color('none')
#Evitar que salgan las marcas del eje x en la parte superior
ax.xaxis.set_ticks_position('bottom')
#Colocando la linea inferior del eje x en la posición 0 según los datos
ax.spines['bottom'].set_position(('data',0))
#Evitar que salgan las marcas del eje y en la izquierda
ax.yaxis.set_ticks_position('left')
#Colocando la linea izquierda del eje y en la posición 0 según los datos
ax.spines['left'].set_position(('data',0))

plt.show()



In [26]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

#Agregando etiquetas para la leyenda
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="coseno")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="seno")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], \
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.legend(loc="upper left", frameon=False)

plt.show()



In [28]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

#Agregando etiquetas para la leyenda
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="coseno")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="seno")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], \
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.legend(loc="upper left", frameon=False)

#Valor x a anotar
t = 2*np.pi/3
#Graficar la línea punteada azul desde el eje x hasta el punto y del coseno
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=1.5, linestyle="--")
#Graficar un solo punto en un scatterplot para denotar el punto específico
plt.scatter([t,],[np.cos(t),], 50, color ='blue')

#Dibujar una anotación con una flecha apuntando al punto específico
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
             xy=(t, np.sin(t)), xycoords='data',
             xytext=(+10, +30), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

#Graficar la línea punteada roja desde el eje x hasta el punto y del seno
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=1.5, linestyle="--")
#Graficar un solo punto en un scatterplot para denotar el punto específico
plt.scatter([t,],[np.sin(t),], 50, color ='red')

#Dibujar una anotación con una flecha apuntando al punto específico
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
             xy=(t, np.cos(t)), xycoords='data',
             xytext=(-90, -50), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.show()



In [36]:
plt.figure(figsize=(10,6), dpi=80)
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

#Agregando etiquetas para la leyenda
plt.plot(X, C, color="red", linewidth=2.5, linestyle="-", label="coseno")
plt.plot(X, S, color="blue", linewidth=2.5, linestyle="-", label="seno")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], \
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, +1], [r'$-1$', r'$+1$'])

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.legend(loc="upper left", frameon=False)

t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.cos(t),], 50, color ='blue')

plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
             xy=(t, np.sin(t)), xycoords='data',
             xytext=(+10, +30), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')

plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
             xy=(t, np.cos(t)), xycoords='data',
             xytext=(-90, -50), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

#Colocar un fondo blanco transparente a cada etiqueta
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))

plt.show()


Figures, Subplots, Axes y Ticks


In [38]:
#Subgráficos con manejo implícito
plt.subplot(2,1,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)

plt.subplot(2,1,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)

# plt.savefig('../figures/subplot-horizontal.png', dpi=64)
plt.show()



In [65]:
%matplotlib inline
#Subgráfico con variables explícitas (mismo resultado que la celda anterior)

fig = plt.figure()
sub1 = fig.add_subplot(2, 1, 1)
sub1.set_xticks([])
sub1.set_yticks([])
sub1.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)

sub2 = fig.add_subplot(2, 1, 2)
sub2.set_xticks([])
sub2.set_yticks([])
sub2.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)

fig.show()


C:\Users\Kenji2\Anaconda3\lib\site-packages\matplotlib\figure.py:397: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

In [44]:
plt.subplot(1,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,1)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(1,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,2)',ha='center',va='center',size=20,alpha=.5)

# plt.savefig('../figures/subplot-vertical.png', dpi=64)
plt.show()



In [43]:
plt.subplot(2,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,3)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,4)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)

# savefig('../figures/subplot-grid.png', dpi=64)
plt.show()



In [68]:
import matplotlib.gridspec as gridspec

G = gridspec.GridSpec(3, 3) #Especificación de un espacio de 3 filas y 3 columnas

subplot_1 = plt.subplot(G[0, :]) #Subgráfico que ocupa la fila 0 y todas las columnas
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Subplot 1',ha='center',va='center',size=24,alpha=.5)

subplot_2 = plt.subplot(G[1,:2]) #Subgráfico que ocupa la fila 1 y las columnas [0,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Subplot 2',ha='center',va='center',size=20,alpha=.5)

subplot_3 = plt.subplot(G[1:, 2]) #Subgráfico que ocupa las filas [1,2] y la columna 2
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Subplot 3',ha='center',va='center',size=18,alpha=.5)

subplot_4 = plt.subplot(G[2,0]) #Subgráfico que ocupa la fila 2 y la columna 0
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Subplot 4',ha='center',va='center',size=18,alpha=.5)

subplot_5 = plt.subplot(G[2,1]) #Subgráfico que ocupa la fila 2 y la columna 1
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Subplot 5',ha='center',va='center',size=18,alpha=.5)

#plt.savefig('../figures/gridspec.png', dpi=64)
plt.show()



In [70]:
plt.axes([0.1,0.1,.8,.8]) #[izquierda, inferior, ancho, altura] normalizado
plt.xticks([]), plt.yticks([])
plt.text(0.6,0.6, 'axes([0.1,0.1,.8,.8])',
         ha='center',va='center',size=20,alpha=.5)

plt.axes([0.2,0.2,.3,.3])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'axes([0.2,0.2,.3,.3])',
     ha='center',va='center',size=12,alpha=.5)

plt.show()



In [71]:
plt.axes([0.1,0.1,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.1,0.1,.8,.8])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.2,0.2,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.2,0.2,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.3,0.3,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.3,0.3,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.4,0.4,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.4,0.4,.5,.5])',ha='left',va='center',size=16,alpha=.5)

# plt.savefig("../figures/axes-2.png",dpi=64)
plt.show()


Ejemplos de gráficos


In [105]:
n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)

plt.xlim(-np.pi,np.pi), plt.xticks([])
plt.ylim(-2.5,2.5), plt.yticks([])
plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=0.25)

plt.plot (X, Y-1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y-1, where=Y>0, color='blue', alpha=0.25)
plt.fill_between(X, -1, Y-1, where=Y<0, color='red', alpha=0.25)

plt.show()



In [77]:
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X)

plt.axes([0.025,0.025,0.95,0.95])

plt.scatter(X,Y, s=75, c=T, alpha=.5)

plt.xlim(-1.5,1.5), plt.xticks([])
plt.ylim(-1.5,1.5), plt.yticks([])
plt.show()



In [85]:
n = 12
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

for x,y in zip(X,Y1):
    plt.text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom', size=8)
    
for x,y in zip(X,-Y2):
    plt.text(x+0.4, y-0.05, '%.2f' % y, ha='center', va= 'top', size=8)

plt.xlim(-0.5,n), plt.xticks([])
plt.ylim(-1.25,+1.25), plt.yticks([])
plt.show()



In [89]:
def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)

plt.axes([0.025,0.025,0.95,0.95])
plt.xticks([]), plt.yticks([])

plt.contourf(X, Y, f(X,Y), 8, alpha=.75, cmap='hot')
C = plt.contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=8)
plt.show()



In [106]:
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot')
plt.contourf(X, Y, Z, zdir='z', offset=-2, alpha=.75, cmap='hot')
ax.set_zlim(-2,2)

plt.show()


Fuente original http://www.labri.fr/perso/nrougier/teaching/matplotlib/

Nicolas P. Rougier