创建一个没有生物信息学工具箱的网络?

时间:2014-07-14 20:03:21

标签: matlab graph plot graph-theory graph-visualization

我有一个由三行组成的矩阵:基因1,基因2,距离。

我想创建一个网络,每个基因都是一个节点,连接线按两个基因之间的距离缩放。

如何在不使用生物信息学或神经网络工具箱的情况下实现这一目标?

谢谢!

1 个答案:

答案 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

结果

enter image description here