在Matlab中绘制相关系数图

在Matlab中绘制相关系数图,matlab,graph,graphics,matlab-figure,pearson-correlation,Matlab,Graph,Graphics,Matlab Figure,Pearson Correlation,在Matlab中,我有一个n^2 x n^2矩阵corrum,其中包含一组n x n矩阵M,因此corrum(I,j)是集合中一些M的M(I)和M(j)之间的相关系数。请注意,corrum是对称的 我想通过显示M的不同条目之间的链接来绘制corrum,其中M(I)和M(j)之间的链接是彩色的,比如说,如果corrum(I,j)为正,则为红色,如果为负,则为蓝色。链路的厚度指示相关性有多强(优选地,当链路相距0.1,甚至更小时,可以区分) 对于3 x 3M,这可能如下所示: 并非所有条目都将被连

在Matlab中,我有一个
n^2 x n^2
矩阵
corrum
,其中包含一组
n x n
矩阵
M
,因此
corrum(I,j)
是集合中一些
M
M(I)
M(j)
之间的相关系数。请注意,
corrum
是对称的

我想通过显示
M
的不同条目之间的链接来绘制
corrum
,其中
M(I)
M(j)
之间的链接是彩色的,比如说,如果
corrum(I,j)
为正,则为红色,如果为负,则为蓝色。链路的厚度指示相关性有多强(优选地,当链路相距0.1,甚至更小时,可以区分)

对于
3 x 3
M
,这可能如下所示:

并非所有条目都将被连接,因为它们中的许多条目不相关(因此相关系数为零不会导致显示链接)。请注意,未显示自相关性。像下面一行中看到的那种情况,一个简单的实现可能只是将一行放在另一行的上面,这种情况是有问题的,但是这种简单的实现仍然非常受欢迎

是否有一种标准的方法来实现这一点,也许是使用Matlab的一些内置图论函数(不幸的是,我不知道它的范围)?


如果没有,那么我如何实现它?

您可以在Matlab中尝试
图形
对象。以下示例假设您的
corrum
n
x
n
矩阵(见下文):

使用
n=9
时,它将如下所示(使用一些随机
Corr\M
):


图形绘图的一个问题是非常小的文本无法更改。如果这很重要,请阅读。

谢谢您的回答。有几件事我不明白:1)如果
n=5
,那么生成的图不应该有25个节点吗?2) 在倒数第二行中,
5'
的目的是什么?Matlab只是将其计算为
5
。你的意思是写
(abs(权重)*5)
?矩阵
corrum
Corr(M)
的结果,其中
M
是一个
n
x
n
随机矩阵。它有
n^2
值(=25),但正如你所提到的-它是对称的,主对角线都是
1
,因此只需要上(或左)三角形。矩阵
nxn
的严格上三角形有
n(n-1)/2个
条目,而不是
n
@Lovsovs-右,这就是为什么有10条边(线)在这个例子中。我从来没有写过应该只有
n
。不管怎样,不管您使用
corr
还是任何其他函数,这个答案仍然成立。它所做的只是想象矩阵中的数字。啊,我误解了,原谅我。感谢您提供此解决方案!有没有办法将节点的布局从五边形更改为网格?
Corr\u M=Corr(M)
查找
M
列之间的成对关联。所以
corrum(1,2)
M
的第一列和第二列之间的相关性。基于此,我不确定可视化代表了什么。例如,(2,1)和(1,2)点之间的图中的粗蓝线代表哪个相关系数?@VaheTshitoyan是的,它不明确,请参见我的编辑:
M
代表一组矩阵。我把所有的第ij个条目收集到一个向量中,类似地,还有一些其他条目,然后我找到这两个向量之间的相关系数。结果是
Corr\u M
中的一个条目。
% set the source of the lines:
s = repelem(1:n-1,n-1:-1:1);
% set the target of the lines:
t = nonzeros(triu(repmat(2:n,n-1,1)).').';
Corr_M(~Corr_M) = nan; % replace zero weights with nan
weights = nonzeros(tril(Corr_M,-1));
% create the graph object:
G = graph(s,t,weights,n);
% mark the lines to remove from the graph:
threshold = 0.4; %  minimum correlation to plot
line_to_remove = isnan(weights) | abs(weights)<threshold;
% remove the lines from the graph:
G = G.rmedge(find(line_to_remove)); %#ok<FNDSB>
% plot it:
p = plot(G); % for labeling the lines uncomment add: 'EdgeLabel',G.Edges.Weight
p.NodeColor = 'k';
% color positive in blue and negative in red:
p.EdgeColor = [G.Edges.Weight<0.' zeros(numel(G.Edges.Weight),1) G.Edges.Weight>0.'];
% set the thickness of the lines:
p.LineWidth = abs(G.Edges.Weight)*5;
axis off
% get the grid coordinates for all nodes
[x,y] = ndgrid(1:ceil(sqrt(n)),1:ceil(sqrt(n)));
x = x(:);
y = y(:);
% set the nodes in a 'grid' structure
p.XData = x(1:n);
p.YData = y(1:n);
axis ij % flip the plot so it will be orderd like in a matrix
Corr_M =
            0            0            0            0            0            0            0            0            0
       0.9504            0            0            0            0            0            0            0            0
     0.016371      0.24554            0            0            0            0            0            0            0
     -0.11467     -0.19375     -0.30812            0            0            0            0            0            0
     -0.01241    -0.090871      0.74444      0.34121            0            0            0            0            0
     -0.21623      0.36844      0.83935     -0.83914     -0.12302            0            0            0            0
    -0.011428   -0.0077929     -0.26243     -0.98249     -0.57997      0.55024            0            0            0
      0.64245      -0.6027      0.51424      0.62646      0.32854      0.18052     0.055688            0            0
     -0.51699      0.47885      0.44677      0.18128      0.26819     -0.67849    -0.034057      0.28652            0