import plotly.graph_objects as go
proyectos = ["PRY001","PRY002","PRY003","PRY004","PRY005","PRY006","PRY007","PRY008"]
cpi = [0.881, 0.963, 0.850, 0.948, 0.877, 0.993, 0.978, 0.938]
spi = [0.890, 0.969, 0.951, 0.956, 0.944, 0.992, 0.972, 0.937]
bac = [4.8, 12.5, 8.2, 6.4, 3.1, 5.6, 0.48, 9.8]
def color(c):
if c < 0.85: return "#d63031"
if c < 0.95: return "#e17055"
return "#00c9b1"
fig = go.Figure()
for v, c, s, b in zip(proyectos, cpi, spi, bac):
fig.add_trace(go.Scatter(
x=[c], y=[s],
mode="markers+text",
marker=dict(size=max(12, b*2), color=color(c),
opacity=0.85, line=dict(width=2, color="white")),
text=[v], textposition="middle center",
textfont=dict(size=9, color="white"),
hovertemplate=f"<b>{v}</b><br>CPI: {c}<br>SPI: {s}<extra></extra>",
showlegend=False,
))
for val, col, dash in [(1.0,"#00c9b1","dot"),(0.95,"#e17055","dash"),(0.85,"#d63031","dash")]:
fig.add_hline(y=val, line_color=col, line_dash=dash, line_width=1, opacity=0.5)
fig.add_vline(x=val, line_color=col, line_dash=dash, line_width=1, opacity=0.5)
fig.update_layout(
height=380,
paper_bgcolor="#1c1f30",
plot_bgcolor="#141622",
margin=dict(l=50, r=30, t=20, b=50),
xaxis=dict(title="CPI", gridcolor="#2a2f45", range=[0.82,1.02],
tickfont=dict(color="#7a8499"), titlefont=dict(color="#7a8499")),
yaxis=dict(title="SPI", gridcolor="#2a2f45", range=[0.84,1.02],
tickfont=dict(color="#7a8499"), titlefont=dict(color="#7a8499")),
font=dict(family="Barlow, sans-serif", color="#7a8499"),
)
fig.show()