Source code for metacluster.utils.visualize_util

#!/usr/bin/env python
# Created by "Thieu" at 17:17, 31/07/2023 ----------%                                                                               
#       Email: nguyenthieu2102@gmail.com            %                                                    
#       Github: https://github.com/thieu1995        %                         
# --------------------------------------------------%

import pandas as pd
import plotly.express as px
import plotly.io as pio

pio.kaleido.scope.mathjax = None


[docs]def export_boxplot_figures(df, figure_size=(500, 600), xlabel="Optimizer", ylabel=None, title="Boxplot of comparison models", show_legend=True, show_mean_only=False, exts=(".png", ".pdf"), file_name="boxplot", save_path="history"): """ Parameters ---------- df : pd.DataFrame The format of df parameter: optimizer DBI FBIO 1.18145 FBIO 1.1815 GWO 1.18145 GWO 1.18153 FBIO 1.18147 FBIO 1.18145 GWO 1.18137 figure_size : list, tuple, np.ndarray, None; default=None The size for saved figures. `None` means it will automatically set for you. Or you can pass (width, height) of figure based on pixel (100px to 1500px) xlabel : str; default="Optimizer" The label for x coordinate of boxplot figures. ylabel : str; default=None The label for y coordinate of boxplot figures. title : str; default="Boxplot of comparison models" The title of figures, it should be the same for all objectives since we have y coordinate already difference. show_legend : bool; default=True Show the legend or not. For boxplots we can turn on or off this option, but not for convergence chart. show_mean_only : bool; default=False You can show the mean value only or you can show all mean, std, median of the box by this parameter exts : list, tuple, np.ndarray; default=(".png", ".pdf") List of extensions of the figures. It is for multiple purposes such as latex (need ".pdf" format), word (need ".png" format). file_name : str; default="boxplot" The prefix for filenames that will be saved. save_path : str; default="history" The path to save the figure """ yaxis = dict(nticks=8) if abs(df.iloc[0][-1]) > 1e5 or abs(df.iloc[0][-1]) < 1e-5: yaxis = dict(tickformat=".2e", exponentformat="power", showexponent="first") if xlabel is None: xlabel = "" if ylabel is None: ylabel = "" if title is None: title = "" boxmean = True if show_mean_only else "sd" col_name = list(df.columns)[-1] if ylabel is None: ylabel = col_name fig = px.box(df, x="optimizer", y=col_name, color="optimizer", labels={'optimizer': xlabel, col_name: ylabel}) fig.update_traces(boxmean=boxmean) # boxmean=True if want to show mean only fig.update_layout(width=figure_size[0], height=figure_size[1], margin=dict(l=25, r=20, t=40, b=20), showlegend=show_legend, title={'text': title, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top'}, font=dict(size=15), yaxis=yaxis) for idx, ext in enumerate(exts): fig.write_image(f"{save_path}/{file_name}{ext}")
[docs]def export_convergence_figures(df, figure_size=(500, 600), xlabel="Epoch", ylabel="Fitness value", title="Convergence chart of comparison models", legend_name="Optimizer", exts=(".png", ".pdf"), file_name="convergence", save_path="history"): """ Parameters ---------- df : pd.DataFrame The format of df parameter: FBIO GWO 62.62501039 62.72457583 62.62085777 62.71386468 62.62085777 62.71386468 62.62085777 62.71386468 62.62085777 62.66383109 62.62085777 62.66310589 figure_size : list, tuple, np.ndarray, None; default=None The size for saved figures. `None` means it will automatically set for you. Or you can pass (width, height) of figure based on pixel (100px to 1500px) xlabel : str; default="Optimizer" The label for x coordinate of convergence figures. ylabel : str; default=None The label for y coordinate of boxplot figures. title : str; default="Convergence chart of comparison models" The title of figures, it should be the same for all objectives since we have y coordinate already difference. legend_name : str; default="Optimizer" Set the name for the legend. exts : list, tuple, np.ndarray; default=(".png", ".pdf") List of extensions of the figures. It is for multiple purposes such as latex (need ".pdf" format), word (need ".png" format). file_name : str; default="convergence" The prefix for filenames that will be saved. save_path : str; default="history" The path to save the figure """ yaxis = dict(nticks=8) if abs(df.iloc[0][-1]) > 1e5 or abs(df.iloc[0][-1]) < 1e-5: yaxis = dict(tickformat=".2e", exponentformat="power", showexponent="first") if xlabel is None: xlabel = "" if ylabel is None: ylabel = "" if title is None: title = "" if legend_name is None: legend_name = "Optimizer" # Melt the DataFrame to convert it from wide to long format df = df.reset_index() df_long = pd.melt(df, id_vars='index', var_name='Column', value_name='Value') # Define the line chart using Plotly Express fig = px.line(df_long, x='index', y='Value', color='Column', labels={'index': xlabel, 'Value': ylabel, 'Column': legend_name}) fig.update_layout(width=figure_size[0], height=figure_size[1], margin=dict(l=25, r=20, t=40, b=20), showlegend=True, title={'text': title, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top'}, font=dict(size=15), yaxis=yaxis) for idx, ext in enumerate(exts): fig.write_image(f"{save_path}/{file_name}{ext}")