如何在Matlab中像格子结构一样绘制这棵树?

时间:2011-03-06 03:34:24

标签: matlab plot tree structure

我想要绘制的结构应该与显示的结构完全相同。谢谢!enter image description here

3 个答案:

答案 0 :(得分:4)

这是一个我掀起的一个小函数,它将输入一个正方形的上三角矩阵并绘制上面的晶格结构:

function hFigure = plot_lattice(A)

  %# Compute all the coordinates needed for the lines and points:

  N = size(A,1);
  [xPoints,yPoints] = meshgrid(0:N-1);
  yPoints = bsxfun(@plus,-yPoints,0:0.5:(N-0.5)/2);
  xLines = [xPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); ...
            xPoints([1:N-1 N:-1:2],N).'];  %'
  yLines = [yPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); ...
            yPoints([1:N-1 N:-1:2],N).'];  %'
  index = find(triu(reshape(1:N^2,N,N)));
  xPoints = xPoints(index);
  yPoints = yPoints(index);
  values = strtrim(cellstr(num2str(A(index))));

  %# Create the figure:

  hFigure = figure('Color','w');
  hAxes = axes('Parent',hFigure,'XLim',[-0.5 N-0.5],...
               'YLim',[min(yPoints)-0.5 max(yPoints)+0.5],...
               'YColor','w','XTick',0:N-1,'LineWidth',2);
  hold on;
  plot(hAxes,xLines,yLines,'k','LineWidth',2);
  plot(hAxes,xPoints,yPoints,'o','MarkerFaceColor',[0.96 0.96 0.86],...
       'MarkerSize',30,'MarkerEdgeColor','k','LineWidth',2);
  text(xPoints,yPoints,values,'Parent',hAxes,...
       'HorizontalAlignment','center');
  hold off;

end

这是一个带有样本矩阵的测试:

>> A = triu(reshape(1:25,5,5))

A =

     1     6    11    16    21
     0     7    12    17    22
     0     0    13    18    23
     0     0     0    19    24
     0     0     0     0    25

>> plot_lattice(A);

enter image description here

答案 1 :(得分:2)

我稍微修改了代码,因此它可以打印节点以及每个节点中的多个值。

A现在是一个三维矩阵,并且也无法获取未在树中打印的空值(NaN)

Ofc代码不是最优的......也许你们中的一个可以改进它

%# Compute all the coordinates needed for the lines and points:
      close all
      [N,L] = size(A);
      L=L/N;

      [xPoints,yPoints] = meshgrid(0:N-1);
      yPoints = bsxfun(@plus,-yPoints,0:0.5:(N-0.5)/2);
      xLines = [xPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); xPoints([1:N-1 N:-1:2],N).'];  
      yLines = [yPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); yPoints([1:N-1 N:-1:2],N).'];  
      index = find(triu(reshape(1:N^2,N,N)));
      xPoints = xPoints(index);
      yPoints = yPoints(index);
    %   values = strtrim(cellstr(num2str(A(index))));
      for i=1:L
        values(:,i) = strtrim(cellstr(num2str(A((i-1)*N*N+index))));
      end

      values = strrep(values, 'NaN', '   ');

    for i=1:N
        for j=i:N
            if i==1 && j==1
                nodes(i,j)=cellstr(strcat('N_','0'));
            else
                nodes(i,j)=cellstr(strcat('N_','{',repmat('u',1,(j-1)-(i-1)),repmat('d',1,(i-1)),'}'));
            end
        end
    end
    nodes = nodes(index);

      %# Create the figure:

      hFigure = figure('Color','w');
      hAxes = axes('Parent',hFigure,'XLim',[-0.5 N-0.5],'YLim',[min(yPoints)-0.5 max(yPoints)+0.5],'YColor','w','XTick',0:N-1,'LineWidth',2);
      hold on;
      plot(hAxes,xLines,yLines,'k','LineWidth',2);
      plot(hAxes,xPoints,yPoints,'o','MarkerFaceColor',[0.96 0.96 0.86],'MarkerSize',60,'MarkerEdgeColor','k','LineWidth',2);
      for i=1:L
        text(xPoints,yPoints+L*0.05-(i-1)*0.1,values(:,i),'Parent',hAxes,'HorizontalAlignment','center');
      end
      text(xPoints-0.4,yPoints,nodes,'Parent',hAxes,'HorizontalAlignment','center');
      hold off;

答案 2 :(得分:1)

我会使用matlab生成一个文本文件,以便在Graphviz中使用。