使用imagesc在绘图中跳过某些轴标签

时间:2015-02-03 15:51:11

标签: image matlab plot heatmap labels

我使用matlab的imagesc命令创建了一个大热图。它绘制了x和y轴上每个值组合的误差输出。从图中可以看出,轴标签太多了。这可能会变得更加密集,因为我计划增加x和y轴上的点数 - 这意味着我将在更精细的网格上获得更多输出。

我希望对标签保持灵活性,并跳过其中一些标签。我想为X和Y做这个。我也希望灵活运用" ticks"并绘制所有这些或者可能会跳过其中的一些。请记住,X和Y值都没有按顺序增加,首先增量为0.01表示9点,然后是0.1,然后是1或3或其他。我也会改变这些增量。

我试图在第二张图片中显示我想要的图形。我只想要用红色框显示的标签。正如我所说,这些不是设定值,我将使增量更小,这将导致更密集的情节。

感谢您的帮助。

enter image description here

enter image description here

操作系统:Windows 7,8(64位)

Matlab版:Matlab 2014 a

3 个答案:

答案 0 :(得分:1)

您可以像这样操作刻度线和标签:

ticksarray=[1 33 41 100 ...] % edit these to whatever you want
tickslabels={'1', '33', '41', '100'; ...} % match the size of both arrays

set(gca,'XTick',ticksarray)
set(gca,'XTickLabel',tickslabels)

同样的事情适用于y轴。


小工作示例:

x=1:100;
y=2*x.^2-3*x+2;

plot(x,y)

ticksarray=[1 33 41 100];
tickslabels={'1', '33', '41', '100'};

set(gca,'XTick',ticksarray)
set(gca,'XTickLabel',tickslabels)

resulting graph

答案 1 :(得分:1)

示例:

figure(1)
load clown

subplot(211)
imagesc(X);

subplot(212)
imagesc(X);
h = gca;

现在,您可以为每个轴设置最大标签数:

%// define maximum number of labels
maxLabel = 3;
h.XTick = linspace(h.xlim(1),h.xlim(2),maxLabel);
h.YTick = linspace(h.ylim(1),h.ylim(2),maxLabel);

enter image description here

或定义应跳过的标签数量:

%// define number of labels to skip
skipLabel = 2;
h.XTick = h.XTick(1:skipLabel:end);
h.YTick = h.YTick(1:skipLabel:end)

enter image description here


您也可以获得不同数量的刻度和标签,但更复杂:

maxLabel = 3;
maxTicks = 6;
h.XTick = linspace(h.xlim(1),h.xlim(2),maxTicks);
h.YTick = linspace(h.ylim(1),h.ylim(2),maxTicks);
h.XTickLabel( setdiff( 1:maxTicks, 1:maxTicks/maxLabel:maxTicks ) ) = repmat({''},1,maxTicks-maxLabel);
h.YTickLabel( setdiff( 1:maxTicks, 1:maxTicks/maxLabel:maxTicks ) ) = repmat({''},1,maxTicks-maxLabel);

如果您使用的是Matlab 2014b的早期版本,则需要set命令来设置所有属性:

%// define maximum number of labels
maxLabel = 3;
Xlim = get(h,'Xlim');
Ylim = get(h,'Ylim');
set(h,'XTick', linspace(Xlim(1),Xlim(2),maxLabel));
set(h,'YTick', linspace(Ylim(1),Ylim(2),maxLabel));

%// or define number of labels to skip
skipLabel = 2;
XTick = get(h,'XTick');
YTick = get(h,'YTick');
set(h,'XTick', XTick(1:skipLabel:end));
set(h,'YTick', YTick(1:skipLabel:end));

%// or combined
maxLabel = 3;
maxTicks = 6;
Xlim = get(h,'Xlim');
Ylim = get(h,'Ylim');
set(h,'XTick', linspace(Xlim(1),Xlim(2),maxTicks));
set(h,'YTick', linspace(Ylim(1),Ylim(2),maxTicks));
XTickLabel = cellstr(get(h,'XTickLabel'));
YTickLabel = cellstr(get(h,'YTickLabel'));
XTickLabel( setdiff( 1:maxTicks, 1:maxTicks/maxLabel:maxTicks ),: ) = repmat({''},1,maxTicks-maxLabel);
YTickLabel( setdiff( 1:maxTicks, 1:maxTicks/maxLabel:maxTicks ),: ) = repmat({''},1,maxTicks-maxLabel);
set(h,'XTickLabel',XTickLabel);
set(h,'YTickLabel',YTickLabel);

答案 2 :(得分:0)

在应用@thewaywewalk提出的第二种方法后,我得到了下面的第二个数字。显然,标签也需要结构化,因为它们只采用了第一批标签。

The figure from imagesc

The figure after applying the skiplabel method

然后我尝试操纵如下所示的标签,并得到第三张图片。

            skipLabel = 2;
            XTick = get(h,'XTick');
            YTick = get(h,'YTick');
            set(h,'XTick', XTick(1:skipLabel:end));
            set(h,'YTick', YTick(1:skipLabel:end));

            XTickLabel = get(h,'XTickLabel');
            labelsX = cell( length(1: skipLabel:length(XTick)) , 1);
            j = 1;
            for i = 1: skipLabel:length(XTick)
                labelsX{j} = XTickLabel(i, :);
                j = j + 1;
            end
            set(h,'XTickLabel', labelsX);

            YTickLabel = get(h,'YTickLabel');
            labelsY = cell( length(1: skipLabel:length(YTick)) , 1);
            j = 1;
            for i = 1: skipLabel:length(YTick)
                labelsY{j} = YTickLabel(i, :);
                j = j + 1;
            end
            set(h,'YTickLabel', labelsY);

Y轴标签似乎与之前一样(在刻度线旁边),但X轴标签似乎向左移动了一点。我怎么能纠正这个?

另一个注意事项:如何将科学值更改为正常数字?此外,可能有更好的方法来操纵标签。

After changing the labels