Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| import numpy as np | |
| import matplotlib as mpl | |
| import matplotlib.pyplot as plt | |
| mpl.rcParams.update({ | |
| "pdf.fonttype": 42, | |
| "ps.fonttype": 42, | |
| "figure.dpi": 170, | |
| "savefig.dpi": 240, | |
| "font.family": "DejaVu Sans", | |
| "font.size": 8.2, | |
| "axes.titlesize": 9.6, | |
| "axes.labelsize": 8.4, | |
| "xtick.labelsize": 7.2, | |
| "ytick.labelsize": 7.2, | |
| "legend.fontsize": 7.2, | |
| "axes.linewidth": 0.75, | |
| }) | |
| COL_INK = "#172033" | |
| COL_MUTED = "#667085" | |
| COL_GRID = "#d9dee7" | |
| COL_BLUE = "#356ca5" | |
| COL_TEAL = "#2f9c95" | |
| COL_ORANGE = "#d8863b" | |
| COL_RED = "#c75756" | |
| COL_PURPLE = "#8066a8" | |
| COL_GREEN = "#5f9b68" | |
| def polish_axes(ax, grid_axis="y"): | |
| ax.spines["top"].set_visible(False) | |
| ax.spines["right"].set_visible(False) | |
| ax.spines["left"].set_color("#303642") | |
| ax.spines["bottom"].set_color("#303642") | |
| ax.tick_params(length=0, colors=COL_MUTED, pad=3) | |
| if grid_axis: | |
| ax.grid(True, axis=grid_axis, color=COL_GRID, linewidth=0.55, alpha=0.85) | |
| ax.set_axisbelow(True) | |
| def save(fig): | |
| fig.savefig("augmented.png", bbox_inches="tight", facecolor="white") | |
| fig.savefig("augmented.pdf", bbox_inches="tight", facecolor="white") | |
| from matplotlib.gridspec import GridSpec | |
| # DATA SECTOR: same x/t grid, spreading sigma, field U, and sampled grid as original.py. | |
| x = np.linspace(0, 1, 400) | |
| t = np.linspace(0, 1, 400) | |
| X, T = np.meshgrid(x, t) | |
| sigma0 = 0.02 | |
| sigma1 = 0.24 | |
| Sigma = sigma0 + (sigma1 - sigma0) * T | |
| U = np.exp(-((X - 0.5) ** 2) / (2 * Sigma ** 2)) | |
| fig = plt.figure(figsize=(6.1, 4.75)) | |
| gs = GridSpec(4, 1, figure=fig, hspace=0.08) | |
| ax_profile = fig.add_subplot(gs[0, 0]) | |
| ax_contour = fig.add_subplot(gs[1:, 0], sharex=ax_profile) | |
| levels_filled = np.linspace(U.min(), U.max(), 50) | |
| cf = ax_contour.contourf(X, T, U, levels=levels_filled, cmap="viridis", extend="both") | |
| ax_contour.contour(X, T, U, levels=np.linspace(U.min(), U.max(), 10), colors="white", linestyles="--", linewidths=0.35, alpha=0.8) | |
| sample_rate = 40 | |
| ax_contour.scatter(X[::sample_rate, ::sample_rate], T[::sample_rate, ::sample_rate], s=7, c=COL_RED, alpha=0.58, linewidth=0, label="sampled grid") | |
| ax_contour.legend(frameon=False, loc="upper left", handletextpad=0.3) | |
| ax_contour.set_ylabel("t") | |
| ax_contour.set_xlabel("x") | |
| ax_contour.set_yticks(np.linspace(0, 1, 6)) | |
| ax_contour.tick_params(length=0, colors=COL_MUTED) | |
| for spine in ax_contour.spines.values(): | |
| spine.set_color("#303642") | |
| spine.set_linewidth(0.7) | |
| cbar = fig.colorbar(cf, ax=ax_contour, fraction=0.035, pad=0.018) | |
| cbar.set_label("u(x,t)", color=COL_MUTED) | |
| cbar.ax.tick_params(length=0, colors=COL_MUTED) | |
| cbar.outline.set_linewidth(0.55) | |
| t_slice_index = np.argmin(np.abs(t - 0.5)) | |
| ax_profile.plot(x, U[t_slice_index, :], color="#20252e", linewidth=1.5) | |
| ax_profile.fill_between(x, 0, U[t_slice_index, :], color=COL_BLUE, alpha=0.16, linewidth=0) | |
| ax_profile.set_title(f"Profile of U at t={t[t_slice_index]:.2f}", loc="left", color=COL_INK, fontweight=600, pad=3) | |
| ax_profile.set_ylabel("u") | |
| ax_profile.set_ylim(0, 1.05) | |
| polish_axes(ax_profile, "y") | |
| plt.setp(ax_profile.get_xticklabels(), visible=False) | |
| fig.suptitle("Contour field with marginal profile and sampled grid", x=0.08, y=0.985, ha="left", color=COL_INK, fontweight=600) | |
| fig.subplots_adjust(left=0.09, right=0.89, bottom=0.10, top=0.90) | |
| save(fig) | |