用matplotlib和numpy绘制一个方程式

时间:2017-02-01 21:36:45

标签: python python-3.x numpy matplotlib

我想绘制一个等式,其中x轴代表时间ty轴代表变量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 ))

似乎不起作用。关于如何实现这一目标的任何想法?

1 个答案:

答案 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

这会生成以下图像:

enter image description here

修改

根据您的评论,您希望时间在 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}}。