Search code examples
pythonmatplotliboptuna

Optuna, change axes ratio in plots


I've been running some optimization with optuna, and I'd like to produce plots with the same scale on both axes, but so far I was unable to find out how.

study = optuna.create_study(study_name=study_name,
                            storage=f"sqlite:///{results_folder}/{study_name}.db",
                            directions=["maximize", "maximize"],
                            load_if_exists=True)
# I tried either
fig_pareto = optuna.visualization.plot_pareto_front(study, target_names=['precision', 'recall'])
fig_pareto.show()

# or
fig, ax = plt.subplots()
optuna.visualization.matplotlib.plot_pareto_front(study, target_names=['precision', 'recall']) 
ax.axis("equal")
ax.set_xlim(0.7, 1)
ax.set_ylim(0.7, 1)
target_names=['precision', 'recall'])
plt.savefig("some_name.png")

but without success. This is what the saved plot looks like:

enter image description here

With the first method, the pictures open in an interactive view in the browser and I can resize them, but there's no option to precisely make them square.

When using the second way, it looks like calling:

optuna.visualization.matplotlib.plot_pareto_front(study, target_names=['precision', 'recall']) 

is not linking the produced plot to the ax object? If I do:

pareto_plot = optuna.visualization.matplotlib.plot_pareto_front(study, target_names=['precision', 'recall'])  

the pareto_plot is an AxesSubplot object, can I manually load it in the axes?


Solution

  • Sorry, I had the answer right there. I had to do:

    pareto = optuna.visualization.matplotlib.plot_pareto_front(study, target_names=['precision', 'recall'])
    pareto.axis('equal')
    plt.savefig("pareto_plot.png")