codex/haar-wavelet-multiscale-reconstruction.py

haar-wavelet-multiscale-reconstruction.py
"""Original four-step Haar projections at three resolutions; PNG to CWD."""
from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np


def main():
    edges = np.linspace(0, 1, 5)
    signal = np.array([2., 4., 6., 8.])
    approximations = [np.full(4, 5.), np.array([3., 3., 7., 7.]), signal]
    titles = [r"$P_0f=5\phi$",
              r"$P_1f=5\phi-2\psi$",
              r"$P_2f=P_1f-(\psi_{1,0}+\psi_{1,1})/\sqrt{2}$"]
    colors = ["#bf7135", "#238367", "#246a9b"]
    fig, axes = plt.subplots(1, 3, figsize=(11.2, 4.1), dpi=120, sharey=True)
    fig.patch.set_facecolor("white")
    for level, (ax, values, title, color) in enumerate(
            zip(axes, approximations, titles, colors)):
        ax.stairs(values, edges, color=color, lw=3, label=f"Level {level}")
        ax.stairs(signal, edges, color="#333333", lw=1.4,
                  linestyle="--", label="Original f", zorder=3)
        for left, right, original, approx in zip(
                edges[:-1], edges[1:], signal, values):
            ax.fill_between([left, right], [original, original],
                            [approx, approx], color=color, alpha=.13)
        ax.set(xlim=(0, 1), ylim=(0, 9), xlabel="x", title=title)
        ax.set_xticks([0, .25, .5, .75, 1])
        ax.set_facecolor("white")
        ax.spines[["top", "right"]].set_visible(False)
        ax.grid(alpha=.12)
        ax.legend(loc="upper left", frameon=False, fontsize=9)
        error = np.sum((signal-values)**2)/4
        ax.text(.5, -.34, rf"Squared $L^2$ error: {error:g}",
                transform=ax.transAxes, ha="center", fontsize=11)
    axes[0].set_ylabel("Function value")
    fig.suptitle("Mean + global contrast + local contrasts = exact reconstruction",
                 fontsize=14)
    fig.subplots_adjust(left=.055, right=.98, top=.74, bottom=.26, wspace=.2)
    fig.savefig(Path.cwd() / Path(__file__).with_suffix(".png").name,
                facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()