Visualización de Vectores y Funciones Reutilizables en Python
Resumen
¿Cómo visualizar vectores con Python?
Cuando trabajamos con combinaciones lineales, es crucial poder visualizar los vectores de manera efectiva. Esto no solo nos ayuda a comprender mejor el problema, sino que también facilita la interpretación de resultados. Sigamos un proceso paso a paso para crear una función que nos permita graficar vectores utilizando Python.
¿Qué herramientas utilizamos para graficar?
Para abordar esta tarea, emplearemos NumPy y Matplotlib, dos bibliotecas fundamentales en el ecosistema de Python para manejo de datos y graficación. A continuación, asegurémonos de importar las librerías necesarias:
import numpy as np
import matplotlib.pyplot as plt
¿Cómo creamos una función para graficar vectores?
Pensando en la reutilización y claridad del código, lo mejor es encapsular la lógica de graficación de vectores en una función. Así, podemos llamar a esa función cada vez que la necesitemos. Vamos a crear la función graficar_vectores:
Definimos los vectores que deseamos visualizar. Aquí, creamos dos vectores v1 y v2:
v1 = np.array([2,5])v2 = np.array([3,-2])
¿Cómo llamamos a la función para graficar?
Una vez que hemos definido nuestros vectores y la función graficar_vectores, podemos proceder a graficar:
graficar_vectores([v1, v2],['orange','blue'])
Este comando generará una gráfica donde los vectores se distinguen claramente por los colores especificados.
¿Cómo guardar la función para reutilizarla?
Cuando tienes funciones útiles como ésta, es ventajoso guardarlas en un notebook separado para que puedas reutilizarlas en diferentes proyectos sin perder eficiencia. Creamos un archivo para guardar la función:
Crear una carpeta llamada Funciones_auxiliares.
Dentro, un notebook llamado Graficar_vectores.ipynb.
Copiar y pegar la función graficar_vectores en este nuevo notebook.
Luego, para importarla en nuestros notebooks principales:
Esto garantiza que cualquier actualización que hagamos a la función se reflejará automáticamente en todos los análisis donde la utilizamos.
¿Cuáles son los beneficios de esta organización del código?
Tener funciones reutilizables y bien organizadas trae numerosos beneficios:
Mantenimiento eficiente del código: Si necesitamos actualizar la función, podemos hacerlo en un solo lugar.
Claridad y profesionalismo: Un código estructurado es más fácil de entender, compartir y escalar.
Productividad incrementada: Ahorra tiempo al evitar reescribir la misma lógica en diferentes partes de un proyecto.
¡Continúa aprendiendo y explorando nuevas formas de optimizar tus análisis! Cada herramienta y técnica que domines te acercará a resultados más precisos y eficientes.
Seria muy bueno que platzi diera clases de la libreria matplotlib
Tutoriales de matplotlib de la documentación oficial.
Hace poco salio uno, es basico pero ayuda muchisimo, el curso lo complementan con seaborn
Desde google colab lo hice asi
Hice exactamento lo que tenes ahi y me funciono perfectamente. Muchas gracias.
de nada, que bueno que te sirvio, deje mis apuntes del curso en mi github, deje el aporte en los comentarios del curso o búscame como rb-one, y avisame si necesitas algo.
No sé si funcione igual en windows o en linux pero aquí dejo la línea para importar el notebook de graficarVectores.ipynb
Si tenías dudas acerca de la función graficarVectores() esta explicación te será muy útil:
En primer lugar, recordemos los dos vectores que deseamos graficar (v1 & v2) y que se usan como ejemplo
Ya que los tenemos como ejemplo prestemos atención a los puntos de la función que nos pudieron llegar a confundir, las funciones :
np.concatenate() # // Nos permite concatenar dos arreglos de números.plt.quiver # // Nos permite graficar rectas con una flecha al final.
Para entender el funcionamiento de np.concatenate basta con ejemplicar lo que hace en la iteración número ++0++ del ciclo for:
a = np.concatenate([[0,0], v1]) # Aquí simulamos la primera linea del ciclo forprint(a)[0,0,2,5] # // Como puedes observar los dos arreglos o listas se fusionaron y este es el resultado
Si repetimos este proceso para el vector v2, este es el resultado:
b = np.concatenate([[0,0], v2]) # // Aquí simulamos la primera linea del ciclo for pero en la iteracion 1print(b)[0,0,3,2] #// Como puedes observar los dos arreglos o listas se fusionaron nuevamente
Ahora veamos que sucede con la funcion plt.quiver():
\
Esta recibe 4 parametros inciales que son las cordenadas de inicio x_inicial , y_inicial y las coordenadas donde finaliza el vector x_final, y_final :
plt.quiver([x[0]],[x[1]],[x[2]],[x[3]])
Por otra parte, el parametro scale_units {'ancho', 'alto', 'puntos', 'pulgadas', 'x', 'y', 'xy'} es opcional y nos permite graficar los vectores con unidades especificas, en este caso en las unidades de este plano(x,y).
De igual forma el parametro angles ayuda a determinar el ángulo de las flechas, esto se explica mejor en la documentacion de MatplotLib https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.quiver.html .
Espero les haya servido mucho la explicación. Like si te sirvió 💚... _ And remember Never Stop Learning_
muchas gracias, me ayudaste a entender todas las cosas que mando de golpe y sin explicación alguna
Muy bien explicado, gracias.
Graficar vectores
En las jupyter notebook escribimos:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
v1 = np.array([2,5])v2 = np.array([3,2])# vecs: vectores.# cols: colores.# alpha: valor de transparencia.defgraficarVectores(vecs, cols, alpha=1): plt.figure() plt.axvline(x=0, color="grey", zorder=0) plt.axhline(y=0, color="grey", zorder=0)for i inrange(len(vecs)):# El origen de los vectores inicia en el punto (0,0) x = np.concatenate([[0,0], vecs[i]]) plt.quiver([x[0]],[x[1]],[x[2]],[x[3]], angles='xy', scale_units='xy', scale=1, color=cols[i], alpha=alpha)graficarVectores([v1,v2],['orange','blue'])# Definimos los limitesplt.xlim(-1,8)plt.ylim(-1,8)
Recuerda que a veces es muy buena idea y practica colocar funciones que vamos a llamar reiterada veces en otra jupyter notebook para esto colocamos lo anterior el anterior codigo en una carpeta de funciones importantes y le pondremos de nombre a la notebook graficarVectores.
# Llamos a la funcion de otra notebook a nuestro hilo principal de la sgte manera:# colocamos el directorio de la notebook a la que vamos a llamar.%run "./funcionesImportante/graficarVectores.ipynb"# Luego ejecutamos la ultima linea de codigo, que grafica la funcion para comprobar que se# ha realizado correctamente.graficarVectores([v1,v2],['orange','blue'])plt.xlim(-1,8)plt.ylim(-1,8)
Si deseas plotting de varias funciones en una sola ventana pero de forma separadas, te paso este sencillo ejemplo:
import matplotlib.pyplotas plt
x = np.arange(1,100,0.2)y1 = np.sin(x)y2 = x **2+2* x
y3 = np.log(x)y4 = x +2ax1 = plt.subplot(221) # (rows|columns|index)ax2 = plt.subplot(222)ax3 = plt.subplot(223)ax4 = plt.subplot(224)ax1.plot(x,y1)ax2.plot(x,y2,'y--')ax3.plot(x,y3,'r')ax4.plot(x,y4,'g')plt.tight_layout()plt.show()
Me gustaría que se explique lo que hace cada método, como por ejemplo plt.quiver, por todo lo demás, excelente clase! :D
¡Hola! Puedes conseguir más información aquí. Pero en general la función sirve para gráficar flechas.
Los primeros parámetros son las coordenadas de iniciox[0], x[1] y dos siguientes las x[2], x[3]coordenadas de fin (muestran la dirección).
Las de inicio las son [0,0], que fue lo que hizo con el np.concatenate([[0,0], vecs[i]]) . Saludos ✌️
si no quedo claro los parametros de plt.quiver despues de las coordenadas, que 'xy' , scale=1
Desde Colab hice estos pasos:
En la parte derecha le di clic a "files" y se abrió esa barra lateral.
Clic en "Mount Drive" (antes al hacer esto salían unas líneas de código, ahora ya no aparecen).
Me apareció la carpeta de Drive y ahí busqué el archivo graficarVectores.ipynb.
En los 3 puntitos le di a "Copy path".
Puse esa dirección después de %run. Y ya funcionó.
Sé que suena algo engorroso, pero en realidad es super sencillo y no toma casi nada de tiempo hacerlo.
Me sirvió bastante,gracias Anthony
Adjunto para mejor interpretación
Excelente clase.
La linea de %run para usuarios linux como yo quedaria de esta manera:
Si te arroja es el siguiente error al llamar la función externa:
Error: No module named nbformat
la solución es instalar nbformat en el ambiente virtual
Gracias!!!!
Hi people's, les comparto como graficar con pyplot de forma rápida varias funciones en un solo plot:
import numpy as np
import matplotlib.pyplotas plt
x = np.arange(-100,101,1) # Array x
y1 =25* x **2-2* x # y1 =0.5x²+2x
y2 =((0.5* x **2)// 2 * x) # y2 = ½x²/2xy3 = np.sin(0.25* x)*250000 # y3= 250K sin(¼x)#================================================plt.plot(x,y1,'r.')plt.plot(x,y2,'b--')plt.plot(x,y3,'y')plt.show()
que diferencia hay entre matplotlib inline y matplotlib notebook?
Hola
La diferencia básica es que inline muestra las graficas como una imagen estatica, y notebook muestra las graficas un poco mas interactivas.
Con notebook incluso puedes hacer zoom a la grafica, o alejarla, incluso guardarla, ademas que te indica en que posicion (x,y) se encuentra el puntero
Adjunto imagen del uso de %matplotlib notebook
¿por qué utiliza los x del "0" al "3"? ¿cómo puedo entenderlo?
AttributeError: 'Line2D' object has no property 'x'
me sale eso cuando quiero graficar
Verifica que tu objeto Line2D tiene una propiedad llama x.
alguien me puede decir porfavor como solucionar este error?
les dejo una ligera modificación para que las dimensiones de la gráfica sean automáticas.
Vamos a hacer una función que grafique vectores
def graficavectores(vectores,colores,alpha=1):
#Se determina el área de la gráfica
plt.figure()
# se dibijan los ejems
plt.axvline(x=0,color="grey",zorder=0)
plt.axhline(y=0,color="grey",zorder=0)
min_x =0max_x =0min_y =0max_y =0for m inrange(len(vectores)): min_x =min(vectores[m][0],min_x) max_x =max(vectores[m][0],max_x) min_y =min(vectores[m][1],min_y) max_y =max(vectores[m][1],max_y)plt.xlim(min_x-1,max_x+1)plt.ylim(min_y-1,max_y+1)for n inrange(len(vectores)): x = np.concatenate([[0,0],vectores[n]]) plt.quiver([x[0]],[x[1]],[x[2]],[x[3]], angles='xy',scale_units='xy',scale=1, color=colores[n], alpha=alpha)
¿qué significa el 'plt.quiver()' ? :(
Es para que el gráfico tenga las flechas de los vectores, en general se usa esa extensión para hacer campos vectoriales representados con flechitas o en este caso vectores
graciaas
No entiendo por qué esto no funciona:
%run './aux_functions/plot_vectors.ipynb'
En vez de '..//aux_functions/plot_vectors.ipynb'