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坐标一些距离来,不然小圆圈就跟字母重叠了。
大概思路就是这样,具体实现的时候也不是很难,自己尝试一下,别什么东西都指望别人给你现成的。
2024-09-04 广告
示例效果图和代码见下。简单说明几点:
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