【问题标题】:Taking quartile values of an list of list, and plotting them获取列表列表的四分位数并绘制它们
【发布时间】:2021-11-19 15:49:49
【问题描述】:

我下面的代码在运行时会在图上绘制 100 条曲线,以获取 ODE 系统中参数的随机值。但是,我试图获取每个时间点的“横截面”,因此我将在该点获取所有 100 个值,然后获取这些值的上下四分位数和中位数(在代码中将是数组或列表),并绘制它们:

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

N = 1000
I0, R0 = 1, 0
S0 = N - I0 - R0
J0 = I0
beta, gamma = 2/7, 1/7
t = np.linspace(0, 100,100)

empty = []
for i in range(100):
    empty.append(random.uniform(1.5, 2.5)*gamma)

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

solns =  []
for empt in empty:
    ces = odeint(deriv, (S0, I0, R0, J0), t, args=(N, empt, gamma))
    solns.append(ces)

J_diffs = []
for sol in solns:
    S, I, R, J = sol.T
    J_diffs.append(np.diff(J))

fig = plt.figure(facecolor='w')
ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True)
ax.set_xlabel('Time in days')
ax.set_ylabel('Number')
ax.grid(b=True, which='major', c='w', lw=2, ls='-')
xcoords = [2.5, 97.5]
for J_diff in J_diffs:
    ax.plot(t[1:], J_diff, 'blue', alpha=1, lw=2)

我已经尝试过,正在使用:

for val in solns:
    ax.plot(t[1:], np.percentile(val,25), 'blue', alpha=1, lw=2)

但这是维度的错误,因为它仅检索 1 个值,而不是所有值。 然后我尝试了

for t in solns:
    ax.plot(t[1:], np.percentile(val,25), 'blue', alpha=1, lw=2)

因为我认为选择与每个值对应的时间点更有意义,但这会返回相同的错误。我相信我错过了如何实现这一目标的合乎逻辑的方法。最终结果是有 3 条曲线,一条显示由所有值的 97.5 个百分位组成的曲线,一条用于 2.5,一条用于 0.5th。我的方法哪里出错了?

【问题讨论】:

    标签: python list numpy ode


    【解决方案1】:

    您可以先找到百分位数,然后绘制它们。使用这样的东西:

    def plot_percentile(data, percentile):
        percentiles = [np.percentile(val, percentile) for val in data]
        ax.plot(t, percentiles, 'blue', alpha=1, lw=2)
    
    plot_percentile(solns, 97.5)
    plot_percentile(solns, 2.5)
    plot_percentile(solns, 0.5)
    

    这段代码将所有三条曲线放在一个图表上,这不是您想要的,但我认为您可以从这里调整它(使用子图,并将子图索引作为参数或类似的东西传递给plot_percentile()) .

    【讨论】:

    • 我必须将data 分配给前一个变量吗?
    • 我不确定您指的是哪个变量。不过,您可以更改 plot_percentile 中的任何变量名称。它甚至不需要在函数内。我的代码只是你如何处理它的一个例子
    • 我明白,虽然我很困惑“数据”代表什么,因为这段代码在运行时不会产生任何输出
    • 抱歉,这应该附加到您的第一个代码块的底部。数据只是您随机生成的列表的列表(例如,我用solns 调用它)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多