我正在尝试在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的建议,错误已被删除,但结果并非如此:
实际上,formula
和formula1
必须分别在范围[0,5]
和[5,10]
中绘制。
这就是我需要的:
答案 0 :(得分:1)
您应该用obj
替换return 0
和my_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)
投射到0
,False
投射到1
,因此它始终是应用的t范围的正确公式。我也在公式中改变了5&lt; = t&lt; = 10:为了使它看起来像你的预期输出,我不得不改变指数函数:True
被替换为np.exp(-t/tauN1))
。