Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
图上顶点子集周围的多边形/轮廓(比igraph中的mark.groups更精确) 问题定义_R_Graph_Polygon_Igraph_Convex Hull - Fatal编程技术网

图上顶点子集周围的多边形/轮廓(比igraph中的mark.groups更精确) 问题定义

图上顶点子集周围的多边形/轮廓(比igraph中的mark.groups更精确) 问题定义,r,graph,polygon,igraph,convex-hull,R,Graph,Polygon,Igraph,Convex Hull,我需要生成一些特定的图形,在这些图形上,通过在其周围或上方绘制轮廓/多边形/范围来突出显示顶点(节点)的子集(参见下图) 当一个或多个顶点属于多个子集时,一个图可能有多个轮廓/范围,并且它们可能重叠 给定一个由N个顶点组成的图,任何子集的大小都可能为1..N 但是,不属于子集的顶点不得位于轮廓内(因为这会产生误导,所以这是优先级1)。这就是我问题的要点 所有这些图都具有范围连续的特性,因为它们所表示的数据只覆盖直接连接的顶点子集 所有图形都将是无向且连接的(不会绘制任何未连接的顶点) 可重复

我需要生成一些特定的图形,在这些图形上,通过在其周围或上方绘制轮廓/多边形/范围来突出显示顶点(节点)的子集(参见下图)

  • 当一个或多个顶点属于多个子集时,一个图可能有多个轮廓/范围,并且它们可能重叠
  • 给定一个由N个顶点组成的图,任何子集的大小都可能为1..N
  • 但是,不属于子集的顶点不得位于轮廓内(因为这会产生误导,所以这是优先级1)。这就是我问题的要点
  • 所有这些图都具有范围连续的特性,因为它们所表示的数据只覆盖直接连接的顶点子集
  • 所有图形都将是无向且连接的(不会绘制任何未连接的顶点)
可重复的尝试 我正在使用R和
igraph
包。我已经尝试过一些解决方案,但没有一个效果足够好

第一次尝试,
绘图.igraph
中标记.groups

library(igraph)
g = make_graph("Frucht")
l = layout.reingold.tilford(g,1)
plot(g, layout=l, mark.groups = c(1,3,6,12,5), mark.shape=1)  
 # bad, vertex 11 should not be inside the contour
plot(g, layout=l, mark.groups = c(1,6,12,5,11), mark.shape=1) 
 # 3 should not be in; image below
 # just choosing another layout here is not a generalizable solution

plot.igraph调用igraph.polygon,它调用凸包(也称为igraph),它调用xspline。据我所知,结果是一种称为凸包的东西(否则看起来很漂亮!),但就我的目的而言,它不够精确,覆盖了不应该覆盖的顶点

第二次尝试使用
轮廓
。因此,我尝试根据建议的解决方案实施我自己的版本:

问题是: 在R中实现此类范围的绘制(理想情况下为igraphs)的更好方法是什么?这些范围将满足上述标准-仅包括属于其子集的顶点,并排除所有其他顶点-同时是连续范围

我正在寻找的解决方案应该可以扩展到我可能需要创建的不同大小和布局的图形(因此使用tkplot等手动调整每个图形不是一个好的解决方案)。我知道,在一些具有一些顶点组的图上,满足这两个标准在实践中确实是不可能的,但直觉上,应该可以实现一些在当时仍然适用于较小(10..20个顶点)且不太复杂的图的东西(理想情况下,如果无法绘制完美匹配的范围,则可以检测并发出警告)。或者改进
标记组
方法(不一定在包装内,但使用上述外壳理念),或具有
轮廓
或类似合适功能的东西,或建议完全使用其他东西,只要它有效(大部分时间)

讨论中的更新:只利用核心R或CRAN软件包(而非外部软件)功能的解决方案是可取的,因为我最终希望将此功能合并到软件包中


编辑:根据注释指定最后一段。

注释区域不够长,无法容纳我的答案,因此我将其放在这里,尽管我宁愿将其作为注释发布,因为它不是完整的解决方案


这是一个很长的过程,但我想到的第一件事是,你可以构造一个支持向量机分类器,根据顶点的坐标,使用一些非线性核函数(我可以尝试径向基函数)将你的点分为两组(输入或输出)。然后绘制经过训练的支持向量机的分离超平面。一个缺点是,通过这种方法获得的区域可能是无界的(即在某些方向上趋于无穷大),所以这个想法肯定需要进一步思考,但至少这是一个可能的方向。

因为手动调整是不可接受的,那么您应该向软件包作者提出功能请求。我很乐意实现我自己的功能,或者利用另一个软件包中的一些合适的几何功能来完成如果有人能让我从正确的方向开始(至少)。我想,如果有人向作者提出请求,即使他们同意,也必须等到下一个版本的软件包。尝试将mark.groups作为列表:示例marked.groups=list(c(1,3,5,6,11,12),c(1,5,6,11,12)))感谢您开始讨论!但就我对支持向量机的了解而言,这就像是试图用大炮打苍蝇,更不用说无界性(从某种意义上说,它只是给出了凸壳问题的逆解)。我所需要的是类似于
mark.groups
中的
凸面外壳的东西,但是具有它不打算覆盖的形状排除顶点。与此同时,我有一个想法:在一个范围内用一个矩形覆盖每对v,沿着连接2个v的边缘,然后将一个范围内的矩形合并/分解为一个多边形;但在R中还没有找到一种方法来实现这一点;想法?多边形并集似乎是在GEOS库中实现的,它有一个-所以只需将矩形生成为多边形,然后使用
gUnion{rgeos}
计算它们的并集。最后,可能需要对角点进行一些平滑处理,以使结果看起来很好。(警告一句:我不是R专家,我自己也从未使用过rgeos);我想到的是圆角矩形。无论如何,我查了一下GEOS,听起来不错,但问题是它似乎需要单独安装一个外部程序/库。从长远来看,我希望将这里的原型开发成一个包,这样包依赖性就可以了,但我认为要求用户安装单独的程序不是一个好的做法。从概念上看,这似乎是一个很简单的想法(那么几何也不是我的强项)
library(MASS)
xx <- runif(5, 0, 1);yy <- abs(xx)+rnorm(5,0,0.2) 
plot(xx,yy, xlim=c( min(xx)-sd(xx),max(xx)+sd(xx)), ylim =c( min(yy)-sd(yy),    max(yy)+sd(yy))) 
dens2 <- kde2d(xx, yy, lims=c(min(xx)-sd(xx), max(xx)+sd(xx), min(yy)- sd(yy), max(yy)+sd(yy) ),h=c(bandwidth.nrd(xx)/1.5, bandwidth.nrd(xx)/ 1.5), n=50 ) 
contour(dens2, level=0.001, col="red", add=TRUE, drawlabels=F) 
# compare:
layout.reingold.tilford(g,1)
plot(g, layout=l, axes=T)