我有一个由三行组成的矩阵:基因1,基因2,距离。
我想创建一个网络,每个基因都是一个节点,连接线按两个基因之间的距离缩放。
如何在不使用生物信息学或神经网络工具箱的情况下实现这一目标?
谢谢!
答案 0 :(得分:12)
绘制边长与边缘权重成正比的图形几乎是不可能的,至少不太可能重量允许以这种方式绘制图形,大多数都是不可能的...
参见:
P上。 Eades和N. C. Wormald。 Fixed edge-length graph drawing is NP-hard。离散应用数学,28(2):111-134,1990]
或引用:
"绘制边缘权重为平面节点链接的平面图 图中,边长与边权重成正比,是 一个NP难题"
微米。 Nollenburg,R。Prutkin和I. Rutter,Edge-weighted contact representations of planar graphs。 Journal of Graph Algorithms and Applications,17(4):441-473,2013
考虑以这种数据格式连接的3个顶点的简单示例:
[1,2,1;
1,3,1;
2,3,10;]
应该立即明白,这样的图表不可能以与重量成比例的边长(直线)绘制。因为MATLAB中的这些替代方案包括使用颜色或线宽来表示重量。
很抱歉这个答案的长度,但要实现这一点并非易事,下面用于绘制图表的过程也可以找到here (in debth),here (most simple)和类似的问题here。然而,这些并不涉及加权图......
所以实现线宽和颜色与重量成正比:
<强> Due to the length the code is available without description here 强>
首先是一些测试数据,包括在20个顶点之间随机分配的30个边,随机权重在0到10之间。
clear
%% generate testing data
[X,Y] = ndgrid(1:20); testdata = [X(:) Y(:)]; %// all possible edges
data(data(:,1)==data(:,2),:)=[]; %// delete self loops
data=data(randperm(size(data,1),20),:); %// take random sample of edges
data(:,3)=rand(size(data,1),1)*10; %// assign random weights in range 0-10
首先对数据进行一些处理,使其成为所需的格式;
edges=data(:,1:2);
[Verticies,~,indEdges]=unique(edges); %// get labels & locations of vertices
indEdges=reshape(indEdges,[],2);
weights=data(:,3);
normalisedWeights=weights/max(weights); %// normalise weights (range 0-1)
numeEdge=numel(weights);
numVertex=numel(Verticies);
现在,在单位圆上创建每个顶点的x和y坐标:
theta=linspace(0,2*pi,numVertex+1);
theta=theta(1:end-1);
[x,y]=pol2cart(theta,1); % create x,y coordinates for each vertex
当MATLAB图中的线从轴颜色顺序继承它们的颜色时,我们创建一个RGB数组,它对应于一个颜色图,每条线的条目给出分配给该权重的颜色的RGB值。
秋天色图很容易手动实现,因为R = 1,B = 0表示所有值,G范围是0-1线性,因此我们可以制作用作轴颜色顺序的Cmap
变量如下:
clear Cmap %// to avoid errors due to the way it is created
Cmap(:,2)=normalisedWeights;
Cmap(:,1)=1;
Cmap(:,3)=0;
现在我们创建一个图形,将colormap设置为Autumn(对于颜色条),保持按住,以便绘图命令不重置颜色顺序,并应用颜色顺序
figure
colormap('autumn')
hold on
set(gca,'colororder',Cmap) %// set axis colororder to Cmap
我们如何使用先前在x&amp;给出的位置处生成的边缘索引来绘制边缘。年。存储行的句柄(Hline)供以后使用。
Hline=plot(x(indEdges).',y(indEdges).'); %// plot edges
现在我们将轴设置为方形,以便正确显示点圆并关闭轴以隐藏它们(因为它们与绘制的图形无关)。然后将轴颜色限制(Clim)设置为与权重范围匹配,并添加添加颜色条。
axis square off
set(gca,'Clim',[0 max(weights)])
colorbar
绘制边缘的最后一步,将线宽设置为与重量成比例,标准化的权重按比例缩放到0-5范围内。然后将线宽设置为scalefactor * normalisedWeights ..
scalefactor=5; %// scale factor (width of highest weight line)
set(hline, {'LineWidth'}, num2cell(normalisedWeights*scalefactor));
现在将顶点绘制在x和y坐标处(此处为黑色方块)。 增加轴限制以允许顶点标签适合。最后,顶点用原始矩阵的值标记,标签放置在比顶点稍大的圆上
plot(x,y,'ks')
xlim([-1.1,1.1]) % expand axis to fix labels
ylim([-1.1,1.1])
text(x(:)*1.1, y(:)*1.1, num2str(Verticies),...
'FontSize',8,'HorizontalAlignment','center'); %// add Vertex labels