Octave (Matlab) 中复杂函数的域着色(色轮)图

Domain coloring (color wheel) plots of complex functions in Octave (Matlab)

我知道 domain or color wheel plotting 是复杂函数的典型代表。

令人难以置信的是,我无法在网络搜索中找到一百万 + returns 来轻松地让我在维基百科中复制一些艺术品:

有这个 online resource 可以用黑色再现带有零的图 - 一点也不差......但是,我想在 Octave 中请求一些简单的带注释的代码来生成函数的彩色图复数。

这是一个例子:

我看到 here 绘制复杂函数的代码。但是,它使用了不同的技术,高度代表函数图像的 Re 部分,颜色代表虚部:

Peter Kovesi has some fantastic color maps. He provides a MATLAB function, called colorcet,我们可以在这里使用它来获得表示相位所需的循环颜色图。 在运行下面的代码之前下载这个函数。

让我们开始创建一个complex-valued测试函数f,其中幅度从中心增加,相位等于围绕中心的角度。很像你展示的例子:

% A test function
[xx,yy] = meshgrid(-128:128,-128:128);
z = xx + yy*1i;
f = z;

接下来,我们将获取它的相位,将其转换为 colorcet C2 颜色图(循环)的索引,最后将其重塑回原始函数的形状。 out这里有3个维度,前两个是原始维度,最后一个是RGB。 imshow 将这样的 3D 矩阵显示为彩色图像。

% Create a color image according to phase
cm = colorcet('C2');
phase = floor((angle(f) + pi) * ((size(cm,1)-1e-6) / (2*pi))) + 1;
out = cm(phase,:);
out = reshape(out,[size(f),3]);

最后一部分是使用 f 的幅度来调制这些颜色的强度。为了在 2 的幂处产生不连续性,我们取以 2 为底的对数,应用模运算,然后再次计算 2 的幂。与 out 的简单乘法会在必要时降低颜色的强度:

% Compute the intensity, with discontinuities for |f|=2^n
magnitude = 0.5 * 2.^mod(log2(abs(f)),1);
out = out .* magnitude;

最后一个乘法适用于 Octave 和更高版本的 MATLAB。对于旧版本的 MATLAB,您需要使用 bsxfun 代替:

out = bsxfun(@times,out,magnitude);

最后使用imshow显示:

% Display
imshow(out)

请注意,此处的颜色比您的示例中的颜色更柔和。 colorcet 色图在感知上是一致的。这意味着相同的角度变化会导致相同的颜色感知变化。在您发布的示例中,例如黄色是一条非常窄、明亮的带。这样的带会导致函数中某些特征的错误突出显示,这些特征可能根本不相关。感知上均匀的彩色图对于正确解释数据非常重要。另请注意,此特定颜色图在四个主要方向上具有 easily-named 种颜色(紫色、蓝色、绿色、黄色)。纯实数值为绿色(正)或紫色(负),纯虚数值为蓝色(正)或黄色(负)。

还有一个很棒的online tool made by Juan Carlos Ponce Campuzano色轮绘图。

根据我的经验,它比 Octave 解决方案更容易使用。缺点是您不能使用感知上均匀的着色。