spreads = np.round(np.arange(0.2, 1.21, 0.1), 1)
grid = np.linspace(0, 1, 101)
fig = go.Figure()
fig.add_trace(go.Scatter(x=grid, y=grid, mode="lines", name="Perfect equality",
line=dict(color=GREY, dash="dash", width=1.5), hoverinfo="skip"))
for i, s in enumerate(spreads):
people, income = lorenz(toy_economy(s))
curve = np.interp(grid, people, income)
fig.add_trace(go.Scatter(
x=grid, y=curve, mode="lines", name=f"spread {s}", visible=(s == 0.6),
line=dict(color=GOLD, width=3), fill="tonexty", fillcolor="rgba(217,154,30,0.18)",
hovertemplate="The poorest %{x:.0%} earn %{y:.1%} of all income<extra></extra>"))
steps = []
for i, s in enumerate(spreads):
g = gini(toy_economy(s))
visible = [True] + [j == i for j in range(len(spreads))]
steps.append(dict(method="update", label=f"{s}",
args=[{"visible": visible}, {"title.text": f"Spread {s}: Gini = {g:.2f}"}]))
start = int(np.where(spreads == 0.6)[0][0])
fig.update_layout(
title=dict(text=steps[start]["args"][1]["title.text"], x=0, font=dict(size=16)),
sliders=[dict(active=start, steps=steps, currentvalue=dict(prefix="Spread: "), pad=dict(t=40))],
xaxis=dict(title="Share of people, poorest first", tickformat=".0%", range=[0, 1]),
yaxis=dict(title="Share of income", tickformat=".0%", range=[0, 1]),
showlegend=False, template="simple_white", height=520, margin=dict(l=60, r=20, t=60, b=40),
font=dict(family="IBM Plex Sans, sans-serif"),
)
fig.show()