Graficando una ecuación con matplotlib

Estoy tratando de hacer una función que graficará cualquier fórmula que le diga.

import numpy as np import matplotlib.pyplot as plt def graph(formula, x_range): x = np.array(x_range) y = formula plt.plot(x, y) plt.show() 

Cuando trato de llamarlo sucede el siguiente error, creo que está tratando de hacer la multiplicación antes de que llegue a y = formula .

 graph(x**3+2*x-4, range(-10, 11)) Traceback (most recent call last): File "", line 1, in  graph(x**3+2*x-4, range(-10, 11)) NameError: name 'x' is not defined 

Esto es porque en linea

 graph(x**3+2*x-4, range(-10, 11)) 

x no está definido.

La forma más fácil es pasar la función que desea trazar como una cadena y usar eval para evaluarla como una expresión.

Así tu código con modificaciones mínimas será

 import numpy as np import matplotlib.pyplot as plt def graph(formula, x_range): x = np.array(x_range) y = eval(formula) plt.plot(x, y) plt.show() 

y puedes llamarlo como

 graph('x**3+2*x-4', range(-10, 11)) 

Su suposición es correcta: el código está tratando de evaluar x**3+2*x-4 inmediatamente. Desafortunadamente no puedes evitar que lo haga. La buena noticia es que en Python, las funciones son objetos de primera clase, por lo que quiero decir que se pueden tratar como cualquier otra variable. Así que para arreglar su función, podríamos hacer:

 import numpy as np import matplotlib.pyplot as plt def graph(formula, x_range): x = np.array(x_range) y = formula(x) # <- note now we're calling the function 'formula' with x plt.plot(x, y) plt.show() def my_formula(x): return x**3+2*x-4 graph(my_formula, range(-10, 11)) 

Si quisiera hacerlo todo en una línea, podría usar lo que se llama una función lambda , que es solo una función corta sin un nombre donde no usa def o return :

 graph(lambda x: x**3+2*x-4, range(-10, 11)) 

Y en lugar de range , puede mirar np.arange (que permite incrementos no enteros), y np.linspace , que le permite especificar el inicio, la detención y la cantidad de puntos a usar.

Para trazar una ecuación que no se resuelve para una variable específica (como círculo o hipérbola):

 import numpy as np import matplotlib.pyplot as plt plt.figure() # Create a new figure window xlist = np.linspace(-2.0, 2.0, 100) # Create 1-D arrays for x,y dimensions ylist = np.linspace(-2.0, 2.0, 100) X,Y = np.meshgrid(xlist, ylist) # Create 2-D grid xlist,ylist values F = X**2 + Y**2 - 1 # 'Circle Equation plt.contour(X, Y, F, [0], colors = 'k', linestyles = 'solid') plt.show() 

Más sobre esto: http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf