Python matplotlib-不关闭窗口更新图形
这是我到目前为止的代码(使用Anaconda Python 3.4发行版Spyder IDE):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))**
将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)