Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib-不关闭窗口更新图形_Python_Numpy_Matplotlib - Fatal编程技术网

Python matplotlib-不关闭窗口更新图形

Python matplotlib-不关闭窗口更新图形,python,numpy,matplotlib,Python,Numpy,Matplotlib,这是我到目前为止的代码(使用Anaconda Python 3.4发行版Spyder IDE): 将numpy导入为np 将pylab作为pl导入 导入cmath 从分数进口分数 将matplotlib.offsetbox作为offsetbox导入 #重力 g=9.8 #二次函数 def解算器(k、b、m): #解决方案 α=(-b/(2*m)) sol1=(α+(cmath.sqrt(((b/(2*m))**2)-(k/m))) sol2=(α-(cmath.sqrt(((b/(2*m))**

这是我到目前为止的代码(使用Anaconda Python 3.4发行版Spyder IDE):

将numpy导入为np
将pylab作为pl导入
导入cmath
从分数进口分数
将matplotlib.offsetbox作为offsetbox导入
#重力
g=9.8
#二次函数
def解算器(k、b、m):
#解决方案
α=(-b/(2*m))
sol1=(α+(cmath.sqrt(((b/(2*m))**2)-(k/m)))
sol2=(α-(cmath.sqrt(((b/(2*m))**2)-(k/m)))
#只有两位小数
alpha=“.2f”%alpha.real
alpha=浮动(alpha)
sol1=“%.2f”%sol1.real
sol1=浮动(sol1)
sol2=“%.2f”%sol2.real
sol2=浮动(sol1)
#特解
yp=(g*m)/k
yp=“%.2f”%yp
yp=浮动(yp)
#判别式的计算
如果((b/2*m)**2)>(k/m):
打印(“y=C1*(e^%s*t)+C2*(e^%s*t)+%s”%(sol1,sol2,yp))
t=np.linspace(0,50,10000)
yc=np.exp(sol1*t)+np.exp(sol2*t)
y=yc+yp
plot(t,y,'-g',label=“y=C1*(e^%s*t)+C2*(e^%s*t)+%s”%(sol1,sol2,yp),线宽=2)
a=pl.legend(loc='右上角',prop='size':14})
#额外文本
txt=offsetbox.TextArea(“Sobre amortiguado”)
方框=一个.\u图例\u方框
box.get_children().append(txt)
框。集合图(框。图)
#显示图
pl.show()
elif((b/2*m)**2)==(k/m):
打印(“y=C1*(e^%s*t)+C2*t*(e^%s*t)+%s”%(sol1、sol2、yp))
t=np.linspace(0,50,10000)
yc=np.exp(sol1*t)+t*np.exp(sol2*t)
y=yc+yp
plot(t,y,'-g',label=“y=C1*(e^%s*t)+C2*t*(e^%s*t)+%s”%(sol1,sol2,yp),线宽=2)
a=pl.legend(loc='右上角',prop='size':14})
#额外文本
txt=offsetbox.TextArea(“Criticamente amortiguado”)
方框=一个.\u图例\u方框
box.get_children().append(txt)
框。集合图(框。图)
#显示图
pl.show()
elif((b/2*m)**2)<(k/m):
β=(cmath.sqrt((k/m)-(b/(2*m))**2)))
beta=“%.2f”%beta.real
β=浮动(β)
打印(“y=e^(%s*t)*[C1*cos(%s*t)+C2*sen(%s*t)]+%s“%(α,β,β,yp))
t=np.linspace(0,50,10000)
yc=(np.exp(alpha*t))*(np.cos(beta*t)+np.sin(beta*t))
y=yc+yp
pl.plot(t,y,'-g',label=“y=e^(%s*t)*[C1*cos(%s*t)+C2*sen(%s*t)]+%s”%(alpha,beta,beta,yp),线宽=2)
a=pl.legend(loc='右上角',prop='size':14})
#额外文本
txt=offsetbox.TextArea(“子amortiguado”)
方框=一个.\u图例\u方框
box.get_children().append(txt)
框。集合图(框。图)
#显示图
pl.show()
#端函数定义
#执行
k=浮点(分数(输入(“k:”))
b=浮点(分数(输入(“b:”))
m=浮点(分数(输入(“m:”))
解算器(k,b,m)
我试图做的是首先要求用户输入,然后用解决方案绘制图形;但在此之后,我希望用户能够更改他们的输入,以便图形更新(无需关闭绘图窗口),并查看新输入的新解决方案。我尝试将所有内容都放在while循环中,但是打开图形的pl.show()会阻止进一步的执行,直到窗口关闭

我读过一些关于使用pl.draw()和pl.ion()的文章,但是在尝试了几个小时后,这些都没能起作用,我不确定自己做错了什么

提前感谢您的帮助


编辑:我已经为此工作了一整天,所以我可能不会马上检查答案,但我会在睡觉后检查;希望以后能找到一些好的答案

我认为@Repiklis是对的。要更新打印,最有效的方法是对轴对象使用
set_ydata
方法,如中所述。 在程序运行时(导入后),还需要
pl.ion()

但关键是您必须定义一个允许用户输入更多数据的循环。比如:

while True:
    k = float(Fraction(input("k: ")))
    b = float(Fraction(input("b: ")))
    m = float(Fraction(input("m: ")))       
    solver(k,b,m)

一种更简单的方法是每次清除并绘制数据(否则必须手动重置轴范围)。

我认为这是重复的@雷皮克利斯我在发帖前看到过这个,但没用
while True:
    k = float(Fraction(input("k: ")))
    b = float(Fraction(input("b: ")))
    m = float(Fraction(input("m: ")))       
    solver(k,b,m)