2017-04-09 4 views
0

matplotlib에서 조각 별 함수를 그리려합니다. (아미의 대답 here을 기반으로) 내 필터링 방식은 작동하지 않습니다파이썬에서 조각 별 함수를 그릴 것

ValueError: x and y must have same first dimension

당신이 문제를하시기 바랍니다 고칠 수?

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]에 각각 플롯되어야합니다.

이것은 내가 필요로하는 것입니다 : 당신은 return np.zeros_like(t)으로 모두 my_formulareturn 0my_formula1를 교체해야

enter image description here

+0

업데이트의 플롯이 예상되는 출력입니까? 그렇다면 나는 왜 당신이 파란색 곡선에 대해서'np.all'과'return 0'을 사용하는지 (t> 5에서 0이되지 않음) 얻지 못한다. 오류 메시지 수정 이외에 원하는 것을 자세하게 지정하십시오. – Michael

+0

@ 마이클 : 네가 맞아. 내 코드의 논리는 예상 한 것과 다릅니다. 나는 당신이 친절하게 그것을 확인한다면, 내가 필요한 것을 설명하기 위해 스케치를 추가했다. – Roboticist

+1

좋아, * 원 * 커브를 원해. 나는 지금 그것을 얻는다라고 생각한다. 나는 그것을 시도한 다음 내 대답을 편집 할 것입니다. – Michael

답변

1

.

plt.plot은 동일한 모양의 배열을 필요로합니다. 입력 데이터가 np.arange(0,5,0.1) 인 경우 항상 해당 케이스 return 0int에 도달합니다. 원하는 경우 모양이 (1,) 인 배열로 생각할 수 있습니다 (정확히 말하면 0.shape을 시도하면 오류가 발생 함). 그런 다음 50 개의 x 값으로 하나의 y 값을 그려 봅니다. 비록 당신이 논리적 인 것처럼 보일지 모르지만, 항상 똑같은 y 값을 취하는 것은 논할 수 없습니다. 이것은 plt.plot이 작동하는 방식이 아닙니다. np.zeros_like(t)을 사용할 때 50 개의 0 항목이있는 배열을 얻고 plt.plot은 무엇을 그릴지를 알고 있습니다.


편집

업데이트에 따르면,이 함께했다 :

특정 t-값에 적용되는 공식은 부울 배열 (t>=0)*(t<5)(t>=5)*(t<=10)로 결정

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)) 
. float 배열로 곱하면 False의 경우 0으로, True의 경우 1으로 캐스팅되므로 적용된 t- 범위는 항상 올바른 수식입니다. 또한 수식에서 뭔가를 변경했습니다. < = t < = 10 : 예상 출력처럼 보이게하려면 지수 함수를 이동해야했습니다. np.exp(-t/tauN1))np.exp(-(t-5)/tauN1))으로 바뀌 었습니다.

+0

감사합니다. 제 업데이트를 좀 보시 겠어요? 필터링 방식은 전혀 작동하지 않습니다. – Roboticist

+0

미리 도움을 주셔서 감사합니다. – Roboticist

관련 문제