matlab画图的问题

现有5*1元胞数组比如x={'a'; 'b'; 'c'; 'd'; 'e'}, 5个元素的连接关系用矩阵表示,下图所示,比如,a到b,则 a与b的交叉元素置1,请问怎样用matlab由这个矩阵还原成左边的连接图?

    LZ你要的这个功能在Matlab里是没有现成的函数可以实现的,只能自己做。给你个思路,不知道你matlab学的怎么样。

    1.首先是连接图字母分布形状的问题。如果像你给出的连接图那样ace在同一条直线上的话,那当a到e有连接的时候(你给的矩阵里a到e之间没有连接,所以你给的连接图没体现出这样的问题来),这条连接线岂不是跟a到c和c到e这两条连接线重合了?为了防止这种情况发生,应该让abcde均匀的分布在一个半径为R的圆上,如下图所示,这样的话,不管abcde之间的连接关系是怎样的,都不会导致有连线重叠的情况。

 

    在matlab程序里,给定了圆心坐标和半径,abcde这5个点的坐标是很容易求出来的,matlab里有在指定坐标位置打印字符的函数。

    2.然后就到连线的问题了。画连线应该设计一个函数来实现Line(x1,y1,x2,y2),函数的入口参数是要连接的两个点的坐标,画两点的之间的线段用plot语句应该会吧?举个例子,比如说画a到b的连线,那就是Line(ax,ay,bx,by),在线头末端用一个符号来表示方向(比如说我给的图示中用的是小圆圈)。应该注意的是实际画线的时候不能直接使用a坐标到b坐标来连线,应该适当的离开a坐标和b坐标一些距离来,不然小圆圈就跟字母重叠了。

    大概思路就是这样,具体实现的时候也不是很难,自己尝试一下,别什么东西都指望别人给你现成的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-06

示例效果图和代码见下。简单说明几点:

1、关于节点的位置分布,参考了楼上的想法。

2、为表现出节点双向连接的效果,示例的矩阵与楼主稍有区别。

3、以箭头表示连接方向,箭头的形状可以根据喜好自行修改。

代码:

% 节点x={'a'; 'b'; 'c'; 'd'; 'e'};

% 邻接矩阵

M = [

    0 1 1 0 0;

    1 0 0 0 0;

    1 0 0 1 1;

    0 0 0 0 0;

    0 0 0 0 0];

 

% 数据合法性检查

n = length(x);

if ~isequal(size(M), [n n])

    error('邻接矩阵数据与节点不匹配。')

end

 

% 绘制节点

R = 2;     % 排列节点的圆半径

r = 0.2;   % 节点圆圈的半径

t = linspace(0,2*pi,50);

X = r*cos(t);

Y = r*sin(t);

clf

for i=1:n

    t = i/n*2*pi;

    xc = R * cos(t);

    yc = R * sin(t);

    patch(xc+X,yc+Y,'c')

    text(xc,yc,x{i},'Horiz','center','Vert','middle');

end

axis equal

axis off

 

% 连接线

L = 0.1;        % 箭头线长

A = 30*pi/180;   % 箭头角度

for i=1:n

    for j=1:n

        if M(i,j)

            Q = atan2(sin(j/n*2*pi)-sin(i/n*2*pi), cos(j/n*2*pi)-cos(i/n*2*pi));

            X = [ R*cos(i/n*2*pi)+r*cos(Q) R*cos(j/n*2*pi)+r*cos(Q+pi)];

            Y = [ R*sin(i/n*2*pi)+r*sin(Q) R*sin(j/n*2*pi)+r*sin(Q+pi)];

            Xa = X(2) + [L*cos(-A+Q+pi) 0 L*cos(A+Q+pi)];

            Ya = Y(2) + [L*sin(-A+Q+pi) 0 L*sin(A+Q+pi)];

            line([X NaN Xa],[Y NaN Ya])

        end

    end

end

 

 

本回答被提问者采纳
相似回答
大家正在搜