| | 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, |
| | }) |
| |
|
| |
|