diff --git a/example_notebooks/plotting_metrics.ipynb b/example_notebooks/plotting_metrics.ipynb new file mode 100644 index 0000000..b441173 --- /dev/null +++ b/example_notebooks/plotting_metrics.ipynb @@ -0,0 +1,156 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f170871c", + "metadata": {}, + "source": [ + "# Plotting Metrics Across Histories\n", + "This notebooks demonstrates the use of `plot_metric_history` which allows for the plotting the evolution of metrics over each population within a `History` object." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "187977c8", + "metadata": {}, + "outputs": [], + "source": [ + "import paretobench as pb\n", + "from paretobench.plotting import plot_metric_history, population_obj_scatter\n", + "from paretobench.metrics import Hypervolume" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d05faebb", + "metadata": {}, + "outputs": [], + "source": [ + "# Load an experiment and get the history object from it\n", + "exp = pb.Experiment.load(\"data/NSGAII.h5\")\n", + "hist = exp.runs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "035458a2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(
, )" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Show the last generation\n", + "population_obj_scatter(hist.reports[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "17b44a70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(
,\n", + " )" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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jsoArIfKDeCgfHx89Jdi5YuHh4eu6owcOdLisap7RXWzmKjrTzzxhDzzzDMSEhKin6uqCpWdP39eV2EiIiLE19dXunbtKt9++62unEyYMEGys7PNFRPTc6t2SyUnJ8ttt90mAQEBOojcfffdcvr06YsqGf/85z/1c4ODg2XMmDGSm5t7xT+/CjJV//zu7u6ycuVKfb7q/CtTf97rr79eX8/KypJ77rlHYmJipEmTJtKtWzf57LPPat11pKpXqopl8oc//EE6dOigX7NNmzby/PPPS2lpqb5PPW7WrFmye/duc7uZnlv1tZOSkmTgwIHi5+cnoaGh+veQl5dnvt/0O547d65ERkbqxzz66KPm91Lmz58v7du3122hfod33nnnFdsUcBaEG8BFffzxx+Lv7y9btmyRV155RV566SVZvXq1vs9gMOhuks2bN8snn3wi+/btkzlz5ujw1L9/fx1gVFhR3Snq8vvf//6i11d78qov4LNnz8q6dev0ax85ckRGjx5t8Th1TH2xq+CkLuqx6r3q6qabbtKh48svvzQfKy8vl3/9619y77336ttFRUXSs2dP/X579uzR4eH+++/XbVEfgYGBOrCo9nrzzTflgw8+kNdff13fp/7cTz31lHTp0sXcblXbQikoKNBVuWbNmuluvqVLl8r3338vjz32mMXj1qxZo9tO/VS/S/W+prC0bds2HebU71RVuL777ju57rrr6vVnAxwJ3VKAg1JfzKoiYqLCiPoirKn4+HiZOXOmvq7+hf/222/L//73Pxk8eLD+Mv35559l//79uhKhqEqEiaqwqGpDdd0p6jUSExPl2LFjEhsbq4+pCo36cldf2r179zYHKfWlrIKBokKGOo8///nP1Z6/qrpUFh0drb/IVQBToeHTTz+VSZMm6fvU6507d07uuusu82MrB7LHH39cBwDVfn379pW6+uMf/2i+ripRKswsWbJEV8hUFUb9vjw9Pattt8WLF0thYaEsWrRIh09F/W5GjBghf/3rX3UVRlHhRx1Xf96rrrpKbr31Vv3nfOihh3TFTD13+PDhul1btmwpV199dZ3/XICjIdwADurGG2+Ud99913zb9EVYm3BTmereyMjI0Nd37dqlw4Mp2NSFCkYq1JiCjdK5c2ddVVH3mcKNCgGmYFP1PKqzYcMGi+ep0GCiKjT9+vWTkydPSlRUlA4Mt9xyiw4EpkqOqg6p4JGWlibFxcX6Uts2rOqLL77QVS01sFt1I5WVlV00LuhKVNskJCRYnMuAAQN0CFThzRRuVEhUwaZyu6nuLEUFVBVoVCBVVSB1uf3223V3GeAK6JYCHJT68mvXrp35or7cFDXuRHUJVVZ5LIaJl5eXxW1ViVFfoIqqMtSXOgf1mlc6Xt15VKd169YWf34Vkkz69Okjbdu2lc8//1xXQZYvXy733Xef+f7XXntNdxepisoPP/ygw9zNN98sJSUll30/dV7VtetPP/2kxwupCpqqqu3cuVNmzJhR7WvWpt1M51CTdlOhb8eOHXockfpcvPDCCzowVR2HBDgrwg3gZNSMJTWeozL15V3bqk5qaqocPHjwkvd7e3vr6kd1VJVGdY+kpKSYj6mxKGogcqdOnaShjR07VldsvvnmGx34VLdN5aqPGuisAo/60lcVjkOHDtWqXdXj1fgYk02bNulqiQo0vXr10l19J06cqFO7qd9Xfn6+xWurP0NtKmmqkqXGH6nxVKp78Pjx4zrIAa6AcAM4GTXLRg0oVWM21BewGlejBs3WhppVpAag3nHHHXogsBo389///lePS1FUlUR1u6gxHpmZmRZf8ibqi1WFJNVFpKoIagzPuHHj9GurL//6Ul1Xal2bypfKlRTT+6qxO2qmkJo1ZKIqPerPpQZMq26g3/3ud1dcI0e1qxrjol5Tte/kyZMtqifqNVWYU9UiNdD3rbfe0hWjylS7qbZU4UW1m+oKq0qdtzrX8ePH69+bGjCsxgSpsUimLqkrUZUj9f7qfVTAUp8FVdXp2LFjjZ4PODrCDeBkVPeKmoKsulzUuBY1rVqFitpSs43U89WUaVVNUK9nqjqoGVPqy10N3FUVDVUdqMo0vVmNc1FBSYUdVSFR41ysQX1Rqy6Xypft27eb71eVE3X+qmphmiVlotqnR48euq3UtHg1wLfq9PmqVFeWGj+k/iyqKqQGJFcew6IqQVOnTtWzmtT0dhWc1PtUpsKiGv+ixkupdrvU9HP1mmo6u5plps5fBbNBgwbpYFVTalzTsmXLdCBTVbL33ntPv5capwO4Ajdj1U5kAAAAB0blBgAAOBXCDQAAcCqEGwAA4FQINwAAwKkQbgAAgFMh3AAAAKdCuAEAAE6FcAMAAJwK4QYAADgVwg0AAHAqhBsAACDO5P8B42tQdA4qK3MAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot hypervolume vs function evaluations\n", + "plot_metric_history(exp.runs[0], Hypervolume(ref_point=[3, 3]))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "19f275d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(
,\n", + " )" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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K4QbAADgV4LlMG63237NzMz09KEAAIBKKvvcLvscPxHHhZusrCz7tXXr1p4+FAAAUI3P8ZiYmBPeJ8BdmQjkR1wul3bt2qWoqCgFBATUeqo0oSk5OVnR0dFyGqd//4bTz4HTv3/D6eeA79/ZP/+6/B0wccUEm5YtWyow8MRVNY5ruTEnJD4+vk5fw/wwnfpLbTj9+zecfg6c/v0bTj8HfP/O/vnX1e/Ar7XYlKGgGAAA+BXCDQAA8CuEm1oUFhamKVOm2K9O5PTv33D6OXD69284/Rzw/Tv75+8tvwOOKygGAAD+jZYbAADgVwg3AADArxBuAACAXyHcAAAAv0K4qSXTp09X27ZtFR4err59+2rRokVyimnTpum0006zsz43bdpUw4YN08aNG+VU5nyY2a/vuusuOUlKSoquv/56xcbGqkGDBurdu7dWrFghJyguLtaDDz5o3wMiIiLUrl07PfLII3ZGdH+1cOFCXX755Xa2WPP7/umnn1a43YxVefjhh+3t5pyce+65WrdunZzw/RcVFem+++5Tjx49FBkZae8zevRoOzu+k34HDnfrrbfa+zz//POqD4SbWvDhhx/aD7LJkydr5cqVOuuss3TppZcqKSlJTrBgwQL94Q9/0Pfff6958+bZN/qLLrpIOTk5cpply5bp9ddfV8+ePeUkBw4c0BlnnKGQkBD95z//0fr16/XMM8+oUaNGcoInnnhCr776ql566SVt2LBBTz75pJ566im9+OKL8lfm/3evXr3s93ws5hw8++yz9nbz/6J58+YaPHhw+fp+/vz95+bm6scff9RDDz1kv86cOVObNm3SFVdcISf9DpQxoeeHH36wIajemKHgqJn+/fu7x48fX2HfKaec4r7//vsdeWrT0tLM9ALuBQsWuJ0kKyvL3bFjR/e8efPc55xzjvvOO+90O8V9993nPvPMM91ONXToUPfYsWMr7Lvyyivd119/vdsJzP/3WbNmlW+7XC538+bN3Y8//nj5vvz8fHdMTIz71Vdfdfv7938sS5cutffbsWOH2x/pOOdg586d7latWrnXrl3rbtOmjfu5556rl+Oh5aaGCgsLbdO7aak4nNlesmSJnCgjI8N+bdy4sZzEtF4NHTpUF154oZzm888/V79+/TR8+HDbNXnqqafq73//u5zizDPP1H//+1/717mxevVqLV68WEOGDJETbdu2Tbt3767wvmgmdDvnnHMc/b5oumWc0pppmG7ZG264QRMnTlS3bt1Unxy3cGZt27dvn0pKStSsWbMK+822+c/tNCbAT5gwwb7Zd+/eXU7xr3/9yzY/m+Z3J9q6dateeeUV+7N/4IEHtHTpUt1xxx32A83UGvg7U19hPrxOOeUUBQUF2feEv/71r7r22mvlRGXvfcd6X9yxY4ecJj8/X/fff79GjRrlqMU0n3jiCQUHB9v3gvpGuKklJpEf+SF/5D4n+OMf/6jExET7V6tTJCcn684779TcuXNtQbkTmb/QTMvNY489ZrdNy40pHjWBxwnhxtTdvfvuu3r//fftX6irVq2ydXimxmDMmDFyKt4XS4uLR44caf+PmIEnTrFixQr97W9/s3/0eeKzkG6pGoqLi7N/qR3ZSpOWlnbUXy3+7vbbb7fdE/Pnz1d8fLyc9J/Y/LzNKDnzV4q5mCLrF154wV43f8X7uxYtWqhr164V9nXp0sUxRfWm2d38ZW4+xMwIGdMUf/fdd9uRc05kiocNp78vmmBzzTXX2G46M9jCSa02ixYtsj/vhISE8vdF02p3zz336OSTT67z1yfc1FBoaKj9UDO/uIcz24MGDZITmFYq02JjRgT873//s8NhneSCCy7QmjVr7F/rZRfTinHdddfZ6yb8+jszUurI4f+m/qRNmzZyAjM6JjCw4tup+bn781DwEzHvASbgHP6+aOoTTeh3yvtiWbD5+eef9fXXX9spEpzkhhtusK34h78vmpZM84fAnDlz6vz16ZaqBabOwPwgzQfawIED7VBg8xfr+PHj5ZRCWtMc/9lnn9m5bsr+WouJibHzW/g78z0fWV9k5rYwb2ZOqTsyrRTmQ8t0S5k3dFNzY/4fmIsTmLk+TI2N+SvVdEuZKSHMMOixY8fKX2VnZ2vz5s3l26Z1wnyAmYEE5jyYbjnz+9CxY0d7MdfN/Eem7sTfv3/zIX711VfbLpkvv/zStt6WvS+a280fxU74HYg9ItCZqSJM6O3cuXPdH1y9jMlygJdfftkOcwsNDXX36dPHUcOgza/RsS4zZsxwO5XThoIbX3zxhbt79+7usLAwOxXC66+/7naKzMxM+/NOSEhwh4eHu9u1a+eePHmyu6CgwO2v5s+ff8z/92PGjCkfDj5lyhQ7JNz8Tpx99tnuNWvWuJ3w/W/btu2474vmcU75HThSfQ4FDzD/1H2EAgAAqB/U3AAAAL9CuAEAAH6FcAMAAPwK4QYAAPgVwg0AAPArhBsAAOBXCDcAAMCvEG4AAIBfIdwAwDG8/fbbatSoEecG8EGEGwA1YtbMufPOO9WhQweFh4fbVZ/PPPNMvfrqq3ZBSV9gVil+/vnnK+wbMWKEXfwTgO9h4UwA1bZ161a7Irhp4TALI/bo0UPFxcU2FLz11lt2AcErrrjCI2fYrCxjFiwMDq7e25xZ9NUJC78C/oiWGwDVdtttt9nwsHz5crsaeJcuXWzAueqqq/Tvf//brpZtZGRk6He/+52aNm2q6OhonX/++Vq9enX58zz88MPq3bu3/vnPf9pWFLOi/MiRI5WVlVUhrDz55JNq166dDR29evXSxx9/XH77N998o4CAAM2ZM0f9+vVTWFiYFi1apC1btug3v/mNbVFq2LChTjvtNH399dfljzv33HO1Y8cOu7K5eby5HK9b6pVXXlH79u3tqs5mZWNzvIczj33jjTf029/+1q6AbVbD/vzzz/kNA+oZ4QZAtaSnp2vu3Ln6wx/+oMjIyGPex3zYm1AydOhQ2301e/ZsrVixQn369NEFF1yg/fv3l9/XhJBPP/1UX375pb0sWLBAjz/+ePntDz74oGbMmGEDxrp162wYuf766+39Dnfvvfdq2rRp2rBhg3r27Kns7GwNGTLEBpqVK1fq4osvtqErKSnJ3n/mzJmKj4/XI488otTUVHs5llmzZtnut3vuuUdr167Vrbfeqptuuknz58+vcL+pU6faoJeYmGhf97rrrqvwfQKoB/Wy9jgAv/P999+7zVvIzJkzK+yPjY11R0ZG2su9997r/u9//+uOjo525+fnV7hf+/bt3a+99pq9PmXKFHeDBg3cmZmZ5bdPnDjRPWDAAHs9OzvbHR4e7l6yZEmF5xg3bpz72muvtdfnz59vj+fTTz/91WPv2rWr+8UXXyzfbtOmjfu5556rcJ8ZM2a4Y2JiyrcHDRrkvuWWWyrcZ/jw4e4hQ4aUb5vXf/DBB8u3zXEHBAS4//Of//zqMQGoPdTcAKiRsm6cMkuXLpXL5bItFgUFBbalxrSexMbGVrhfXl6eba0pY7qjoqKiyrdbtGihtLQ0e339+vXKz8/X4MGDKzxHYWGhTj311Ar7TJfU4XJycmxrimkN2rVrl60JMq9d1nJTWaYlyHStHc7UG/3tb3+rsM+0FpUxLVrmeyr7PgDUD8INgGoxo6NMsPnpp58q7Dc1MUZZMa4JOiaomJqYIx1e0xISElLhNvPc5rFlz2GYOp5WrVpVuJ+prTnckV1kEydOtHU4Tz/9tD1mc1xXX321DUY1DXKmsebIfSf6PgDUD8INgGoxLTGmJeWll17S7bfffty6G1NfY+ptTOGxaZ2pjq5du9oQY1pbzjnnnCo91hQV33jjjbbI1zCtSNu3b69wH1MgbEZWnYgpll68eLFGjx5dvm/JkiV2PwDvQrgBUG3Tp0+3XTOmK8iMeDJdMoGBgVq2bJlt0enbt68uvPBCDRw4UMOGDdMTTzxhRxmZ7iFTXGz2HdmNdCyma+dPf/qTLSI2rSBmHp3MzEwbLswIqDFjxhz3saa1xhQNmyJi04ry0EMPHdWSYkLXwoUL7QgtE6Li4uKOeh7TAmQKhcuKob/44gv7vIePvALgHQg3AKrNDIs2I5DMHDeTJk3Szp07bTgwLS0mjJih4iZQmCAzefJkjR07Vnv37lXz5s119tln2+HZlfWXv/zFDiU3I6HM/DqmS8sEjQceeOCEj3vuuefs6w4aNMiGlvvuu88Go8OZkVJm9JP5fkydUGltcEUmiJn6mqeeekp33HGH2rZta0dvmaHkALxLgKkq9vRBAAAA1BbmuQEAAH6FcAMAAPwK4QYAAPgVwg0AAPArhBsAAOBXCDcAAMCvEG4AAIBfIdwAAAC/QrgBAAB+hXADAAD8CuEGAADIn/w/CiO3Rh949OgAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot hypervolume vs generation\n", + "plot_metric_history(exp.runs[0], Hypervolume(ref_point=[3, 3]), x_axis=\"generation\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "paretobench", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/paretobench/metrics.py b/src/paretobench/metrics.py index 8126c0f..fde023a 100644 --- a/src/paretobench/metrics.py +++ b/src/paretobench/metrics.py @@ -20,6 +20,10 @@ class Metric(BaseModel): def name(self): raise NotImplementedError + def get_plot_label(self) -> str: + """Returns label for y axis of plots with the metric.""" + raise NotImplementedError + def __call__(self, pop: Population, problem: Union[Problem, str]): """ Evaluate the metric. @@ -78,6 +82,9 @@ def __call__(self, pop: Population, problem: Union[Problem, str]): def name(self): return "igd" + def get_plot_label(self) -> str: + return "IGD" + class Hypervolume(Metric): """ @@ -157,6 +164,9 @@ def __call__(self, pop: Population, problem: Union[Problem, str]): def name(self): return "hypervolume" + def get_plot_label(self) -> str: + return "Hypervolume" + @dataclass class EvalMetricsJob: diff --git a/src/paretobench/plotting/__init__.py b/src/paretobench/plotting/__init__.py index 8c796a5..9a864ba 100644 --- a/src/paretobench/plotting/__init__.py +++ b/src/paretobench/plotting/__init__.py @@ -8,6 +8,7 @@ history_obj_scatter, history_dvar_pairs, ) +from .metrics import plot_metric_history __all__ = [ "population_dvar_pairs", @@ -16,4 +17,5 @@ "history_obj_animation", "history_obj_scatter", "history_dvar_pairs", + "plot_metric_history", ] diff --git a/src/paretobench/plotting/metrics.py b/src/paretobench/plotting/metrics.py new file mode 100644 index 0000000..0a143d5 --- /dev/null +++ b/src/paretobench/plotting/metrics.py @@ -0,0 +1,57 @@ +import matplotlib.pyplot as plt +from typing import Literal + +from paretobench.containers import History +from paretobench.metrics import Metric, eval_metrics + + +def plot_metric_history( + hist: History, + metric: Metric, + x_axis: Literal["fevals", "generation"] = "fevals", + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, +): + """ + Evaluate and plot evolution of a metric across the populations within a `History` object. + + Parameters + ---------- + hist : History + The genetic algorithm history to plot + metric : Metric + The metric to evaluate and plot + x_axis : Literal["fevals", "generation"] + What value to use for x-axis in plot + fig : plt.Figure | None + Matplotlib figure if plotting to user-provided figure (must also specify axis) + ax : plt.Axes | None + Matplotlib axis to place plot into (must also specify figure) + + Returns + ------- + plt.Figure, plt.Axes + The matplotlib figure and axis the data was plotted to + """ + # Calculate the metrics from the history object + df = eval_metrics(hist, metric) + + if fig is None or ax is None: + fig, ax = plt.subplots() + + # Grab the x values and axis label + if x_axis == "fevals": + x_vals = df["fevals"] + xlabel = "Function Evaluations" + elif x_axis == "generation": + x_vals = df["pop_idx"] + xlabel = "Generation" + else: + raise ValueError(f"Unrecognized value for `x_axis`: {x_vals}") + + # Plot the data + ax.plot(x_vals, df[metric.name]) + ax.set_xlabel(xlabel) + ax.set_ylabel(metric.get_plot_label()) + + return fig, ax