Visualizing Results

EGTtools provides a set of flexible plotting functions to help you visualize evolutionary dynamics, fixation probabilities, strategy distributions, and gradients of selection. The plotting utilities are organized into: - 2-strategy plots, - Simplex plots for 3 strategies, - General-purpose plots for higher-dimensional cases.

—

Populations with 2 Strategies

The Gradient of Selection and Stability in Infinite Populations

To visualize the gradient of selection under replicator dynamics for 2-strategy games, use:

  • egttools.plotting.indicators.plot_gradients

Example:

import numpy as np
import egttools as egt

payoffs = np.array([[-0.5, 2.], [0., 0]])
x = np.linspace(0, 1, 101)
gradient_function = lambda x: egt.analytical.replicator_equation(x, payoffs)
gradients = np.array([gradient_function([xi, 1-xi]) for xi in x])

egt.plotting.indicators.plot_gradients(
    gradients[:, 0],
    xlabel="frequency of hawks",
    roots=[0.0, 0.5, 1.0],
    stability=[-1, 1, -1]
)

This function can also indicate the stability of roots using different markers.

—

The Gradient of Selection in Finite Populations

To plot gradients obtained under stochastic evolutionary dynamics in finite populations, use the same plotting function:

  • egttools.plotting.indicators.plot_gradients

Example:

from egttools.analytical import PairwiseComparison

Z = 100  # Population size
beta = 1
A = np.array([[-0.5, 2.], [0., 0]])

game = egt.games.Matrix2PlayerGameHolder(2, A)
evolver = PairwiseComparison(Z, game)

gradients = np.array([
    evolver.calculate_gradient_of_selection(beta, np.array([k, Z-k]))
    for k in range(Z + 1)
])

egt.plotting.indicators.plot_gradients(
    gradients[:, 0],
    xlabel="frequency of hawks (k/Z)"
)

—

Plotting the Stationary Distribution

To visualize stationary distributions over states or strategies:

  • egttools.plotting.helpers.plot_stationary_distribution

  • egttools.plotting.helpers.plot_strategy_distribution

Example for a simple distribution:

stationary_distribution = np.random.rand(101)
stationary_distribution /= stationary_distribution.sum()

egt.plotting.helpers.plot_stationary_distribution(
    stationary_distribution,
    xlabel="number of cooperators",
    ylabel="probability"
)

For strategy distributions (especially when the state space is too large to track full states):

strategy_distribution = np.random.rand(2)
strategy_distribution /= strategy_distribution.sum()

egt.plotting.helpers.plot_strategy_distribution(
    strategy_distribution,
    strategy_labels=["Hawk", "Dove"]
)

—

Populations with 3 Strategies

The Simplex2D Class

For visualizing three-strategy dynamics on a 2D simplex, EGTtools provides:

  • egttools.plotting.simplex2d.Simplex2D

The Simplex2D class allows plotting gradients, stationary distributions, and evolutionary trajectories on the 2-simplex (triangle).

Initialization:

from egttools.plotting.simplex2d import Simplex2D

simplex = Simplex2D(nb_points_per_axis=50)

You can plot vector fields, color maps, or trajectories using its methods.

—

The Gradient of Selection and Stability in Infinite Populations

You can plot the deterministic flow of replicator dynamics in a three-strategy game:

# Assuming you have a function that computes dx/dt given x
def gradient_function(x):
    # Example dummy function
    return np.array([-x[0] * (1 - x[0]), x[1] * (1 - x[1])])

simplex.plot_quiver(gradient_function)

—

The Gradient of Selection and Stationary Distribution in Finite Populations

You can also plot heatmaps of stationary distributions over the simplex:

stationary_distribution = np.random.rand(simplex.nb_points)
simplex.plot_stationary_distribution(stationary_distribution)

—

Populations with More Than 3 Strategies

Currently, for more than 3 strategies, EGTtools provides basic plotting utilities such as bar plots for strategy frequencies:

  • egttools.plotting.helpers.plot_strategy_distribution

Example:

strategy_distribution = np.random.rand(5)
strategy_distribution /= strategy_distribution.sum()

egt.plotting.helpers.plot_strategy_distribution(
    strategy_distribution,
    strategy_labels=["A", "B", "C", "D", "E"]
)

Advanced visualization methods (e.g., 3D simplexes for 4 strategies) are under development.

Note

Support for plotting 3D simplexes (tetrahedrons) for 4-strategy populations is planned for future versions.