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

时间:2018-02-26 00:29:41

标签: plot octave complex-numbers colormap

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

令人难以置信的是,我无法在网络搜索中找到百万以上的回报,以便轻松地让我在维基百科中重现一些艺术作品:

enter image description here

有这个online resource用黑色的零重现情节 - 一点也不差......但是,我想在Octave中要求一些简单的带注释的代码来生成颜色的函数颜色。复数。

以下是一个例子:

domain plotting of complex functions

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

Example of Matlab solution to visualize 4D data

2 个答案:

答案 0 :(得分:4)

Peter Kovesi有一些很棒的彩色地图。他提供了一个MATLAB function, called colorcet,我们可以在这里使用它来获得我们需要表示相位的循环颜色图。 在运行以下代码之前下载此功能。

让我们从创建一个复值测试函数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)

output of code above

请注意,此处的颜色比示例中的颜色更柔和。 colorcet色彩图在感知上是统一的。这意味着角度的相同变化导致颜色的感知变化相同。在你发布的例子中,例如黄色是一个非常狭窄,明亮的乐队。这样的频带导致功能中某些特征的错误突出显示,这可能根本不相关。感知统一的彩色图对于正确解释数据非常重要。另请注意,此特定颜色贴图在四个基本方向上具有易于命名的颜色(紫色,蓝色,绿色,黄色)。纯粹的实际值是绿色(正面)或紫色(负面),纯虚构值是蓝色(正面)或黄色(负面)。

答案 1 :(得分:0)

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

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