双变量复函数图像的共形颜色映射实现方法咨询
复映射输入输出颜色匹配实现方案
你不需要手动遍历点逐个提取、赋值颜色,直接利用matplotlib的原生颜色映射规则绑定数值与色阶即可,实现难度和运行效率都远优于手动遍历方案。
实现原理
你最初绘制输入平面着色时,本质是将每个输入点到原点的距离fx = sqrt(A²+B²)映射到了色阶上。只要在绘制输出映射像时,让每个输出点的颜色直接绑定对应输入点的fx值,且两张图使用完全一致的色卡、数值映射范围,就能实现颜色的精准对应:输入原点附近(fx≈0)的点映射到输出平面后会显示为深蓝色,fx值越大颜色越偏向亮部,和输入平面的着色规则完全统一。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt %matplotlib inline # 生成输入复平面网格 a = np.arange(-np.pi, np.pi, 0.1) b = np.arange(-np.pi, np.pi, 0.1) A, B = np.meshgrid(a, b) fx = np.sqrt(A**2 + B**2) # 颜色映射基准值:输入点到原点的距离 # 绘制着色后的输入Argand平面 plt.figure(figsize=(10,10)) # 显式指定色卡和数值范围,保证和输出图色阶完全匹配 im = plt.pcolormesh(A, B, fx, cmap='jet') plt.colorbar(im, label='输入点到原点距离') plt.xlabel('输入实部 Re(z)') plt.ylabel('输入虚部 Im(z)') plt.title('着色输入复平面') plt.show() # 计算双变量复函数映射结果 y = np.exp(1j*A) - np.exp(-1j*B) real = y.real imag = y.imag # 绘制颜色匹配的输出映射像 plt.figure(figsize=(10,10)) # 先绘制浅灰色连线(可选,还原你原本的连线效果) plt.plot(real, imag, color='lightgray', linewidth=0.7, zorder=0) # 散点图直接绑定fx作为颜色值,复用和输入图一致的色卡、数值范围 sc = plt.scatter(real.flatten(), imag.flatten(), c=fx.flatten(), cmap='jet', vmin=fx.min(), vmax=fx.max(), marker='*', edgecolor='r', s=35, zorder=1) plt.colorbar(sc, label='对应输入点到原点距离') plt.xlim(-2.05, 2.05) plt.ylim(-2.05, 2.05) plt.xlabel('输出实部 Re(w)') plt.ylabel('输出虚部 Im(w)') plt.title('复函数映射像(颜色对应输入位置)') plt.show()
关键注意事项
- 不要手动提取
pcolormesh渲染后的像素颜色值:这类操作需要额外处理画布渲染、坐标转换、色阶归一化等逻辑,网格点数量大时运行效率极低,出错概率高。直接传入原始的颜色基准值fx,matplotlib会自动完成统一的颜色映射,不需要额外做颜色值转换。 - 保证颜色一致的核心是两图使用相同的色卡(cmap参数)、相同的数值映射上下限(vmin、vmax参数),避免matplotlib自动缩放色阶导致两边颜色对应关系错位。
- 如果需要切换着色维度,比如用输入点的辐角代替到原点的距离着色,只需要把
fx替换为对应的特征值(例如辐角可写为fx = np.arctan2(B, A)),其余逻辑不需要改动。 - 代码中选用
cmap='jet'是为了匹配你描述的“原点附近显示为深蓝色”的效果,如果需要更换配色,同时修改两处绘图的cmap参数即可。
内容的提问来源于stack exchange,提问作者MathHeero
相关产品推荐
相关产品推荐

