如何在 Jupyter Notebook 中添加交互式绘图?

我已经为基本 SIR 模型绘制了一个图。我对我的情节很满意,但是,我希望能够有一个交互式滑块来调整我的参数 beta 和 gamma。我希望它们的范围都在 0 到 1 之间,并且用户能够将它们递增 0.01。


有人可以帮我在我的代码中实现这个吗?感谢您提前抽出时间。


这是我的代码:


# # Solving SIR Model in Python (INTERACTIVE)


# \

# Importing packages:


# In[10]:



# Display in LaTeX style.

from sympy.interactive import printing

printing.init_printing(use_latex = True)


# For integration.

import scipy.integrate 


# For arrays (Python does not have native arrays).

import numpy as np


# For graphing.

import matplotlib.pyplot as plt 


# Prevents the pop-up graphs in a separate window.

get_ipython().run_line_magic('matplotlib', 'inline')


# Allows for an interactive widget bar.

from ipywidgets import interactive 



# \

# Defining differential equations:


# In[11]:



def SIR_model(y, t, beta, gamma):

    S, I, R = y

    

    dS_dt = -beta*S*I

    dI_dt = beta*S*I - gamma*I

    dR_dt = gamma*I

    

    return([dS_dt, dI_dt, dR_dt,])



# \

# Defining initial conditions:


# In[12]:



S0 = 0.95

I0 = 0.05

R0 = 0.0


beta = 0.35

gamma = 0.1



# \

# Defining time vector:


# In[13]:



# Graph from 0 to 100, include 10000 points.

t = np.linspace(0, 100, 10000) 



# \

# Defining solution:


# In[14]:



# Result

solution = scipy.integrate.odeint(SIR_model, [S0, I0, R0], t, args=(beta, gamma))

solution = np.array(solution)



# \

# Plotting the result:


# In[20]:



plt.figure(figsize=[8, 5])


plt.plot(t, solution[:, 0], label="S(t)")

plt.plot(t, solution[:, 1], label="I(t)")

plt.plot(t, solution[:, 2], label="R(t)")


plt.grid()

plt.legend()


plt.title("SIR Model")

plt.xlabel("Time")

plt.ylabel("Proportions of Populations")


# THIS DOES NOT WORK !!!

#interactive_plot = interactive(SIR_model, betta=(0.35,1,0.01), gamma=(0.1,1,0.01))

#interactive_plot


plt.show()


这是输出。

http://img.mukewang.com/63f5cc7f0001874604940329.jpg

呼唤远方
浏览 237回答 1
1回答

皈依舞

您需要创建一个函数来一次性处理输入、积分和绘图 ( sir_interactive_func),见下文:# For integration.import scipy.integrate # For arrays (Python does not have native arrays).import numpy as np# For graphing.import matplotlib.pyplot as plt # Prevents the pop-up graphs in a separate window.get_ipython().run_line_magic('matplotlib', 'inline')# Allows for an interactive widget bar.from ipywidgets import interactive S0 = 0.95I0 = 0.05R0 = 0.0def SIR_model(y, t, beta, gamma):    S, I, R = y        dS_dt = -beta*S*I    dI_dt = beta*S*I - gamma*I    dR_dt = gamma*I        return([dS_dt, dI_dt, dR_dt,])    def sir_interactive_func(beta, gamma):        # Graph from 0 to 100, include 10000 points.    t = np.linspace(0, 100, 10000)         solution = scipy.integrate.odeint(SIR_model, [S0, I0, R0], t, args=(beta, gamma))    solution = np.array(solution)    plt.figure(figsize=[8, 5])    plt.plot(t, solution[:, 0], label="S(t)")    plt.plot(t, solution[:, 1], label="I(t)")    plt.plot(t, solution[:, 2], label="R(t)")    plt.grid()    plt.legend()    plt.title("SIR Model")    plt.xlabel("Time")    plt.ylabel("Proportions of Populations")    interactive_plot = interactive(sir_interactive_func, beta=(0.35,1,0.01), gamma=(0.1,1,0.01))interactive_plot
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python