lunes, 20 de febrero de 2023

Cómo graficar una función de una variable con Python - Seno Coseno

 

Cómo graficar una función de una variable con Python



Esta pequeña publicación es un aperitivo para una sucesión de publicaciones en donde desarrollaré todos los métodos de graficación en Python, tanto 2D como 3D y algunas alternativas para dimensiones mayores.

Observación: Debes tener instalado matplotlib. Si tienes dudas sobre como instalarlo, puedes dejar un comentario, sin embargo, si eres un usuario de Debian (Ubuntu, Linux Mint, etc) o distribuciones parecidas, puedes buscarlo en synaptic o usar apt-get.

El código en cuestión es:
import numpy as np
import matplotlib.pyplot as plt

x=np.arange(0,10,0.1)
y=2*np.sin(4*x)-x**2+10*x  #f(x)=2sin(4x)-x^2+10x
plt.plot(x,y)
plt.show()

Puedes usar la librería math en lugar de numpy para utilizar la función seno, y en general para cualquier otra función, con lo que el código sería:

import math
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,0.1)
y=2*math.sin(4*x)-x**2+10*x  #f(x)=2sin(4x)-x^2+10x
plt.plot(x,y)
plt.show()

Finalmente el resultado es:


Nota final: Preferí colocar una función mas interesante que la eterna parábola que aparece en todo manual de graficación. Te invito a jugar con este código simple, seguro lograrás hacer cosas mejores.

Si te ha gustado este artículo, coméntalo, si quieres mas información, pídela. Tu tienes completo control sobre los contenidos de este blog.

viernes, 17 de febrero de 2023

Python dibuja el gráfico de la función seno y coseno

 https://programmerclick.com/article/19721105537/


Python dibuja el gráfico de la función seno y coseno

Número público: tiempo de programación de Python

Hoy planeo dibujar las funciones de seno y coseno, comenzando desde la configuración predeterminada, y ajustarla y mejorarla paso a paso para que se vea bien, como la imagen que aprendimos en la escuela media y secundaria. A través de este proceso, aprenda a ajustar algunos elementos del gráfico.

01. Dibujo simple

matplotlib tiene un conjunto de configuraciones predeterminadas que permiten la personalización de varias propiedades. Puede controlar casi todas las propiedades predeterminadas en matplotlib: tamaño de imagen, puntos por pulgada, ancho de línea, color y estilo, ejes, propiedades de eje y cuadrícula, propiedades de texto y fuente, etc.

Aunque la configuración predeterminada de matplotlib es bastante buena en la mayoría de los casos, es posible que desee cambiar algunas propiedades en algunas situaciones especiales.

  1. from pylab import *
  2. x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
  3. C,S = np.cos(x), np.sin(x)
  4. plot(x,C)
  5. plot(x,S)
  6. show()
  7. Copiar codigo

show image

02. Establecer elementos básicos

Aquí hay varios elementos básicos:

  1. Color, grosor y tipo de línea de la línea
  2. Escalar y etiquetar
  3. Y leyenda

El código es relativamente simple y básicamente lo cubrí en mi primera conferencia.

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. plt.figure(figsize=(10,6), dpi=80)
  4. x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
  5. C,S = np.cos(x), np.sin(x)
  6. # Establecer el color, grosor y estilo de línea de la línea
  7. plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')
  8. plt.plot(x, S, color="red", linewidth=2.5, linestyle="-", label=r'$cos(x)$')
  9. # Si cree que la línea está demasiado cerca del borde, puede aumentar la distancia
  10. plt.xlim(x.min()*1.2, x.max()*1.2)
  11. plt.ylim(C.min()*1.2, C.max()*1.2)
  12. # La escala actual no está clara, debe reiniciarse y agregar etiquetas más intuitivas
  13. plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
  14. [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
  15. plt.yticks([-1,0,1],
  16. [r'$-1$', r'$0$', r'$1$'])
  17. # Agregar leyenda
  18. plt.legend()
  19. plt.show()
  20. Copiar codigo

show image

03. Mover el eje

Recuerda la imagen de la función trigonométrica que aprendimos en la escuela media y secundaria, pero no es así, debería tener cuatro cuadrantes. Pero aquí hay una tabla cuadrada.

A continuación, lo que tenemos que hacer es mover el eje para que nos parezca familiar.

Solo necesitamos dos ejes (ejes xey), por lo que debemos ocultar los ejes superior y derecho (el color se establece en Ninguno).

  1. # plt.gca (), el nombre completo es obtener eje actual
  2. ax = plt.gca()
  3. ax.spines['right'].set_color('none')
  4. ax.spines['top'].set_color('none')
  5. # Dado que estamos moviendo los ejes izquierdo e inferior, no necesitamos configurar estos dos.
  6. ax.xaxis.set_ticks_position('bottom')
  7. ax.yaxis.set_ticks_position('left')
  8. # Especifique el tipo de datos, es decir, muévase al valor especificado
  9. ax.spines['bottom'].set_position(('data',0))
  10. ax.spines['left'].set_position(('data',0))
  11. Copiar codigo

enset_position()¿Qué significan los datos en esta función? Revisé el sitio web oficial. La explicación es la siguiente

Luego finalmente descubrí que la escritura anterior se puede configurar de una manera más concisa y es equivalente.

  1. ax.spines['bottom'].set_position('zero')
  2. ax.spines['left'].set_position('zero')
  3. Copiar codigo

show image

04. Agregar notas

Ahora que se ha formado la parte gráfica, usemos el comando anotar para anotar algunos puntos de interés.

Nosotros elegimos2π/3Como valores de seno y coseno queremos anotar. Haremos una marca y una línea de puntos vertical en la curva. Luego, use el comando anotar para mostrar una flecha y algo de texto.

  1. t = 2*np.pi/3
  2. # Utilice plt.plot para dibujar una línea vertical hacia abajo y plt.scatter para dibujar un punto.
  3. plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
  4. plt.scatter([t,],[np.cos(t),], 50, color ='blue')
  5. plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
  6. xy=(t, np.sin(t)), xycoords='data',
  7. xytext=(+10, +30), textcoords='offset points', fontsize=16,
  8. arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
  9. # Utilice plt.plot para dibujar una línea vertical hacia arriba y plt.scatter para dibujar un punto.
  10. plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
  11. plt.scatter([t,],[np.sin(t),], 50, color ='red')
  12. plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
  13. xy=(t, np.cos(t)), xycoords='data',
  14. xytext=(-90, -50), textcoords='offset points', fontsize=16,
  15. arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
  16. Copiar codigo

Aquí, podrías estarplt.annotateEl uso de esta función es extraño. Explique aquí también.

El primer parámetro es el contenido del comentario; El segundo parámetro,xy, Es comentar sobre qué punto; El tercer parámetro,xycoords, Especifique el tipo, datos significa posicionamiento basado en el valor; El cuarto parámetro,xytext, Es la posición del comentario, combinada con el quinto parámetro, la posición del comentario se determina según el desplazamiento; El quinto parámetro,textcoords, El valor son puntos de compensación, es decir, posición relativa; El sexto parámetro,fontsize, Tamaño del comentario; el séptimo parámetro,arrowprops, Algunos ajustes para el tipo de flecha.

show image

05. Código completo

Lo anterior es una explicación del código del fragmento, aquí está el código completo

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. plt.figure(figsize=(10,6), dpi=80)
  4. x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
  5. C,S = np.cos(x), np.sin(x)
  6. # Establecer el color, grosor y estilo de línea de la línea
  7. plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')
  8. plt.plot(x, S, color="red", linewidth=2.5, linestyle="-", label=r'$cos(x)$')
  9. # Si cree que la línea está demasiado cerca del borde, puede aumentar la distancia
  10. plt.xlim(x.min()*1.2, x.max()*1.2)
  11. plt.ylim(C.min()*1.2, C.max()*1.2)
  12. # La escala actual no está clara, debe reiniciarse y agregar etiquetas más intuitivas
  13. plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
  14. [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
  15. plt.yticks([-1,1],
  16. [r'$-1$', r'$1$'])
  17. # Agregar leyenda
  18. plt.legend(loc='upper left')
  19. # plt.gca (), el nombre completo es obtener eje actual
  20. ax = plt.gca()
  21. ax.spines['right'].set_color('none')
  22. ax.spines['top'].set_color('none')
  23. # Dado que estamos moviendo los ejes izquierdo e inferior, no necesitamos configurar estos dos.
  24. ax.xaxis.set_ticks_position('bottom')
  25. ax.yaxis.set_ticks_position('left')
  26. # Especifique el tipo de datos, es decir, muévase al valor especificado
  27. # ax.spines['bottom'].set_position('zero')
  28. ax.spines['bottom'].set_position(('data',0))
  29. ax.spines['left'].set_position(('data',0))
  30. t = 2*np.pi/3
  31. # Utilice plt.plot para dibujar una línea vertical hacia abajo y plt.scatter para dibujar un punto.
  32. plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
  33. plt.scatter([t,],[np.cos(t),], 50, color ='blue')
  34. plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
  35. xy=(t, np.sin(t)), xycoords='data',
  36. xytext=(+10, +30), textcoords='offset points', fontsize=16,
  37. arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
  38. # Utilice plt.plot para dibujar una línea vertical hacia arriba y plt.scatter para dibujar un punto.
  39. plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
  40. plt.scatter([t,],[np.sin(t),], 50, color ='red')
  41. plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
  42. xy=(t, np.cos(t)), xycoords='data',
  43. xytext=(-90, -50), textcoords='offset points', fontsize=16,
  44. arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
  45. plt.show()