Matrix 将距离矩阵可视化为图形

Matrix 将距离矩阵可视化为图形,matrix,data-visualization,Matrix,Data Visualization,我正在做一个聚类任务,我有一个距离矩阵。我希望将这个距离矩阵可视化为2D图形。请让我知道是否有任何方法可以在线或使用像R或python这样的编程语言来完成。 我的距离矩阵如下所示, 我使用了经典的多维缩放功能(在R中)并获得了一个2D图,该图如下所示: 但我要找的是一个节点和加权边在它们之间运行的图。可能性1 我假设您需要一个二维图,其中节点位置之间的距离与表中提供的距离相同 在python中,您可以对此类应用程序使用networkx。一般来说,有很多这样做的方法,请记住,所有这些方法都只是近似

我正在做一个聚类任务,我有一个距离矩阵。我希望将这个距离矩阵可视化为2D图形。请让我知道是否有任何方法可以在线或使用像R或python这样的编程语言来完成。 我的距离矩阵如下所示, 我使用了经典的多维缩放功能(在R中)并获得了一个2D图,该图如下所示: 但我要找的是一个节点和加权边在它们之间运行的图。

可能性1 我假设您需要一个二维图,其中节点位置之间的距离与表中提供的距离相同

在python中,您可以对此类应用程序使用
networkx
。一般来说,有很多这样做的方法,请记住,所有这些方法都只是近似值(因为在一般情况下,不可能根据点的成对距离创建点的二维表示),它们是某种应力最小化(或能量最小化)近似值,试图找到“合理的”与提供的距离相似的表示

作为一个例子,你可以考虑一个四点的例子(用正确的,离散的度量):

通常,绘制实际的“图形”是多余的,因为您已经完全连接了一个(每对节点都是连接的),所以只绘制点就足够了

在R你可以试试


您没有提到是否需要二维图形。我想你想在二维上建立一个图形,因为你需要它来可视化。考虑到您必须意识到,对于大多数图形来说,这根本是不可能的

可能可以做的是,以某种方式近似距离矩阵中的值,比如小值具有相对小的边,大值具有相对大的长度

考虑到所有先前的考虑,一个选择是。参见neato功能。
一般来说,您感兴趣的是力导向绘图。请参阅以获取更多参考。

您可以使用d3js力定向图并配置节点之间的距离。d3js force layout具有一些集群功能,可以分离距离相似的节点。以下是一个示例,其中值为节点之间的距离:

另一种可视化方法是在节点之间使用相同的距离,但使用不同的线厚度。在这种情况下,您需要根据以下值计算笔划宽度:

.style("stroke-width", function(d) { return Math.sqrt(d.value / 50); });

(MDS)正是您想要的。有关更多信息,请参阅和。

networkx是否与python 2.7不兼容?我得到了以下错误:(文件“test.py”,第16行,在G=nx.to_agraph(G)文件“/usr/local/lib/python2.7/dist packages/networkx/drawing/nx_agraph.py”,第134行,在to_agraph(不适用于Python3)”中),它可以与python 2.7一起工作。请尝试安装此功能的哪个组件uses@Anony-Mousse:我尝试了答案中提到的很多东西(比如python代码片段——都是徒劳的)。我希望我能很快让python代码正常工作。同时,我也在做一些阅读(关于我的工作),所以如果你想让我尽快更新这篇文章/接受答案,这是不可能的。好吧,MDS图是一个好的开始。然后添加Delauney三角剖分或使用其他启发式方法添加边。好的,注意,当我能够获得边时,我将更新此问题。感谢您的回答,这不是我想要的,但看起来很有趣。我想将该矩阵可视化为一个图,其中节点和加权边在节点之间运行。此外,我还发现了一个MDS的R示例实现。我将很快向你进一步通报这方面的最新情况。
import networkx as nx
import numpy as np
import string

dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
               (0.3, 0, 0.9, 0.2),
               (0.4, 0.9, 0, 0.1),
               (0.7, 0.2, 0.1, 0)
               ])*10
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))    

G = nx.to_agraph(G)

G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", width="2.0")

G.draw('distances.png', format='png', prog='neato')
# Classical MDS
# N rows (objects) x p columns (variables)
# each row identified by a unique row name

d <- dist(mydata) # euclidean distances between the rows
fit <- cmdscale(d,eig=TRUE, k=2) # k is the number of dim
fit # view results

# plot solution 
x <- fit$points[,1]
y <- fit$points[,2]
plot(x, y, xlab="Coordinate 1", ylab="Coordinate 2", 
  main="Metric  MDS",    type="n")
text(x, y, labels = row.names(mydata), cex=.7)
import networkx as nx   

# Create a graph
G = nx.Graph()

# distances
D = [ [0, 1], [1, 0] ]

labels = {}
for n in range(len(D)):
    for m in range(len(D)-(n+1)):
        G.add_edge(n,n+m+1)
        labels[ (n,n+m+1) ] = str(D[n][n+m+1])

pos=nx.spring_layout(G)

nx.draw(G, pos)
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_size=30)

import pylab as plt
plt.show()
.style("stroke-width", function(d) { return Math.sqrt(d.value / 50); });