Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何生成非线性颜色贴图/颜色条?_Matlab_Matlab Figure_Colorbar_Colormap - Fatal编程技术网

Matlab 如何生成非线性颜色贴图/颜色条?

Matlab 如何生成非线性颜色贴图/颜色条?,matlab,matlab-figure,colorbar,colormap,Matlab,Matlab Figure,Colorbar,Colormap,我想展示第一张图片中的非均匀色条。我已经试过下面的代码了。”mycamp4'是手动保存的颜色映射。结果如第二幅图所示。数字0.1和1.5也将过于接近,请参见。如何制作第一张图片中的颜色条 v = [0.1 1 1.5 5 7.5 10 30]; v_2 = [0.1 1.5 5 7.5 10 30]; contourf(X,Y,pdf_normal',v); h = colorbar; load('MyColormaps','mycmap4'); set(gcf,'Colormap',mycma

我想展示第一张图片中的非均匀色条。我已经试过下面的代码了。”mycamp4'是手动保存的颜色映射。结果如第二幅图所示。数字
0.1
1.5
也将过于接近,请参见。如何制作第一张图片中的颜色条

v = [0.1 1 1.5 5 7.5 10 30];
v_2 = [0.1 1.5 5 7.5 10 30];
contourf(X,Y,pdf_normal',v);
h = colorbar;
load('MyColormaps','mycmap4');
set(gcf,'Colormap',mycmap4);
set(h, 'YTick', v_2)
图片1:

图片2:


当您尝试使用
doc colorbar
时,您将找到对colormap的引用。在尝试了
doc colormap
之后,他们基本上给出了3个选项来设置颜色映射

  • 输入地图(例如,通过
    get
    获得的地图或先前设计的地图,这是您尝试的)
  • 使用属性编辑器选择内置的颜色贴图
  • 使用Colormap编辑器,可从figure菜单上的Edit>Colormap访问

  • @霍奇勒已经提到了,但我想你以前没有听说过。因此,我怀疑选项3最适合您。

    这里是一个逐步的解释

    首先考虑下面的例子:

    [X,Y,Z1] = peaks;
    
    figure(1)
    [~,h1] = contourf(X,Y,Z1,20);
    a1 = colorbar;
    colormap(jet)
    caxis([-6,6])
    
    这将为您提供以下绘图:

    它具有线性数据和线性彩色贴图。现在,我想缩放
    Z
    -数据,使其像您的情况一样非线性。我选择了一个简单的数据平方

    Z2 = get(h1,'ZData');
    scalefactor = @(x) sign(x).*x.^2;
    Z2 = scalefactor(Z2);
    
    这是实际的示例数据,与您的类似:

    figure(2)
    [~,h2] = contourf(X,Y,Z2,20);
    a2 = colorbar;
    colormap(jet)
    caxis([-6^2,6^2])
    

    现在我们有了非线性数据,但仍然是线性的
    colormap
    colorbar

    到目前为止,一切都是为了生成与您类似的示例数据。


    现在实际答案是:

    获取绘图的数据:

    Z3 = get(h2,'ZData');
    
    用你希望或多或少了解的关系来衡量它:

    descalefactor = @(x) sign(x).*abs(x).^(1/2);
    Z3 = descalefactor(Z3);
    
    绘制缩放数据:

    figure(3)
    [~,h3] = contourf(X,Y,Z3,20);
    a3 = colorbar;
    colormap(jet)
    caxis([-6,6])
    
    获取
    Y-Ticks
    使用反向函数对其进行缩放
    ,就像您的数据一样:

    ticks = get(a3,'YTick');
    ticks = scalefactor(ticks);
    
    设置这些反向缩放的颜色条刻度:

    set(a3,'YTickLabel',ticks)
    
    最终,你会得到一个看似线性化的绘图(但你可以从之前备份你的非线性数据),带有一个带有非线性颜色贴图和颜色条刻度的图形

    正如预期的那样,该图与示例中的第一个图相同,但具有缩放的颜色条轴


    如果没有任何函数关系,请尝试获取函数关系,例如,使用曲线拟合工具箱

    您可以自定义颜色栏中的颜色贴图和刻度,但颜色栏本身是基于线性间隔的,您无法更改

    不过还有一个解决办法

    假设您希望颜色条与图1中的颜色条一样,具有N个非线性间隔(例如,如果N=2,则颜色限制=[1 2 20])。 你必须:

    1) 为数据定义另一个变量。e、 g

    data2 = nan(size(data));
    for i=1:N
       b = data>color_limits(i) & data>=color_limits(i+1);
       data2(b) = i-0.5;
    end
    
    基本上,您是使用颜色限制中的间隔将数据装箱到将显示的不同变量data2中

    2) 制作data2的图像

    3) 定义颜色条限制:caxis([0 N])

    4) 使用N种颜色定义颜色贴图,例如颜色贴图(jet(N))


    5) 自定义颜色栏中的刻度

    您可以尝试Recolor\u contourf。它有两个以上的功能和易于使用。 在其帮助下,给出了如下示例。该函数由我提交。如果遇到任何问题,请告诉我

    X=1:10;Y=1:10;
    C=rand(10,10)*150;
    c=colormap(jet(7));
    L=[10 20 50 60 70 100];
    [cdd hc]=contourf(X,Y,C,[-5 L]);
    Recolor_contourf(hc,c,L,'vert');
    

    也许这会有帮助:你的意思是你想要一个非均匀的彩色地图
    colorbar
    通常只显示
    colormap
    是什么。我想你已经试过了。您应该在文件交换上搜索自定义颜色映射。旁注,第一张图片中的颜色条的值似乎大于30,而第二张颜色条仅显示30之前的值。@DennisJaheruddin我认为它们没有关系。亲爱的丹尼斯,非常感谢你的回复。事实上,我已经尝试了colormap ediotor(“mycmap4”在我的原始代码中)。但它不会改变colorab的比例。例如,我希望0.1到1之间的距离与1到2.5之间的距离相同。我认为@thewaywewalk提到的对数刻度色条接近我想要的。但我需要的不是对数刻度,而是一个“定制”刻度。我看到的唯一方法是完全线性化你的数据,与你想要的关系。然后使用自定义的勾号标签。嗨@thewaywewalk,非常感谢!!它似乎起作用了。我要试一试!快速提示:我发现,如果更改窗口的大小,使颜色栏上的记号数量发生变化,它们将不再与颜色栏正确匹配(事实上,如果添加新的记号,它们将重复它们自己)。调整图形大小后,您必须重新缩放颜色栏。@标记这是真的,这就是为什么您应该创建具有正确大小的图形的原因。