如何在Matlab中为非单调数据重新定义'YTick'(或'YTickLabel')colorbar的属性?

时间:2015-10-06 19:03:10

标签: matlab colorbar

我根据我的数据开发了一个包含15个条目的新R,G,B色彩图。这些条目在单调增长序列中在[0.0,1.0]范围内变化,并且表示与15个样本相关联的参数P的值。例如,3对(P,样本号)将是(0.0,266); (0.5,262); (1.0,276)

问题:我希望P在颜色栏中从红色显示为蓝色,但是'ticks'标记15个样本的数字。

this post中讨论了如何操纵colorbar的'YTickLabel'。

在MathWorks的this second post中,通过调用颜色条句柄cbr并使用set(cbr,'YTick',20:2:50) - 可以轻松实现更改刻度数量的解决方案 - 如其中所述。然而,听起来我觉得两种方式都很好,因为数据是单调的并且有少量的滴答声。

在我的情况下,P单调增长,但与它们相关的样本数字却没有。此外,有15个滴答。

然后,有人建议我如何才能正确放置这15个刻度线并与“southoutside”位置一起使用以使颜色条处于水平位置?

我的尝试如下:对于这两种情况,colorbar的打印次数不超过8次。我也没有成功使用'YTick',因为样本数字不是单调的。

  1. 更“花哨”的方式:

    samplex = [ 266, 267, 265, ..., 262, 276 ]; % vector of 15 sample numbers 
    sx = num2str(samplex);
    sx = cellstr(sx);
    hx = colorbar;
    set(hx,'YTickLabel',sx)
    
  2. 逐点添加

    hx = colorbar;
    set(hx,'YTickLabel',{'266','262',...,'276'})
    
  3. Colormap矩阵:这是CX中名为format short的色彩映射矩阵:

    CX = 
        0.5397         0         0
        1.0000    0.4603         0
        1.0000    0.5714         0
        0.4603    1.0000    0.5397
        0.4286    1.0000    0.5714
             0    0.9206    1.0000
             0    0.2857    1.0000
             0    0.1905    1.0000
             0    0.1905    1.0000
             0    0.0476    1.0000
             0         0    0.9683
             0         0    0.9683
             0         0    0.9524
             0         0    0.7143
             0         0    0.5079
    

    然后,我使用

    cx = colormap(CX); 
    axis off; 
    set(gcf,'color','None');
    
    在我的尝试中引用set命令之前

    感谢您的帮助。

    备注:我只需要设置颜色条,然后将其导出到.pdf,没有背景颜色,图形或轴。这一步没问题。这是一个示例图:

    Colorbar with the only 8 entries.

1 个答案:

答案 0 :(得分:2)

您想要修改由colorbar创建的对象的TicksTickLabels属性:

例如:

CX = [0.539700, 0.000000, 0.000000; ...
1.000000, 0.460300, 0.000000; ...
1.000000, 0.571400, 0.000000; ...
0.460300, 1.000000, 0.539700; ...
0.428600, 1.000000, 0.571400; ...
0.000000, 0.920600, 1.000000; ...
0.000000, 0.285700, 1.000000; ...
0.000000, 0.190500, 1.000000; ...
0.000000, 0.190500, 1.000000; ...
0.000000, 0.047600, 1.000000; ...
0.000000, 0.000000, 0.968300; ...
0.000000, 0.000000, 0.968300; ... 
0.000000, 0.000000, 0.952400; ...
0.000000, 0.000000, 0.714300; ...
0.000000, 0.000000, 0.507900];

cmap = colormap(CX);
cbar = colorbar;

给我们以下内容:

yay1

colorbar的范围取决于axes链接到的colorbar对象中的值范围。对于空白轴,我们得到的颜色条范围为[0, 1]。对于类似surf(peaks)的内容,我们得到(大致)[-6.5 8.08]。超出此范围的刻度将不会呈现。考虑到这一点,对于空白轴我们可以做类似的事情:

nticks = 15;
cbar.Ticks = 0:(1/nticks):1;

这给了我们:

yay2

然后我们可以相应地修改刻度标签:

% Generate Fibonacci sequence, because why not
a = zeros(1, nticks + 1);
a(1) = 1; a(2) = 1;
ii = 3;
while ii <= nticks + 1
    a(ii) = a(ii-2) + a(ii-1);
    ii = ii + 1;
end

cbar.TickLabels = a;

离开我们:

yay3

请注意,请参阅colorbar的文档:

  

刻度标记标签,指定为字符串,数字数组或字符串

的单元格数组

所以你不仅限于数字向量。

编辑:以上假定使用R2014b或更新版本以使用dot notation to access properties of graphics objects

对于旧版本的MATLAB,请使用set

set(cbar, 'Ticks', 0:(1/nticks):1);
set(cbar, 'TickLabels', a);

产生相同的结果。