基于数据的绘图中某些点之间的线?(附R)

基于数据的绘图中某些点之间的线?(附R),r,graph,plot,lines,R,Graph,Plot,Lines,我已经做了我的研究和谷歌搜索,但还没有找到解决以下问题的办法。我经常在这个论坛上找到与R相关问题的解决方案,所以我想尝试一下,希望有人能提出一些建议。我需要它来写博士论文;任何人的代码或建议,我将使用自然会得到承认和信任 所以:我需要在R(也欢迎基于SPSS的解决方案)中绘制线/段来连接图中的点(特别是多维缩放),但不是在所有点之间,仅表示至少有一个数据项共享的属性/变量的属性/变量-线条的放置应基于相关绘图基于自身的数据。让我解释一下;下面是一些带有虚拟变量的虚构数据,其中“1”表示该项具有以

我已经做了我的研究和谷歌搜索,但还没有找到解决以下问题的办法。我经常在这个论坛上找到与R相关问题的解决方案,所以我想尝试一下,希望有人能提出一些建议。我需要它来写博士论文;任何人的代码或建议,我将使用自然会得到承认和信任

所以:我需要在R(也欢迎基于SPSS的解决方案)中绘制线/段来连接图中的点(特别是多维缩放),但不是在所有点之间,仅表示至少有一个数据项共享的属性/变量的属性/变量-线条的放置应基于相关绘图基于自身的数据。让我解释一下;下面是一些带有虚拟变量的虚构数据,其中“1”表示该项具有以下属性:

       "properties"
        a   b   c
"items" ---------
tree  | 1   1   0
house | 0   1   1
hut   | 0   1   1
book  | 1   0   0

该图为多维比例图(距离被解释为差异)。这就是逻辑:

  • 在a和B之间有一行,因为在a中至少有一个项/变量(“树”) 具有这两个属性的数据
  • B和C之间有一条线,因为数据中至少有一项(“房屋”和“小屋”)同时具有两种属性
  • 有一个项目(“书籍”)只有一个属性(A),因此它不会影响行的放置
  • 重要的是,A和C之间没有一行,因为数据中没有同时具有这两个属性的项
我正在寻找的是一种自动/计算地添加灰线的方法,我现在已经在上面的图上手动绘制了灰线。自动绘图应基于上述数据。对于较小的数据集,手动绘制线没有问题,但是当有几十个这样的“属性”和数百个数据项/行时,就成了问题。 有什么想法吗?一些R代码(如果可能的话,请评论)将是最受欢迎的

编辑:看来我忘了一些非常重要的事情。首先,下面@GaborCsardi提出的解决方案与示例数据完美结合,谢谢!但我忘了包括点的连接也应该是“保守的”,尽可能少的连接线。例如,如果某个项目具有所有“属性”,则不应仅因为此而在绘图中的每个属性点之间创建线,如果这些点已由其他项目连接,即使是间接连接。因此,基于以下数据的绘图不应是完整的三角形,即使item1具有所有三个属性:

      A B C
item1 1 1 1
item2 1 1 0
item3 0 1 1

相反,A、B和B、C应该通过一条线连接,但A和C之间的线是可容许的,因为它们已经间接连接(通过B)。这可以通过关联图来实现吗?

如果使用图,并创建表中的二部图的投影,这将非常容易。例如

library(igraph)

## Some example data
mat <- "       properties
        items  a   b   c
        tree   1   1   0
        house  0   1   1
        hut    0   1   1
        book   1   0   0
       "
tab <- read.table(textConnection(mat), skip=1,
                  header=TRUE, row.names=1)

## Create a bipartite graph
graph <- graph.incidence(as.matrix(tab))

## Project the bipartite graph
proj <- bipartite.projection(graph)

## Plot one of the projections, the one you need 
## happens to be the second one
plot(proj$proj2)

## Minimum spanning tree of the projection
plot(minimum.spanning.tree(proj$proj2))
库(igraph)
##一些示例数据

mat如果您使用图,并创建表中的二部图的投影,这将非常容易。例如

library(igraph)

## Some example data
mat <- "       properties
        items  a   b   c
        tree   1   1   0
        house  0   1   1
        hut    0   1   1
        book   1   0   0
       "
tab <- read.table(textConnection(mat), skip=1,
                  header=TRUE, row.names=1)

## Create a bipartite graph
graph <- graph.incidence(as.matrix(tab))

## Project the bipartite graph
proj <- bipartite.projection(graph)

## Plot one of the projections, the one you need 
## happens to be the second one
plot(proj$proj2)

## Minimum spanning tree of the projection
plot(minimum.spanning.tree(proj$proj2))
库(igraph)
##一些示例数据

mat也许你需要将tab强制为一个矩阵。
graph@agstudy:的确,谢谢,我使用的是igraph的开发版本,它也允许数据帧。修好了,不客气。。
igraph
软件包中的出色工作。我是一个伟大的球迷,即使我没有机会在专业项目中使用它。你知道使用这个软件包的专业应用程序吗?我不知道你所说的专业应用程序是什么意思,我想GPL可能会限制商业软件的使用。但是有很多研究论文在使用它,而这正是创建它的目的。谢谢你的有用建议!(我没有意识到在提问后可以编辑该问题;因此我删除了评论,并在问题本身添加了保守的必要性)也许你需要将tab强制设置为矩阵。
graph@agstudy:确实,谢谢,我使用的是IGRAPHE的开发版本,它也允许数据帧。修好了,不客气。。
igraph
软件包中的出色工作。我是一个伟大的球迷,即使我没有机会在专业项目中使用它。你知道使用这个软件包的专业应用程序吗?我不知道你所说的专业应用程序是什么意思,我想GPL可能会限制商业软件的使用。但是有很多研究论文在使用它,而这正是创建它的目的。谢谢你的有用建议!(我没有意识到在提问后可以编辑问题;因此我删除了评论,并在问题本身添加了保守的必要性)关于编辑:那么你想要图的最小生成树?(有关最小生成树,请参见维基百科。)特定的生成树?或者任何生成树?从我现在读到的(感谢您的参考),似乎我需要一个最小生成树,以保持线的总长度/重量最小(排除多余的线)。关于欧几里德MST,边缘权重等于欧几里德距离,但事实并非如此,因为MDS图已经显示了欧几里德距离,它传达了所有点之间的差异,而不仅仅是连接点之间的差异。(来自人文学科,这对我来说是很新的;我使用过f.ex聚类分析,但我从来不知道它是基于MST的)因此,如果需要MST,只需在投影上调用
minimum.span.tree()
。我已经更新了我的答案。@GaborCsardi:非常感谢!我没有意识到这有那么简单;我一到R就要尝试实现这个。关于编辑:你想要一个图的最小生成树吗?(有关最小生成树,请参见维基百科。)特定的生成树?或者任何生成树?从我现在读到的(感谢r