【问题标题】:Skipping some axis labels in a plot with imagesc使用图像跳过绘图中的一些轴标签
【发布时间】:2015-02-03 15:51:10
【问题描述】:

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

我想灵活使用标签,并跳过其中的一些。我想对 X 和 Y 都这样做。我还想灵活地使用“刻度”并绘制所有这些或跳过其中一些。请记住,X 和 Y 值都不是按顺序增加的,起初增量是 0.01 9 点,然后是 0.1,然后是 1 或 3 或其他。我也会改变这些增量。

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

感谢您的帮助。

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

Matlab 版本:Matlab 2014 a

【问题讨论】:

    标签: image matlab plot heatmap labels


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      例子:

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

      【讨论】:

      • 对不起,我忘了说我使用的是 matlab 2014a。所以我应该对你的每个“h”使用 set 命令吗?你用的名词。 ?
      • 我看到在 2014b 中他们已经显着改变了结构,现在看起来更直观了。但是,正如您所指出的,我使用 2014a 并且必须处理“设置”。如果您有时间,您可以为 2014a 版发布上述(全部)相同的解决方案。我将不胜感激。我已经弄清楚了大部分,但只是想确定一下。
      • 基于 ypur 2nd 解决方案,这是我为 2014a Matlab 版本所做的,它运行良好:skipLabel = 2; %% xtick = get(h, 'XTick') set(h,'XTick', xtick(1:skipLabel:end)) ytick = get(h, 'YTick') set(h,'YTick', ytick(1 :skipLabel:end))
      【解决方案3】:

      应用@thewaywewalk 提出的第二种方法后,我得到了下面的第二张图。显然标签也需要结构化,因为它们只使用前这么多标签。

      然后我尝试如下操作标签,得到第三张图片。

                  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 轴标签似乎向左移动了一点。我该如何纠正这个问题?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        相关资源
        最近更新 更多