如何在使用matlab生成的混淆矩阵中添加垂直线?

时间:2019-01-17 12:35:46

标签: matlab confusion-matrix

我使用以下代码生成我的混淆矩阵,该矩阵在互联网上找到:

    confmat = C;
    labels = {'0', '1', '2', '3', '11' };
    numlabels = size(confmat, 1); % number of labels
    confpercent = 100*confmat./repmat(sum(confmat, 1),numlabels,1);
    imagesc(confpercent);
    Mycolors=[0 0.7 0.4; 1 0.9 0.9 ]
    colormap(flipud(Mycolors));
    textStrings = num2str([confpercent(:)], '%.1f%%\n');
    textStrings = strtrim(cellstr(textStrings));
    [x,y] = meshgrid(1:numlabels);
    hStrings = text(x(:),y(:),textStrings(:), ...
        'HorizontalAlignment','center');
    midValue = mean(get(gca,'CLim'));
    textColors = repmat(confpercent(:) > midValue,1,3);
    set(hStrings,{'Color'},num2cell(textColors,2));
    set(gca,'XTick',1:numlabels,... 'XTickLabel',labels,... 'YTick',1:numlabels,... 'YTickLabel',labels,...  'TickLength',[0 0]);

我得到了下一个矩阵Here the one I have obtained

虽然我想在矩阵中添加垂直线以在值之间进行分隔,所以我可以得到与下一个相似的线:

The one I am intersted to get

我可以使用pcolor(confusion_matrix)来获得那些垂直线,但是百分比被拖到每个网格的角落,我得到了下一张图片: Picture obtained with pcolor

2 个答案:

答案 0 :(得分:0)

使用另一个axes对象

必须处理不同的axes属性时的经典MATLAB技巧。 基本上,我们将创建一个新的axes对象,将其放在珍贵的对象之上,然后使其透明(无背景色),以便我们可以看到后面的内容,但我们将使网格线保持清晰可见就在我们想要的地方。

因此,在您的示例代码之后,立即添加:

ax1 = gca  ; % get handle of initial axes
ax2 = axes ; % create new axe and retrieve handle

lim = [0 numlabels] ; % Prepare X and Y properties
tks = 0:numlabels ;

% superpose the new axe on top, at the same position
set(ax2,'Position', get(ax1,'Position') );

% make it transparent (no color)
set(ax2,'Color','none') ;

% set the X and Y properties
set(ax2, ...
    'XLim',lim,'XTick',tks,'XTickLabel','' ,...
    'YLim',lim,'YTick',tks,'YTickLabel','' ) ;

% now set your grid properties
set(ax2,'GridColor','k','GridAlpha',1)

这会让您(数据有所不同,因为我随机生成了混淆矩阵):

enter image description here

当然,现在您可以完全控制网格线,因此您还可以通过axes的网格属性来优化网格线的显示方式。一些有趣的属性是:

  • GridLineStyle-网格线的线型
  • GridColor-网格线的颜色
  • GridAlpha-网格线透明度
  • LineWidth-线宽

有关更多详细信息,请参阅Axes Properties的文档

答案 1 :(得分:0)

好! 我已经找到了获取垂直和水平线的要求的东西,即只需使用plot并按住就可以添加线:

我在问题中提到的代码的末尾使用了下一个代码:

hold on
plot ([2 2],get(gca, 'YLim'), 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot ([1 1],get(gca, 'YLim'), 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot ([3 3],get(gca, 'YLim'), 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot ([4 4],get(gca, 'YLim'), 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)

plot (get(gca, 'XLim'), [1 1], 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot (get(gca, 'XLim'), [2 2], 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot (get(gca, 'XLim'), [3 3], 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)
plot (get(gca, 'XLim'), [4 4], 'Color', [0.15, 0.15, 0.15],'LineWidth',0.5)

我使用了1、2、3和4,因为我有四个类别,并且在每个类别的末尾预测结果都需要绘制线。 希望会有用