将不同轴的输出组合到一个图上

Combining outputs with differing axis onto one plot

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import pandas as pd


# Total population, N.
N = 100000
# Initial number of infected and recovered individuals, I0 and R0.
I0, R0 = 10, 0
# Everyone else, S0, is susceptible to infection initially.
S0 = N - I0 - R0
J0 = I0
# Contact rate, beta, and mean recovery rate, gamma, (in 1/days).
#reproductive no. R zero is beta/gamma
beta, gamma = 1.47617188, 1/7
# A grid of time points (in days)
t = np.linspace(0, 77, 77+1)
t1 = [1,2,3,4,5,6,7,8,9,10,11]

# The SIR model differential equations.
def deriv(y, t, N, beta, gamma):
    S, I, R, J = y
    dS = ((-beta * S * I) / N)
    dI = ((beta * S * I) / N) - (gamma * I)
    dR = (gamma * I)
    dJ = ((beta * S * I) / N)
    return dS, dI, dR, dJ

# Initial conditions are S0, I0, R0
# Integrate the SIR equations over the time grid, t.
solve = odeint(deriv, (S0, I0, R0, J0), t, args=(N, beta, gamma))
S, I, R, J = solve.T

d = {'Week': [1, 2,3,4,5,6,7,8,9,10,11], 'incidence': [206.1705794,2813.420201,11827.9453,30497.58655,10757.66954,7071.878779,3046.752723,1314.222882,765.9763902,201.3800578,109.8982006]}
df = pd.DataFrame(data=d)


J_diff = J[1:] - J[:-1]
J_diff = np.diff(J)
fig = plt.figure(facecolor='w')
ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True)
ax.plot(t1, df, 'blue', alpha=1, lw=2, label='Daily incidence')
ax.set_xlabel('Time in days')
ax.set_ylabel('Number')
ax.grid(b=True, which='major', c='w', lw=2, ls='-')
legend = ax.legend()
legend.get_frame().set_alpha(0.5)
plt.show()

上面的代码生成 ODE 系统的输出,然后我创建了一个数据框,其中包含一些我希望与 ODE 输出一起绘制的值。我知道时间点不同,ODE 系统使用天数,直到 77 天。数据框以周为单位,直到 11 周,所以仍然是 77 天。这就是为什么我制作列表 t1 来绘制数据框 df 的原因。然而,我上面的代码输出了一个带有第三条线的图,一条沿着 x 轴底部的水平线。我的代码有什么问题?我需要对时间点做些什么才能将两个输出保持在我的轴上,即 ODE 输出 Jdf?如果我想在第 20 天切断轴?

编辑:

我认为您不需要对这种特殊情况使用 pandas。如果你想绘制字典中包含的数据,你可以简单地做:

import numpy as np
import matplotlib.pyplot as plt

d = {'Week': np.arange(1, 12) * 7,
     'incidence': [206.1705794, 2813.420201, 11827.9453, 30497.58655, 10757.66954, 7071.878779, 3046.752723, 1314.222882, 765.9763902, 201.3800578, 109.8982006]}

plt.plot(d['Week'], d['incidence'])

这给出了

你得到那条水平线的原因是因为你从 d 生成的数据框 df 有两列,当你绘制它时,它会创建两个系列,每列一个。这里直接使用dataframeplot方法就可以看到:

df = pd.DataFrame(d)
df.plot()

这不是你想要的。此外,请注意水平轴自动设置为计数器编号,即您的 x-axis 值不是字典中的 'Week' 值,而是自动计数器(从零到 11)设置pandas/matplotlib。如果你仍然想使用 pandas 绘图,你可以使用 df.plot(x='Week', y='incidence')