Matplotlib Python小部件滑块错误地更新了绘图

时间:2020-04-17 07:35:21

标签: python numpy matplotlib widget slider

作为物理学家,我对此编程问题感到困惑。对我来说,代码看起来不错,但是我显然遗漏了一些东西。 在初始绘图时,曲线就很好。一旦我触摸滑块,它们都会跳到一些奇怪的形状,就像滑块上的参数完全不同一样。任何想法?谢谢!

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
plt.style.use('seaborn-whitegrid')

# Initial values
Tmin_init = 10
Tmax_init = 350
Tmax = Tmax_init
Tmin = Tmin_init
tR0 = .6765
ANR = 1.5
dE = 2257
hv = 257
sigma = .01

fig = plt.figure(figsize=(12,8))

T = np.arange(Tmin_init, Tmax_init, 2)

# Prep functions
h = hv/(1.39*T)
ex = np.exp(dE/(.695*T))
tgh = np.tanh(h)
sh = np.sinh(h)

# Initial functions
tau = tR0/(tR0*ANR*1E5/ex + 1/tgh)
Sa = ex*tR0*(2E5*ANR*dE*tR0 + ex*hv/np.power(sh,2))/(1.39*np.power(T,2)*np.power(1E5*ANR*tR0 + ex/tgh,2))
Sr = 100*Sa/tau
dT = sigma/Sa

# Define subplots
a1 = plt.subplot(2,2,1)
a2 = plt.subplot(2,2,2)
a3 = plt.subplot(2,2,3)
a4 = plt.subplot(2,2,4)

# ylabels
a1.set_ylabel(r'$\tau \,[ms]$')
a2.set_ylabel(r'$S_a \,[K^{-1}]$')
a3.set_ylabel(r'$S_r \,[\%K^{-1}]$')
a4.set_ylabel(r'$\Delta T \,[K]$')

#Line plots
l1, = a1.plot(T, tau, lw=2)
l2, = a2.plot(T, Sa, lw=2)
l3, = a3.plot(T, Sr, lw=2)
l4, = a4.plot(T, dT, lw=2)

a4.set_ylim(0,10) # had to, it goes to infty at low T

# Set axes dimensions and positions
ax1 = plt.axes([0.1, 0.10, 0.50, 0.01])
ax2 = plt.axes([0.1, 0.08, 0.50, 0.01])
ax3 = plt.axes([0.1, 0.06, 0.50, 0.01])
ax4 = plt.axes([0.1, 0.04, 0.50, 0.01])
ax5 = plt.axes([0.1, 0.02, 0.50, 0.01])
ax6 = plt.axes([0.7, 0.08, 0.2, 0.02])
ax7 = plt.axes([0.7, 0.04, 0.2, 0.02])

# Slider
slider1 = Slider(ax1, r'$\tau_R(0) \, [ms]$', 0, 10, valinit=tR0)
slider2 = Slider(ax2, r'$h\nu \, [cm^{-1}]$', 0, 100, valinit=24)
slider3 = Slider(ax3, r'$\tau_{NR}^{-1} x 10^{-8} \, [s^{-1}]$', 0, 10, valinit=ANR)
slider4 = Slider(ax4, r'$\Delta E \, [cm^{-1}]$', 0, 5000, valinit=dE)
slider5 = Slider(ax5, r'$\sigma$', 0, .1, valinit=sigma)
slider6 = Slider(ax6, r'$T_{min}$', 4, Tmax_init-10, valinit=Tmin_init)
slider7 = Slider(ax7, r'$T_{max}$', Tmin_init+10, 2000, valinit=Tmax_init)

def update(val):
    # get values from sliders
    tR0 = slider1.val
    hv = slider2.val
    ANR = slider3.val
    dE = slider4.val
    sigma = slider5.val
    Tmin = slider6.val
    Tmax = slider7.val
    # Prep functions
    h = hv/(1.39*T)
    ex = np.exp(dE/(.695*T))
    tgh = np.tanh(h)
    sh = np.sinh(h)
    # Initial functions
    tau = tR0/(tR0*ANR*1E5/ex + 1/tgh)
    Sa = ex*tR0*(2E5*ANR*dE*tR0 + ex*hv/np.power(sh,2))/(1.39*np.power(T,2)*np.power(1E5*ANR*tR0 + ex/tgh,2))
    Sr = 100*Sa/tau
    dT = sigma/Sa
    # update curve
    l1.set_ydata(tau)
    l2.set_ydata(Sa)
    l3.set_ydata(Sr)
    l4.set_ydata(dT)
    # redraw canvas while idle
    fig.canvas.draw_idle()
    # update scales 
    a1.autoscale_view()
    a1.relim()
    a2.autoscale_view()
    a2.relim()
    a3.autoscale_view()
    a3.relim()
    a4.autoscale_view()
    a4.relim()

# call update function on slider or textbox value change
slider1.on_changed(update)
slider2.on_changed(update)
slider3.on_changed(update)
slider4.on_changed(update)
slider5.on_changed(update)
slider6.on_changed(update)
slider7.on_changed(update)

plt.subplots_adjust(top=1, bottom=0.2, left=0.10, right=0.95, hspace=0.25, wspace=0.35)
plt.show()

1 个答案:

答案 0 :(得分:0)

经过数小时的观察后解决了,我发现滑块限制设置为100而不是1000。

相关问题