codex/same-early-response-different-lung-compliances.py

same-early-response-different-lung-compliances.py
#!/usr/bin/env python3
"""Distinct passive models matching one observed finite-time compliance."""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt


def main():
    time = np.linspace(0, 6, 1201)
    fig, ax = plt.subplots(figsize=(8, 3.5), dpi=120, facecolor="white")
    for compliance, color in [(.12, "#2367a1"), (.20, "#b85224"), (1., "#24845e")]:
        tau = -1 / np.log(1 - .1 / compliance)
        response = compliance * (1 - np.exp(-time / tau))
        ax.plot(time, response, color=color, lw=2,
                label=f"Equilibrium C = {compliance:g}; time constant {tau:.2f} s")
    ax.axvline(1, color=".6", ls=":", lw=1)
    ax.scatter([1], [.1], color=".15", zorder=5, s=32)
    ax.annotate("All give 0.10 at 1 s", (1, .1), xytext=(1.6, .23),
                fontsize=10, arrowprops={"arrowstyle": "->", "color": ".3"})
    ax.set(xlim=(0, 6), ylim=(0, .52), xlabel="Time after pressure step (s)",
           ylabel="Volume / pressure (L per cm H2O)")
    ax.set_title("One early observation, different equilibrium compliances", fontsize=12)
    ax.legend(loc="lower right", fontsize=8)
    ax.grid(alpha=.18)
    ax.set_facecolor("white")
    fig.text(.5, .015, "Constructed single-compartment models; not patient measurements", ha="center", fontsize=9)
    fig.tight_layout(rect=(0, .055, 1, 1))
    fig.savefig("same-early-response-different-lung-compliances.png", dpi=120,
                facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()