Source code for nodefinder.search.plot

# -*- coding: utf-8 -*-

# © 2017-2019, ETH Zurich, Institut für Theoretische Physik
# Author: Dominik Gresch <greschd@gmx.ch>
"""
Defines functions for plotting the results of the search step.
"""

import itertools
from types import MappingProxyType

import numpy as np
from fsc.export import export

from .._common_plot import _setup_plot


[docs]@export def points(result, *, axis=None): """ Plot the nodal points of a given result. Arguments --------- result : SearchResultContainer Result whose nodal points should be plotted. axis : matplotlib.axes.Axes, optional Axes on which the points should be plotted. """ fig, axis, is_3d = _setup_plot(result.coordinate_system.limits, axis=axis) x_coords = [] y_coords = [] if is_3d: z_coords = [] vals = [] for node in result.nodes: pos = node.pos x, y, *z = pos x_coords.append(x) y_coords.append(y) if is_3d: z_coords.append(z[0]) vals.append(node.value) if is_3d: coords = [x_coords, y_coords, z_coords] else: coords = [x_coords, y_coords] axis.scatter(*coords, c=vals) return fig, axis
[docs]@export def simplices( result, *, nodes=(), axis=None, line_settings=MappingProxyType(dict(color='C0')) ): """ Plot the simplices used in the minimization for a given node. Arguments --------- result : SearchResultContainer Result of the search step. nodes : list(MinimizationResult) Nodes for which the simplex history should be plotted. axis : matplotlib.axes.Axes, optional Axes on which the points should be plotted. line_settings : dict Keyword arguments passed to :meth:`matplotlib.axes.Axes.plot`. """ fig, axis, _ = _setup_plot(result.coordinate_system.limits, axis=axis) for node in nodes: for simplex in node.simplex_history: _plot_simplex(axis=axis, simplex=simplex, **line_settings) return fig, axis
[docs]@export def stencil( stcl, *, axis=None, line_settings=MappingProxyType(dict(color='C0')), origin_settings=MappingProxyType(dict(color='C1')), plot_sphere=True, sphere_settings=MappingProxyType(dict(color='C2', alpha=0.2)) ): """ Plot a refinement stencil. """ dim = stcl.shape[-1] vertices = stcl.reshape(-1, dim) limits = list(zip(np.min(vertices, axis=0), np.max(vertices, axis=0))) fig, axis, _ = _setup_plot(limits, axis=axis) for simplex in stcl: _plot_simplex(axis=axis, simplex=simplex, **line_settings) if origin_settings is not None: axis.scatter(*np.zeros(dim), **origin_settings) if plot_sphere: if dim == 2: phi = np.linspace(0, 2 * np.pi, 200) axis.plot(np.cos(phi), np.sin(phi), **sphere_settings) elif dim == 3: phi = np.linspace(0, 2 * np.pi, 200) theta = np.linspace(0, np.pi, 200) x = np.outer(np.cos(phi), np.sin(theta)) y = np.outer(np.sin(phi), np.sin(theta)) z = np.outer(np.ones_like(phi), np.cos(theta)) axis.plot_surface(x, y, z, **sphere_settings) return fig, axis
def _plot_simplex(axis, simplex, **kwargs): for start, end in itertools.combinations(simplex, 2): values = list(np.array([start, end]).T) axis.plot(*values, **kwargs)