在python中绘制分段函数

时间:2017-04-09 07:22:47

标签: matplotlib

我正在尝试在matplotlib中绘制一个分段函数。我的过滤方法(基于Ami的答案here)不起作用:

  

ValueError:x和y必须具有相同的第一维

请问你能解决这个问题吗?

import numpy as np
import matplotlib.pyplot as plt

gK_inf = 7.06
gK_0 = 0.09
tauN = 0.75

gK_inf1 = 0.09
gK_01 = 7.06
tauN1 = 1.1

def graph(formula, formula1, t_range):  
    t = np.fromiter(t_range, np.float)
    gK = formula(t)
    gK1 = formula1(t)
    plt.plot(t,gK)
    plt.plot(t,gK1)
    plt.xlabel(r"$t(msec.)$")
    plt.ylabel(r"$g_K$")
    plt.show()  

def my_formula(t):
    if np.all(t>0) and np.all(t<5):
        return np.power((np.power(gK_inf,0.25))-((np.power(gK_inf,0.25)-np.power(gK_0,0.25))*np.exp(-t/tauN)),4)
    else:
        return 0

def my_formula1(t):
    if np.all(t>5) and np.all(t<10):
        return np.power((np.power(gK_inf1,0.25))-((np.power(gK_inf1,0.25)-np.power(gK_01,0.25))*np.exp(-t/tauN1)),4)
    else:
        return 0

graph(my_formula, my_formula1, np.arange(0,10,0.1))

更新

根据@Michael的建议,错误已被删除,但结果并非如此:

enter image description here

实际上,formulaformula1必须分别在范围[0,5][5,10]中绘制。

这就是我需要的:

enter image description here

1 个答案:

答案 0 :(得分:1)

您应该用obj替换return 0my_formula中的my_formula1

return np.zeros_like(t)需要相同形状的数组。根据您的输入数据plt.plot,您始终会遇到np.arange(0,5,0.1) return 0的情况。如果你想要,你可以把它想象成一个形状为int的数组(严格来说,这不是真的,如果你尝试(1,)就会出现错误)。然后,您尝试绘制一个具有50个x值的y值。即使你总是采用相同的y值似乎合乎逻辑,但这并不是0.shape的工作原理。当您使用plt.plot时,您将获得一个包含50个零条目的数组,np.zeros_like(t)知道要绘制的内容。

修改

根据更新,我想出了这个:

plt.plot

应用于某个t值的公式由布尔数组import numpy as np import matplotlib.pyplot as plt gK_inf = 7.06 gK_0 = 0.09 tauN = 0.75 gK_inf1 = 0.09 gK_01 = 7.06 tauN1 = 1.1 def graph(formula, t_range): t = np.fromiter(t_range, np.float) gK = formula(t) plt.plot(t,gK) plt.xlabel(r"$t(msec.)$") plt.ylabel(r"$g_K$") plt.show() def my_formula(t): result = np.power((np.power(gK_inf,0.25))-((np.power(gK_inf,0.25)-np.power(gK_0,0.25))*np.exp(-t/tauN)),4) *(t>=0)*(t<5) result += np.power((np.power(gK_inf1,0.25))-((np.power(gK_inf1,0.25)-np.power(gK_01,0.25))*np.exp(-(t-5)/tauN1)),4) *(t>=5)*(t<=10) return result graph(my_formula, np.arange(0.0,12,0.1)) (t>=0)*(t<5)决定。当它们与浮点数组相乘时,它们将(t>=5)*(t<=10)投射到0False投射到1,因此它始终是应用的t范围的正确公式。我也在公式中改变了5&lt; = t&lt; = 10:为了使它看起来像你的预期输出,我不得不改变指数函数:True被替换为np.exp(-t/tauN1))