簡體   English   中英

使用imagesc跳過繪圖中的某些軸標簽

[英]Skipping some axis labels in a plot with imagesc

我使用matlab的imagesc命令創建了一個大的熱圖。 它在x和y軸上繪制每個值組合的誤差輸出。 從圖中可以看出,軸標簽太多。 當我計划增加x和y軸上的點數時,這可能變得更加密集-這意味着我將在更精細的網格上獲得更多輸出。

我想靈活使用標簽,並跳過其中一些標簽。 我想對X和Y都這樣做。我也想對“勾號”保持靈活性,並全部繪制或略過其中一些。 請記住,X和Y值都沒有按順序增加,首先9個點的增量是0.01,然后是0.1,然后是1或3等等。 我也會更改這些增量。

我試圖在第二張圖片中顯示我想要的圖形。 我只希望標簽僅顯示在紅色框中。 正如我所說的,這些不是設置值,我將使增量變小,這將導致繪制更密集。

謝謝您的幫助。

在此處輸入圖片說明

在此處輸入圖片說明

操作系統:Windows 7,8(64 bit)

Matlab版本:Matlab 2014 a

您可以像這樣操作刻度和標簽:

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)

結果圖

例:

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);

在此處輸入圖片說明

或定義應跳過多少標簽:

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

在此處輸入圖片說明


您還可以獲得不同數量的刻度和標簽,但是更加復雜:

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);

應用@thewaywewalk提出的第二種方法后,我得到了下面的第二幅圖。 顯然,標簽也需要進行結構化,因為它們僅采用前多個標簽。

來自imagec的圖

應用skiplabel方法后的圖

然后,我嘗試如下圖所示操作標簽,並獲得了第三張圖像。

            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軸標簽似乎向左移動了一點。 我該如何糾正?

另一個注意事項:如何將科學價值轉換為正常數字? 另外,在處理標簽時可能有更好的方法。

更換標簽后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM