Peter Kovesi有一些非常棒的色彩地图。他提供了一个MATLAB函数,名为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)
请注意,这里的颜色比您的示例更柔和。 colorcet
颜色映射是感知均匀的。这意味着相同角度的变化会导致相同的感知颜色变化。在您发布的示例中,例如黄色是一个非常狭窄、明亮的带子。这样的带子会导致对函数中某些特征的虚假突出,这些特征可能根本不相关。感知均匀的颜色映射对于正确解释数据非常重要。还要注意,这种特定的颜色映射具有易于命名的颜色(紫色、蓝色、绿色、黄色)在四个基本方向上。纯实值为绿色(正数)或紫色(负数),纯虚值为蓝色(正数)或黄色(负数)。error: 'colorcet' undefined near line 5 column 6
。我并不经常使用Octave/Matlab,而我之所以特别要求使用Matlab是因为我无法访问Mathematica,并且我认为Matlab对复杂的绘图选项会更加专业。但是,我的导入软件包等方面的技能程度非常有限。我也在等待其他备选答案。我的意图是给您点赞,并最终关闭此帖子。 - Antoni Parelladacolorcet
。很抱歉没有明确说明。 - Cris Luengo.m
结尾,这是一个很大的提示,它是一个matlab文件。但我不知道该怎么办。您是选择页面中的全部内容,复制并粘贴到Octave控制台中,还是右键单击(Windows),并将其保存在Octave文件夹中的某个位置?如果是这样,您是否知道在哪里保存? - Antoni Parelladaf = z
。如果您想绘制不同的函数,只需从 z
计算即可:例如,f = (z/30).^3 - 4
看起来非常漂亮。请注意 z/30
,这是为了使绘图采样更密集,如果采样太稀疏,它看起来不好。您还可以尝试绘制 f = exp(z/30)
。 - Cris Luengo还有一个非常棒的在线工具,由Juan Carlos Ponce Campuzano制作,可用于颜色环绘图。
根据我的经验,它比Octave解决方案更容易使用。缺点是您不能使用感知统一的着色。