MONTHS = ["Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar", "Apr"]
X = {m: i for i, m in enumerate(MONTHS)}
rows = [
("Karamoja", [
(X["Aug"], X["Oct"] + 1, "#7f5619", 0.30, "failed rains: pasture, water, livestock stress"),
(X["Nov"], X["Mar"] + 1, "#9db1b3", 0.30, "dry season: no regrowth until the ~Apr rains"),
], [(X["Apr"] + 0.5, "next rains\n(climatology)")]),
("West Nile corridor", [
(X["Aug"], X["Mar"] + 1, "#e69f00", 0.30, "this harvest must last until Mar 2027 planting"),
], [(X["Mar"] + 0.2, "next planting\n(Mar 2027)")]),
("Bimodal south / west", [
(X["Aug"], X["Oct"] + 1, "#56b4e9", 0.35, "second-season planting: establishment at risk"),
(X["Oct"], X["Jan"] + 1, "#2a7e43", 0.25, "wet Oct-Dec supports what got established"),
], [(X["Oct"] + 0.5, "establishment\ncheck"), (X["Jan"] + 0.5, "second harvest")]),
("Flood watch", [
(X["Oct"], X["Dec"] + 1, "#1f69b3", 0.25, "Teso/Kyoga + Elgon/Kasese slopes"),
], []),
("Monitoring", [], [
(X["Sep"] + 0.2, "SEAS5\nissuance"), (X["Oct"] + 0.2, "SEAS5 + ERA5\nconfirm Aug-Sep"),
(X["Nov"] + 0.2, "SEAS5\nissuance"),
]),
]
fig, ax = plt.subplots(figsize=(9.5, 4.2))
for i, (name, bands, marks) in enumerate(rows):
yy = len(rows) - 1 - i
for k, (x0, x1, c, a, lab) in enumerate(bands):
ax.barh(yy, x1 - x0, left=x0, height=0.52, color=c, alpha=a)
dy = 0.24 if (len(bands) > 1 and k == 0) else (-0.24 if len(bands) > 1 else 0.02)
ax.text((x0 + x1) / 2, yy + dy, lab, ha="center", va="center", fontsize=8, color="#1f2324")
for x, lab in marks:
ax.plot(x, yy, marker="D", ms=7, color="#18614c")
ax.annotate(lab, (x, yy), xytext=(0, -30), textcoords="offset points",
ha="center", fontsize=7.3, color="#18614c")
ax.set_yticks(range(len(rows)), [r[0] for r in rows][::-1], fontsize=9.5)
ax.set_xticks(range(len(MONTHS)), [f"{m}\n'26" if i < 5 else f"{m}\n'27" for i, m in enumerate(MONTHS)], fontsize=8.5)
ax.set_xlim(-0.3, len(MONTHS) + 0.4); ax.set_ylim(-0.8, len(rows) - 0.3)
ax.spines[["top", "right", "left"]].set_visible(False)
ax.set_title("When it bites, and when to look again")
plt.tight_layout()
plt.show()