绘制方程图

40
我正在尝试创建一个函数,它可以根据我告诉它的任何公式绘制图形。
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()  

当我尝试调用时,会出现以下错误,我相信它是在到达 y = formula 之前尝试进行乘法运算。
graph(x**3+2*x-4, range(-10, 11))

Traceback (most recent call last):  
  File "<pyshell#23>", line 1, in <module>  
    graph(x**3+2*x-4, range(-10, 11))  
NameError: name 'x' is not defined  
3个回答

79
你的猜测是正确的:代码正在尝试立即评估 x**3+2*x-4。不幸的是,你无法真正阻止它这样做。好消息是,在Python中,函数是一等对象,也就是说你可以像对待其他变量一样对待它们。所以为了修复你的函数,我们可以这样做:
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))

enter image description here

如果你想要在一行中完成所有操作,你可以使用所谓的“lambda”函数,它只是一个没有名称的简短函数,你不需要使用“def”或“return”。
graph(lambda x: x**3+2*x-4, range(-10, 11))

而不是使用range,你可以使用np.arange(它允许非整数增量),以及np.linspace,它允许你指定起始点、结束点和使用的点数。

有没有办法将交互式图形以 .html 的形式输出,比如通过 jupyter notebook,我想制作一个可以供人们玩耍的 .html 文件。 - xappppp
这是7年后了,但我仍然希望你能回答。在“graph”函数内,当您键入“y = formula(x)”时,这是如何工作的?在函数内部,公式(它是一个对象吗?)与my_formula相同,因为这是我们给图形参数“formula”的“值”吗?谢谢。 - thenac
@thenac - 你可能已经自己解决了,但正如你所说的那样。这将适用于您定义的任何函数,并将与之匹配:例如,如果my_formula(x)被定义为cos(x),则调用graph(my_formula,...)确实会在您定义的范围特定下产生cos(x)公式的图形。我希望这能满足您的要求。 - Sam

32

这是因为在这一行中

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

x未定义。

最简单的方法是将您要绘制的函数作为字符串传递,并使用eval将其评估为表达式。

因此,您的代码只需进行最少的修改即可:

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()

你可以称之为

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

12
这里根本不需要使用 eval,而且它还增加了额外的开销。 - loopbackbee
谢谢,那个完美地解决了问题。我本来就觉得可能是这样,但不知道如何将其解开。 - Åthenå
为什么使用'eval'是一种不好的做法? - undefined

10

如果要绘制一个未针对特定变量求解的方程(如圆或双曲线):

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()

更多关于它的内容,请参阅:http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接