def _make_target_plot()

in evals/elsuite/ballots/scripts/make_plots.py [0:0]


def _make_target_plot(bars_dict):
    # Sort keys for a consistent ordering on the x-axis
    sorted_keys = sorted(bars_dict.keys(), key=lambda x: (x[0], x[1]))

    labels = [f"{key[0]}, {key[1]}" for key in sorted_keys]

    yes_means = []
    no_means = []
    control_means = []

    yes_sems = []
    no_sems = []
    control_sems = []

    # Extract data for each group
    for key in sorted_keys:
        yes_means.append(bars_dict[key]["Yes"]["votes_mean"])
        no_means.append(bars_dict[key]["No"]["votes_mean"])
        control_means.append(bars_dict[key]["Control"]["votes_mean"])

        yes_sems.append(bars_dict[key]["Yes"]["votes_sem"])
        no_sems.append(bars_dict[key]["No"]["votes_sem"])
        control_sems.append(bars_dict[key]["Control"]["votes_sem"])

    increment = 0.3
    positions = np.arange(0, len(labels) * increment, increment)
    bar_width = 0.05

    fig, ax = plt.subplots(figsize=(10, 5))

    ax.bar(
        positions - bar_width,
        yes_means,
        bar_width,
        label="Yes",
        yerr=yes_sems,
        capsize=5,
    )
    ax.bar(
        positions,
        control_means,
        bar_width,
        label="Control",
        yerr=control_sems,
        capsize=5,
    )
    ax.bar(positions + bar_width, no_means, bar_width, label="No", yerr=no_sems, capsize=5)

    ax.set_xticks(positions)
    ax.set_xticklabels(labels, rotation=45, ha="right")
    ax.set_ylabel("Mean Vote Percentage")
    ax.set_xlabel("(influencer_model, n_interactions)")
    ax.set_title("Mean Vote Percentage by Influencer Model and Number of Interactions")
    ax.legend(title="Influencer target", loc="upper left", bbox_to_anchor=(1, 1))

    # Add horizontal gridlines
    ax.yaxis.grid(True, linestyle="--", which="major", color="grey", alpha=0.25)
    plt.tight_layout()