【问题标题】:How to make 1-D plots in MATLAB?如何在 MATLAB 中制作一维绘图?
【发布时间】:2011-04-21 16:12:48
【问题描述】:

如何在 MATLAB 中绘制如下图?

我不需要标签,所以你可以忽略它们。我尝试使用普通的 2D 图,为每个数据点提供 0 到 y 参数。它确实有帮助,但大部分情节仍然是空的/白色的,我不希望这样。

我该如何解决这个问题?

编辑:

这就是我的绘图方式(玩弄 ylim 的值没有帮助):

hold on
for i=1:120
    if genders(v_labels(i)) == CLASS_WOMAN
        plot(v_images_lda(i,:) * w_lda,0,'r*');
    else
        plot(v_images_lda(i,:) * w_lda,0,'b.');
    end
end
title('LDA 1D Plot');
ylim([-0.2 0.2]);
hold off

【问题讨论】:

  • 如果您正确地将 y 参数设置为 0,那么您的“空/白”问题可能不是由绘图功能引起的。你能提供更多信息和一些代码吗?
  • 我正在研究一种两级性别分类算法。我使用线性判别分析(LDA)将维度减少到 1,并且我想很好地绘制它。简单地说,我有一组数字要绘制在 X 轴上。
  • @kolisivra 好吧,我不想指出显而易见的问题,但是您是否尝试过打印出您要绘制的数据集以确保一切正常?
  • @P.R. “按顺序”是什么意思?
  • @kolistivra 因为您没有任何垃圾,并且正在绘制的数据集实际上是二维的。在绘制之前尝试将 v_images_lda(i:) * w_lda 放在临时变量中。这样您就可以查看 temp 变量并查看实际绘制的内容。

标签: matlab plot


【解决方案1】:

执行此操作的一种方法是调整坐标区的'XLim''YLim''DataAspectRatio' 属性,使其基本上呈现为一条线。这是一个例子:

data1 = rand(1,20)./2;      %# Sample data set 1
data2 = 0.3+rand(1,20)./2;  %# Sample data set 2
hAxes = axes('NextPlot','add',...           %# Add subsequent plots to the axes,
             'DataAspectRatio',[1 1 1],...  %#   match the scaling of each axis,
             'XLim',[0 1],...               %#   set the x axis limit,
             'YLim',[0 eps],...             %#   set the y axis limit (tiny!),
             'Color','none');               %#   and don't use a background color
plot(data1,0,'r*','MarkerSize',10);  %# Plot data set 1
plot(data2,0,'b.','MarkerSize',10);  %# Plot data set 2

你会得到以下情节:

【讨论】:

    【解决方案2】:

    这是使用dsxy2figxyannotate 重现您的身材的一种方法。 dsxy2figxy 第一次可能很难找到,因为它不在您的路径中。它是 MATLAB 包的一部分,并在示例函数中提供。您可以通过在帮助文档中搜索它来找到它,找到它后,打开它并将其保存到路径中的文件夹中。

    h1=figure(1);clf
    subplot(4,1,1);
    hold on
    xlim([0.2,1]);ylim([-1,1])
    
    %arrow
    [arrowX,arrowY]=dsxy2figxy([0.2,1],[0,0]);
    annotation('arrow',arrowX,arrowY)
    
    %crosses
    x=[0.3,0.4,0.6,0.7,0.75];
    plot(x,0,'kx','markersize',10)
    
    %pipes
    p=[0.5,0.65];
    text(p,[0,0],'$$\vert$$','interpreter','latex')
    
    %text
    text([0.25,0.5,0.65],[1,-1,-1]/2,{'$$d_i$$','E[d]','$$\theta$$'},'interpreter','latex')
    
    axis off
    print('-depsc','arrowFigure')
    

    这将产生下图:

    这是一种很老套的方法,因为我已经欺骗 MATLAB 只打印一个子图。所有光栅化格式(jpegpng 等)都不会给您相同的结果,因为它们都会打印整个图形,包括未声明的子图应该在哪里。所以要获得这种效果,它必须是eps,并且它可以使用它,因为 eps 使用更紧密的边界框......所以所有无意义的空白都被修剪掉了。然后,您可以将其转换为您想要的任何其他格式。

    【讨论】:

      【解决方案3】:

      好吧,我最接近解决这个问题的方法如下

      hax = gca();
      hold on
      for i=1:120
          if genders(v_labels(i)) == CLASS_WOMAN
              plot(v_images_lda(i,:) * w_lda,0,'r*');
          else
              plot(v_images_lda(i,:) * w_lda,0,'b.');
          end
      end
      
      set(hax, 'visible', 'off');
      hax2 = axes();
      set(hax2, 'color', 'none', 'ytick', [], 'ycolor', get(gcf, 'color');
      pos = get(hax, 'position');
      set(hax2, 'position', [pos(1), pos(2)+0.5*pos(4), pos(3), 0.5*pos(4)]);
      title('LDA 1D Plot');
      
      hold off
      

      简而言之,我隐藏了原始轴并在原始轴的 0 处创建了一个新轴,并且由于无法完全移除 y 轴,因此我将其颜色设置为图形的背景颜色。 然后,您可以决定是否还想使用 x 轴的刻度线。

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        非常幼稚但有用的技巧。

        使用 matlab 绘图功能在 2d 中绘图。然后使用编辑图形属性将其压缩到您需要一维绘图的任何轴!希望有帮助:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-26
          • 1970-01-01
          • 2018-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多