我想绘制一个等式,其中x
轴代表时间t
,y
轴代表变量n
。现在n
的公式为n =((np.log(t)*10**6)/np.log(2)) + 1
,我的图表上的最长时间是大爆炸理论的时间,以秒为单位4.35 x 10**17 seconds
。
我试过了:
import matplotlib.pyplot as plt
import numpy as np
def graph(formula, x_range):
y = np.array(x_range)
x = eval(formula)
plt.plot(x,y)
plt.show()
graph(((np.log(x)*10**6)/np.log(2)) + 1, range(0, 4.35*10**17 ))
似乎不起作用。关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
这里有几个问题:
x
作为变量,但您似乎在np.array(x_range)
中定义了y
;更重要的是eval(..)
,但eval(..)
通常是字符串或其他可以解析的对象; graph(..)
一个公式作为第一个元素:在Python调用graph(..)
之前,首先评估操作数。在我看来,实现这一目标的最佳方法是使用 lambda-expression :
import matplotlib.pyplot as plt
import numpy as np
def graph(formula, x_range):
x = np.array(x_range)
#^ use x as range variable
y = formula(x)
#^ ^call the lambda expression with x
#| use y as function result
plt.plot(x,y)
plt.show()
graph(lambda x : ((np.log(x)*10**6)/np.log(2)) + 1, range(0, 435*10**15,10**12))
# ^use a lambda expression ^range over integers
# take huge steps
这会生成以下图像:
修改强>:
根据您的评论,您希望时间在 y -axis和 x -axis上的功能,这可以通过分配对其他变量如:
import matplotlib.pyplot as plt
import numpy as np
def graph(formula, x_range):
y = np.array(x_range)
x = formula(y)
plt.plot(x,y)
plt.show()
graph(lambda x : ((np.log(x)*10**6)/np.log(2)) + 1, range(0,435*10**15,10**12))
请注意,您无需更改lambda表达式中变量的名称:实际上,当您调用lambda表达式时, local x
将只是{{调用者的1}}。