Note
Go to the end to download the full example code.
Customize with matplotlib#
In this example,
we will see how to modify the matplotlib figures
generated by an BasePost
.
This can be useful to finely tune a graph for a presentation or a paper.
from __future__ import annotations
from matplotlib import pyplot as plt
from gemseo import create_design_space
from gemseo import create_discipline
from gemseo import create_scenario
We consider a minimization problem over the interval \([0,1]\) of the \(f(x)=x^2\) objective function:
discipline = create_discipline("AnalyticDiscipline", expressions={"y": "x**2"})
design_space = create_design_space()
design_space.add_variable("x", lower_bound=0.0, upper_bound=1.0)
scenario = create_scenario(
[discipline], "y", design_space, formulation_name="DisciplinaryOpt"
)
We solve this optimization problem with the gradient-free algorithm COBYLA:
scenario.execute(algo_name="NLOPT_COBYLA", max_iter=10)
Then,
we can post-process this MDOScenario
with an OptHistoryView
.
opt_post_processor = scenario.post_process(
post_name="OptHistoryView", show=True, save=False
)
Instead of saving or showing this OptHistoryView
,
and so the associated OptHistoryView.figures
,
we will slightly modify the latter which are matplotlib figures by default.
figures = opt_post_processor.figures
print(figures.keys())
By default,
the color bar representing the evolution of the optimization variables
does not use labels.
To add a custom label indicating
that the optimization variables are scaled in \([0,1]\),
we can get the matplotlib Axes
of the matplotlib figures:
figure = figures["variables"]
axes = figure.axes
and change the y-label of the color bar:
axes[1].set_ylabel("Optimization variables scales in [0,1]")
We can also change the y-label of the graph:
axes[0].set_ylabel("Optimization variables")
Lastly, we can plot all the figures:
plt.show()
or save the modified figure:
figure.savefig("variables.png")