Plot 复函数的域着色(色轮)倍频程图(Matlab)

Plot 复函数的域着色(色轮)倍频程图(Matlab),plot,octave,complex-numbers,colormap,Plot,Octave,Complex Numbers,Colormap,我知道这是复杂函数的典型情况 令人难以置信的是,我在网络搜索中找不到超过一百万的回报率来轻松复制维基百科中的这幅艺术作品: 这是一个用黑色的零复制的绘图-一点也不坏。。。然而,我想要一些简单的八度带注释的代码来生成复数函数的彩色图 以下是一个例子: 我看到了绘制复杂函数的代码。然而,它使用不同的技术,高度表示函数图像的Re部分,颜色表示虚部: 有一些很棒的彩色地图。他提供了一个,我们可以在这里使用它来获得表示相位所需的循环颜色映射。在运行下面的代码之前,请下载此函数 让我们从创建复值测试函数f开

我知道这是复杂函数的典型情况

令人难以置信的是,我在网络搜索中找不到超过一百万的回报率来轻松复制维基百科中的这幅艺术作品:

这是一个用黑色的零复制的绘图-一点也不坏。。。然而,我想要一些简单的八度带注释的代码来生成复数函数的彩色图

以下是一个例子:

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

有一些很棒的彩色地图。他提供了一个,我们可以在这里使用它来获得表示相位所需的循环颜色映射。在运行下面的代码之前,请下载此函数

让我们从创建复值测试函数f开始,其中幅值从中心开始增加,相位等于围绕中心的角度。与您展示的示例非常相似:

% A test function
[xx,yy] = meshgrid(-128:128,-128:128);
z = xx + yy*1i;
f = z;
接下来,我们将得到它的相位,将它转换成一个索引到循环的colorcet C2颜色贴图中,最后将其重塑为原始函数的形状。这里有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为底的对数,应用模运算,然后再次计算二的幂。如果需要,简单的带out的乘法会降低颜色的强度:

% Compute the intensity, with discontinuities for |f|=2^n
magnitude = 0.5 * 2.^mod(log2(abs(f)),1);
out = out .* magnitude;
最后的乘法在八度音阶和更高版本的MATLAB中工作。对于旧版本的MATLAB,您需要改用bsxfun:

最后,使用imshow显示:


请注意,这里的颜色比示例中的颜色更柔和。colorcet颜色贴图在感知上是一致的。这意味着角度的相同变化导致颜色的相同感知变化。例如,在您发布的示例中,黄色是一个非常窄的亮带。这样的波段会导致函数中某些功能的错误突出显示,这可能根本不相关。感知均匀的彩色地图对于正确解释数据非常重要。还要注意的是,这个特殊的颜色映射很容易在四个基本方向上命名为紫色、蓝色、绿色和黄色。纯实值是绿色正值或紫色负值,纯虚值是蓝色正值或黄色负值。

你说的是2D函数吗?@CrisLuengo我在看复变量的复函数:R^2映射到R^2。非常好。非常感谢。由于代表率低,我无法提高投票率。我稍后会再讨论……你的答案很好。我在八度音阶的再现上遇到了一些问题。具体地说,我在第5行第6列附近得到一个错误:“colorcet”未定义。我根本不经常使用Octave/Matlab,我确实要求使用它,因为我没有Mathematica的访问权限,我认为Matlab在复杂的绘图选项上会很重要。然而,我的舒适度是最低的。我也在等待其他的答案。我的意图是投票。我最终会结束这篇文章。@Undernotbehere:你需要从我在答案顶部证明的链接下载colorcet。很抱歉没有说清楚。实际上,我已经到达了那个页面,试图复制你的发现。我确实看到URL地址以.m结尾,这暗示它是一个matlab文件。但我不知道该怎么办。您是选择页面中的所有内容,在Octave控制台上复制并通过,还是右键单击Windows并保存在Octave文件夹中的某个位置?如果是这样,你知道在哪里吗?@不应该在这里:右键单击链接并保存到当前目录。八度音阶会在那里找到。如果您需要能够从多个目录访问它,请将其保存到您选择的任何目录,并使用addpath将该目录添加到Octave路径。注意,该路径不会在会话之间保存,因此每次启动Octave时都需要这样做。Linux和MacOS上的文件~/.octaverc每次启动Octave时都会执行,您也可以将addpath命令放在其中。
out = bsxfun(@times,out,magnitude);
% Display
imshow(out)