Source code for pyleecan.Methods.Output.XOutput.plot_generation

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from ....Methods.Output.XOutput import _get_symbol_data_


[docs]def plot_generation(self, x_symbol, y_symbol, ax=None): """Plot every fitness values according to the two fitness Parameters ---------- self : XOutput obj1 : str symbol of the ParamExplorer, the OptiObjective or the DataKeeper obj2 : str symbol of the ParamExplorer, the OptiObjective or the DataKeeper """ # TODO define the colormap according to Pyleecan graphical chart # Colormap definition cm = LinearSegmentedColormap.from_list( "colormap", [(35 / 255, 89 / 255, 133 / 255), (250 / 255, 202 / 255, 56 / 255)], N=max(self["ngen"].result) + 1, ) # Get fitness and ngen is_valid = np.array(self["is_valid"].result) ngen = np.array(self["ngen"].result) # Keep only valid values indx = np.where(is_valid)[0] ngen = ngen[indx] # get data and labels x_values, x_label = _get_symbol_data_(self, x_symbol, indx) y_values, y_label = _get_symbol_data_(self, y_symbol, indx) if ax is None: fig, ax = plt.subplots() # Plot fitness values scatter = ax.scatter(x_values, y_values, s=8, c=ngen, cmap=cm) # Add legend legend1 = ax.legend( *scatter.legend_elements(), loc="upper right", title="Generation" ) ax.add_artist(legend1) # Extend xlim to give some space to the legend left, right = ax.get_xlim() ax.set_xlim(left, right + 0.2 * abs(right - left)) ax.set_xlabel(x_label) ax.set_ylabel(y_label) ax.set_title("Fitness values for each individual") fig.show() else: # Plot fitness values scatter = ax.scatter(x_values, y_values, s=8, c=ngen, cmap=cm) # Add legend legend1 = ax.legend( *scatter.legend_elements(), loc="upper right", title="Generation" ) ax.add_artist(legend1) # Extend xlim to give some space to the legend left, right = ax.get_xlim() ax.set_xlim(left, right + 0.2 * abs(right - left)) ax.set_xlabel(x_label) ax.set_ylabel(y_label) ax.set_title("Fitness values for each individual") return ax