在Matlab中热图上的Xtick标记和Xtick标签

时间:2014-11-11 23:46:45

标签: matlab plot grid matlab-figure heatmap

环境:Windows 7 64位,Matlab 2014a

目标:

  1. 为要优化的两个参数绘制错误热图。
  2. 设置正确的刻度线和刻度值
  3. 在正确的位置绘制网格线
  4. 问题:排列X和Y标记位置和值。当x和y轴上的向量的最后一个(" end")值相同时,我使用的代码正确地给出了滴答和值。但是,当结束值不同时,它不会,并产生一些非常奇怪的东西。

    下面我已经包含了我修改过的代码,以便您可以运行它而无需添加任何内容。当然,在我的情况下,误差向量是误差值,而不是随机数。要看到"最终价值的问题"使用第二个b向量。

    fontsize = 20
    k = [2^-5, 2^-3, 2^-1, 2^0, 2^1, 2^3, 2^5, 2^7, 2^9, 2^11, 2^13, 2^15]
    b = [2^-5, 2^-3, 2^-1, 2^0, 2^1, 2^3, 2^5, 2^7, 2^8, 2^9, 2^10,  2^11, 2^13, 2^15]
    % b = [2^-5, 2^-3, 2^-1, 2^0, 2^1, 2^3, 2^5, 2^7, 2^8, 2^9, 2^10,  2^11, 2^13, 2^19]
    
    errorVector = randi(20, 1, length(b)*length(k))'
    figure
    % Create a matrix from error vector (size of error vector is [length(k)*length(b),1])
    B = reshape(errorVector, [length(b), length(k)])
    B = flipud(B)
    
    % imagesc(x,y,C)
    imagesc(b, k, B)
    title('Heatmap Parameters Percent Error', 'FontSize', fontsize);
    
    % Set colorbar limits
    caxis([0 15])
    colorbar;
    
    ax1 = gca;
    
    xTickLabel = (k)'
    xTick = linspace(k(1), k(end), numel(xTickLabel))';
    set(ax1, 'XTick', xTick, 'XTickLabel', xTickLabel)
    xlabel('k parameter', 'FontSize', fontsize)
    
    yTickLabel = (b)'
    yTick = linspace(b(1), b(end), numel(yTickLabel))';
    set(ax1, 'YTick', yTick, 'YTickLabel', flipud(yTickLabel(:)))
    ylabel('b parameter', 'FontSize', fontsize)
    
    set(ax1,'FontSize', fontsize)
    

    这里,改变b或k向量的任何结束值,程序将输出X和Y标记完全错误的图形。

    另外,我想绘制网格线。当我使用" grid on"它会在刻度线上绘制网格线,这在热图的情况下是不正确的。因为刻度线将位于列的中心 - 或行 - 但网格线应位于列之间的边界 - 或行。

    顺便说一句,如果你知道在Matlab中绘制热图的更好方法,请告诉你。

    请帮我解决这个问题。任何帮助表示赞赏,

    伊利亚斯

1 个答案:

答案 0 :(得分:2)

首先 - 您不需要flipud B矩阵 - 默认情况下imagesc绘制反转的y数据,但您可以使用以下方法修复此问题语句:

set(gca,'ydir','normal');

这也意味着你不必乱搞嘀嗒标签。您可以通过执行以下操作来获得正确的标签:

% replace the imagesc call with:
imagesc(B);
set(gca,'ydir','normal');

% formatting stuff
...

% replace the set commands with:
set(ax1, 'XTick', 1:length(k), 'XTickLabel', k)
set(ax1, 'YTick', 1:length(b), 'YTickLabel', b)

默认情况下,如果您不向imagesc命令提供x和y数据,它将对它们进行线性编号(1,2,3 ...)。基本上我们在这里做的是确保它为bk的每个元素都有刻度,然后将标签设置为相应向量的值。

不幸的是,我不确定是否有办法让网格间距与imagesc对齐。您可以尝试使用pcolor代替它,它有自己的一组问题,但允许您在元素之间获取网格线(排序)。它还允许您使用插值着色模式,这将使您的绘图看起来更像典型的热图。

要改为使用pcolor,您只需要替换imagesc

% imagesc(B);
% set(gca,'ydir','normal');
pcolor(B);
% this uses a smoother shading method, for a more 'heatmap' like output
% shading interp

我相信,其他一切都应该按预期运作。