zcahjl3's picture
Deploy data-preserving FigMirror code augmentation 10-case page
6a6928b verified
Raw
History Blame Contribute Delete
4.26 kB
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")
# DATA SECTOR: same scalar field, extrema, and gradient as original.py.
x = np.linspace(-10, 10, 400)
y = np.linspace(-10, 10, 400)
X, Y = np.meshgrid(x, y)
def gauss(X, Y, mu_x, mu_y, sx, sy):
return np.exp(-(((X - mu_x) ** 2) / (2 * sx ** 2) + ((Y - mu_y) ** 2) / (2 * sy ** 2)))
Z1 = gauss(X, Y, -5, 5, 4, 4)
Z2 = gauss(X, Y, 3, 3, 1.5, 1.5)
Z3 = gauss(X, Y, -2, -2, 2.5, 2.5)
Z4 = gauss(X, Y, 5, -4, 3, 2)
Z5 = gauss(X, Y, 0, -6, 2, 2)
Z = (Z1 + Z2 + Z3 + Z4) - 1.5 * Z5
Z = Z / np.abs(Z).max()
max_idx = np.unravel_index(np.argmax(Z), Z.shape)
min_idx = np.unravel_index(np.argmin(Z), Z.shape)
max_loc = (x[max_idx[1]], y[max_idx[0]])
min_loc = (x[min_idx[1]], y[min_idx[0]])
dy, dx = np.gradient(Z, y, x)
magnitude = np.sqrt(dx ** 2 + dy ** 2)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7.4, 3.15), constrained_layout=True)
fig.suptitle("Complex field analysis", x=0.02, y=1.03, ha="left", color=COL_INK, fontweight=600)
levels = np.linspace(-np.abs(Z).max(), np.abs(Z).max(), 30)
cf = ax1.contourf(X, Y, Z, levels=levels, cmap="coolwarm", extend="both")
ax1.contour(X, Y, Z, levels=levels[levels > 0], colors="#20252e", linewidths=0.42, alpha=0.65)
ax1.contour(X, Y, Z, levels=levels[levels < 0], colors="#20252e", linewidths=0.42, linestyles="dashed", alpha=0.55)
ax1.scatter(*max_loc, marker="X", s=52, color="#f2bf3d", edgecolor="#20252e", linewidth=0.55, zorder=5, label="max")
ax1.scatter(*min_loc, marker="P", s=52, color="#40b6c4", edgecolor="#20252e", linewidth=0.55, zorder=5, label="min")
ax1.annotate("max", xy=max_loc, xytext=(-32, 16), textcoords="offset points", arrowprops=dict(arrowstyle="-", lw=0.7, color=COL_MUTED), color=COL_INK)
ax1.annotate("min", xy=min_loc, xytext=(16, -18), textcoords="offset points", arrowprops=dict(arrowstyle="-", lw=0.7, color=COL_MUTED), color=COL_INK)
ax1.set_title("Scalar field", loc="left", color=COL_INK, pad=4)
ax1.set_xlabel("X-axis")
ax1.set_ylabel("Y-axis")
ax1.set_aspect("equal", adjustable="box")
ax1.legend(frameon=False, loc="lower left", ncol=2, handlelength=1.0, columnspacing=0.9)
cbar1 = fig.colorbar(cf, ax=ax1, fraction=0.046, pad=0.025)
cbar1.set_label("Normalized value", color=COL_MUTED)
cbar1.ax.tick_params(length=0, colors=COL_MUTED)
cbar1.outline.set_linewidth(0.55)
im = ax2.imshow(magnitude, extent=[-10, 10, -10, 10], origin="lower", cmap="inferno")
ax2.streamplot(X, Y, dx, dy, color="white", linewidth=0.48, density=1.22, arrowstyle="->", arrowsize=0.68)
ax2.set_title("Gradient magnitude and direction", loc="left", color=COL_INK, pad=4)
ax2.set_xlabel("X-axis")
ax2.set_ylabel("Y-axis")
ax2.set_xlim(-10, 10)
ax2.set_ylim(-10, 10)
ax2.set_aspect("equal", adjustable="box")
cbar2 = fig.colorbar(im, ax=ax2, fraction=0.046, pad=0.025)
cbar2.set_label("Gradient magnitude", color=COL_MUTED)
cbar2.ax.tick_params(length=0, colors=COL_MUTED)
cbar2.outline.set_linewidth(0.55)
for ax in (ax1, ax2):
for spine in ax.spines.values():
spine.set_color("#303642")
spine.set_linewidth(0.7)
ax.tick_params(length=0, colors=COL_MUTED)
save(fig)