in method_comparison/app.py [0:0]
def generate_pareto_plot(df, metric_x, metric_y):
if df.empty:
return {}
# Compute Pareto frontier and non-frontier points.
pareto_df = compute_pareto_frontier(df, metric_x, metric_y)
non_pareto_df = df.drop(pareto_df.index)
# Create an empty figure.
fig = go.Figure()
# Draw the line connecting Pareto frontier points.
if not pareto_df.empty:
# Sort the Pareto frontier points by metric_x for a meaningful connection.
pareto_sorted = pareto_df.sort_values(by=metric_x)
line_trace = go.Scatter(
x=pareto_sorted[metric_x],
y=pareto_sorted[metric_y],
mode="lines",
line={"color": "rgba(0,0,255,0.3)", "width": 4},
name="Pareto Frontier",
)
fig.add_trace(line_trace)
# Add non-frontier points in gray with semi-transparency.
if not non_pareto_df.empty:
non_frontier_trace = go.Scatter(
x=non_pareto_df[metric_x],
y=non_pareto_df[metric_y],
mode="markers",
marker={"color": "rgba(128,128,128,0.5)", "size": 12},
hoverinfo="text",
text=non_pareto_df.apply(
lambda row: f"experiment_name: {row['experiment_name']}<br>"
f"peft_type: {row['peft_type']}<br>"
f"{metric_x}: {row[metric_x]}<br>"
f"{metric_y}: {row[metric_y]}",
axis=1,
),
showlegend=False,
)
fig.add_trace(non_frontier_trace)
# Add Pareto frontier points with legend
if not pareto_df.empty:
pareto_scatter = px.scatter(
pareto_df,
x=metric_x,
y=metric_y,
color="experiment_name",
hover_data={"experiment_name": True, "peft_type": True, metric_x: True, metric_y: True},
)
for trace in pareto_scatter.data:
trace.marker = {"size": 12}
fig.add_trace(trace)
# Update layout with axes labels.
fig.update_layout(
title=f"Pareto Frontier for {metric_x} vs {metric_y}",
template="seaborn",
height=700,
autosize=True,
xaxis_title=metric_x,
yaxis_title=metric_y,
)
return fig