Python 使用matplotlib和numpy绘制方程式
我想画一个等式,Python 使用matplotlib和numpy绘制方程式,python,python-3.x,numpy,matplotlib,Python,Python 3.x,Numpy,Matplotlib,我想画一个等式,x轴表示时间t,y轴表示变量n。现在,n的公式是n=((np.log(t)*10**6)/np.log(2))+1,我的图表上的最大时间是自大爆炸理论以来的时间,单位为秒,即4.35 x 10**17秒 我试过这个: import matplotlib.pyplot as plt import numpy as np def graph(formula, x_range): y = np.array(x_range) x = eval(formula)
x
轴表示时间t
,y
轴表示变量n
。现在,n
的公式是n=((np.log(t)*10**6)/np.log(2))+1
,我的图表上的最大时间是自大爆炸理论以来的时间,单位为秒,即4.35 x 10**17秒
我试过这个:
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 ))
这似乎不起作用。关于如何实现这一点,有什么想法吗?这里有几个问题:
- 范围应定义为整数上的李>
- 该范围将生成的项目数量太大,您必须采取巨大的步骤
李>
- 该公式将
x
作为变量,但您似乎在y
中定义了np.array(x_范围)
;更重要的是
- 您使用
eval(…)
,但eval(…)
通常是一个字符串或另一个可以解析的对象李>
- 您没有给
graph(..)
一个公式作为第一个元素:在Python调用graph(..)
之前,它首先计算操作数
在我看来,实现这一点的最佳方法是使用lambda表达式:
导入matplotlib.pyplot作为plt
将numpy作为np导入
def图(公式,x_范围):
x=np.数组(x_范围)
#^使用x作为范围变量
y=公式(x)
#^^使用x调用lambda表达式
#|使用y作为函数结果
平面图(x,y)
plt.show()
图(λx:((np.log(x)*10**6)/np.log(2))+1,范围(0435*10**15,10**12))
#^使用lambda表达式^整数范围
#迈出巨大的步伐
这将生成以下图像:
编辑:
根据您希望y轴上的时间和x轴上的函数的注释,只需将分配给其他变量,如:
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))
导入matplotlib.pyplot作为plt
将numpy作为np导入
def图(公式,x_范围):
y=np.数组(x_范围)
x=公式(y)
平面图(x,y)
plt.show()
图(λx:((np.log(x)*10**6)/np.log(2))+1,范围(0435*10**15,10**12))
请注意,您不需要更改lambda表达式中变量的名称:实际上,当您调用lambda表达式时,本地x
将只是调用者的y
。eval
在字符串上工作。尽管如此,它还是不被认为是非常优雅的。自从大爆炸理论以来,现在的时间最长为90000秒。大爆炸后的时间可能要大得多。我意识到时间t
在y
轴上可能更有意义。您如何翻转它,使时间位于y
轴上,而n位于x
轴上。@WasswaSamuel:在函数的赋值中,只需重命名x
,y
和y
x
。将编辑答案。
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))