ribs.visualize.proximity_archive_plot

ribs.visualize.proximity_archive_plot(archive: ProximityArchive, ax: Axes | None = None, *, df: DataFrame | ArchiveDataFrame | None = None, transpose_measures: bool = False, cmap: str | Sequence[matplotlib.typing.ColorType] | Colormap = 'magma', aspect: 'auto' | 'equal' | float | None = None, ms: float | None = None, lower_bounds: Sequence[float] | None = None, upper_bounds: Sequence[float] | None = None, vmin: float | None = None, vmax: float | None = None, cbar: 'auto' | None | Axes = 'auto', cbar_kwargs: dict | None = None, rasterized: bool = False) None[source]

Plots scatterplot of a ProximityArchive with 2D measure space.

Each marker in the scatterplot is an elite, and its color represents the objective value (objective values default to 0 in the ProximityArchive).

Examples

Single color plot for diversity optimization settings.

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from ribs.archives import ProximityArchive
>>> from ribs.visualize import proximity_archive_plot
>>> archive = ProximityArchive(solution_dim=2,
...                            measure_dim=2,
...                            k_neighbors=5,
...                            novelty_threshold=0.1,
...                            seed=42)
>>> for _ in range(10):
...     x = np.random.uniform(-1, 1, 100)
...     y = np.random.uniform(-1, 1, 100)
...     archive.add(solution=np.stack((x, y), axis=1),
...                 # Objectives default to 0 in this case.
...                 objective=None,
...                 measures=np.stack((x, y), axis=1))
>>> # Plot the archive.
>>> plt.figure(figsize=(6, 6))
>>> # Notice that the colormap is just a single RGB array, and the
... # colorbar is removed since it is just one color.
>>> proximity_archive_plot(archive, cmap=[[0.5, 0.5, 0.5]],
...                        cbar=None)
>>> plt.xlabel("x coords")
>>> plt.ylabel("y coords")
>>> plt.show()
../_images/ribs-visualize-proximity_archive_plot-1.png

Plot where the objective has been recorded while using the archive.

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from ribs.archives import ProximityArchive
>>> from ribs.visualize import proximity_archive_plot
>>> archive = ProximityArchive(solution_dim=2,
...                            measure_dim=2,
...                            k_neighbors=5,
...                            novelty_threshold=0.1,
...                            seed=42)
>>> for _ in range(10):
...     x = np.random.uniform(-1, 1, 100)
...     y = np.random.uniform(-1, 1, 100)
...     archive.add(solution=np.stack((x, y), axis=1),
...                 objective=-(x**2 + y**2),
...                 measures=np.stack((x, y), axis=1))
>>> # Plot the archive.
>>> plt.figure(figsize=(8, 6))
>>> proximity_archive_plot(archive)
>>> plt.title("Negative sphere function")
>>> plt.xlabel("x coords")
>>> plt.ylabel("y coords")
>>> plt.show()
../_images/ribs-visualize-proximity_archive_plot-2.png
Parameters:
archive: ProximityArchive

A 2D ProximityArchive.

ax: Axes | None = None

Axes on which to make the plot. If None, the current axis will be used.

df: DataFrame | ArchiveDataFrame | None = None

If provided, we will plot data from this argument instead of the data currently in the archive. This data can be obtained by, for instance, calling ribs.archives.ArchiveBase.data() with return_type="pandas" and modifying the resulting ArchiveDataFrame. Note that, at a minimum, the data must contain columns for index, objective, and measures. To display a custom metric, replace the “objective” column.

transpose_measures: bool = False

By default, the first measure in the archive will appear along the x-axis, and the second will be along the y-axis. To switch this behavior (i.e. to transpose the axes), set this to True.

cmap: str | Sequence[matplotlib.typing.ColorType] | Colormap = 'magma'

The colormap to use when plotting intensity. Either the name of a Colormap, a list of Matplotlib color specifications (e.g., an \(N \times 3\) or \(N \times 4\) array – see ListedColormap), or a Colormap object.

aspect: 'auto' | 'equal' | float | None = None

The aspect ratio of the heatmap (i.e. height/width). Defaults to 'auto' for 2D and 0.5 for 1D. 'equal' is the same as aspect=1. See matplotlib.axes.Axes.set_aspect() for more info.

ms: float | None = None

Marker size for the solutions.

lower_bounds: Sequence[float] | None = None

Lower bounds of the measure space for the plot. Defaults to the minimum measure value along each dimension of the archive, minus 0.01.

upper_bounds: Sequence[float] | None = None

Upper bounds of the measure space for the plot. Defaults to the maximum measure value along each dimension of the archive, plus 0.01.

vmin: float | None = None

Minimum objective value to use in the plot. If None, the minimum objective value in the archive is used.

vmax: float | None = None

Maximum objective value to use in the plot. If None, the maximum objective value in the archive is used.

cbar: 'auto' | None | Axes = 'auto'

By default, this is set to 'auto' which displays the colorbar on the archive’s current Axes. If None, then colorbar is not displayed. If this is an Axes, displays the colorbar on the specified Axes.

cbar_kwargs: dict | None = None

Additional kwargs to pass to colorbar().

rasterized: bool = False

Whether to rasterize the heatmap. This can be useful for saving to a vector format like PDF. Essentially, only the heatmap will be converted to a raster graphic so that the archive cells will not have to be individually rendered. Meanwhile, the surrounding axes, particularly text labels, will remain in vector format.

Raises:

ValueError – The archive is not 2D.