|
|
import plotly.graph_objects as go |
|
|
import plotly.io as pio |
|
|
import os |
|
|
|
|
|
""" |
|
|
Simple grouped bar chart (Baseline / Improved / Target), minimal Distill-like style. |
|
|
Responsive, no zoom/pan, clean hover (rounded tooltip corners via post_script). |
|
|
""" |
|
|
|
|
|
|
|
|
categories = ["A", "B", "C", "D", "E"] |
|
|
baseline = [0.52, 0.61, 0.67, 0.73, 0.78] |
|
|
improved = [0.58, 0.66, 0.72, 0.79, 0.86] |
|
|
target = [0.60, 0.68, 0.75, 0.82, 0.90] |
|
|
|
|
|
color_base = "#64748b" |
|
|
color_improved = "#2563eb" |
|
|
color_target = "#4b5563" |
|
|
|
|
|
fig = go.Figure() |
|
|
fig.add_bar( |
|
|
x=categories, |
|
|
y=baseline, |
|
|
name="Baseline", |
|
|
marker=dict(color=color_base), |
|
|
offsetgroup="grp", |
|
|
hovertemplate="<b>%{x}</b><br>%{fullData.name}: %{y:.3f}<extra></extra>", |
|
|
) |
|
|
|
|
|
fig.add_bar( |
|
|
x=categories, |
|
|
y=improved, |
|
|
name="Improved", |
|
|
marker=dict(color=color_improved), |
|
|
offsetgroup="grp", |
|
|
hovertemplate="<b>%{x}</b><br>%{fullData.name}: %{y:.3f}<extra></extra>", |
|
|
) |
|
|
|
|
|
fig.add_bar( |
|
|
x=categories, |
|
|
y=target, |
|
|
name="Target", |
|
|
marker=dict(color=color_target, opacity=0.65, line=dict(color=color_target, width=1)), |
|
|
offsetgroup="grp", |
|
|
hovertemplate="<b>%{x}</b><br>%{fullData.name}: %{y:.3f}<extra></extra>", |
|
|
) |
|
|
|
|
|
fig.update_layout( |
|
|
barmode="group", |
|
|
autosize=True, |
|
|
paper_bgcolor="rgba(0,0,0,0)", |
|
|
plot_bgcolor="rgba(0,0,0,0)", |
|
|
margin=dict(l=28, r=12, t=8, b=28), |
|
|
hovermode="x unified", |
|
|
legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="left", x=0), |
|
|
xaxis=dict( |
|
|
showgrid=False, |
|
|
zeroline=False, |
|
|
showline=True, |
|
|
linecolor="rgba(0,0,0,0.25)", |
|
|
linewidth=1, |
|
|
ticks="outside", |
|
|
ticklen=6, |
|
|
tickcolor="rgba(0,0,0,0.25)", |
|
|
tickfont=dict(size=12, color="rgba(0,0,0,0.65)"), |
|
|
title=None, |
|
|
automargin=True, |
|
|
fixedrange=True, |
|
|
), |
|
|
yaxis=dict( |
|
|
showgrid=False, |
|
|
zeroline=False, |
|
|
showline=True, |
|
|
linecolor="rgba(0,0,0,0.25)", |
|
|
linewidth=1, |
|
|
ticks="outside", |
|
|
ticklen=6, |
|
|
tickcolor="rgba(0,0,0,0.25)", |
|
|
tickfont=dict(size=12, color="rgba(0,0,0,0.65)"), |
|
|
title=None, |
|
|
tickformat=".2f", |
|
|
automargin=True, |
|
|
fixedrange=True, |
|
|
), |
|
|
) |
|
|
|
|
|
post_script = """ |
|
|
(function(){ |
|
|
var plots = document.querySelectorAll('.js-plotly-plot'); |
|
|
plots.forEach(function(gd){ |
|
|
function round(){ |
|
|
try { |
|
|
var root = gd && gd.parentNode ? gd.parentNode : document; |
|
|
var rects = root.querySelectorAll('.hoverlayer .hovertext rect'); |
|
|
rects.forEach(function(r){ r.setAttribute('rx', 8); r.setAttribute('ry', 8); }); |
|
|
} catch(e) {} |
|
|
} |
|
|
if (gd && gd.on){ |
|
|
gd.on('plotly_hover', round); |
|
|
gd.on('plotly_unhover', round); |
|
|
gd.on('plotly_relayout', round); |
|
|
} |
|
|
setTimeout(round, 0); |
|
|
}); |
|
|
})(); |
|
|
""" |
|
|
|
|
|
fig.write_html("../app/src/fragments/bar.html", |
|
|
include_plotlyjs=False, |
|
|
full_html=False, |
|
|
config={ |
|
|
'displayModeBar': False, |
|
|
'responsive': True, |
|
|
'scrollZoom': False, |
|
|
}) |
|
|
|
|
|
|