草庐IT

javascript - 指定图中某些节点的位置

coder 2025-03-30 原文

有没有办法指定连接图的某个节点子集的位置,而一些算法决定其他节点的位置?我希望找到一种算法,将边缘处理得像 Spring 一样,这样它就不会离其他节点太远,例如graphopt .我查看了 igraph 中的其他几种算法,例如 lgl、drl,但它们似乎都不允许指定节点的位置,我必须让算法完全控制所有节点的位置。

我问这个是因为我有数据网络,而且一些节点我可以找到大致的地理坐标。我希望在 map 上显示整个网络。在 map 上查看网络,然后我可以迭代地识别更多具有某些地理标识的节点,最后我得到了至少在视觉上具有相当准确性的地理引用图。

我开始使用 R 上的 igraph,但我愿意尝试其他包/语言,甚至 GIS 工具,如果有接近我正在寻找的东西的话。

谢谢!

[编辑]

毕竟这个问题不是很好的问题,但是既然开始了,还是让我进一步描述一下我要找的东西吧。希望我正在寻找的东西是有意义的,并且以前有人这样做过。

G5W的建议是朝着我想去的方向前进,但我希望在固定到想要的方向后应用原始算法的原理。

FR method's paper说:

We have only two principles for graph drawing:

  • Vertices connected by an edge should be drawn near each other.
  • Vertices should not be drawn too close to each other.

所以我认为包括路径 10-8-4-1-3 的大循环应该缩小并更接近其余节点。我想我可以找到如下布局,如果我像 G5M 那样修复这四个点。

我认为该算法可能会偶然创建这样的图,并尝试如下所示,非常粗糙的蛮力方法。但是该算法从未生成我正在寻找的东西......我想我需要为算法指定一些豁免以处理固定节点之间的那些边缘。

library(igraph)
set.seed(1)
g = erdos.renyi.game(10, 0.3)
LO = layout_with_fr(g)
plot(g, layout=LO)

n <- nrow(LO)
i <-  0
for (i in 1:100000) {
#  i <- i + 1
  LO <- layout_with_fr(g)
  chk <- c(all(LO[c(5,7),2] >= sort(LO[-c(5,7),2])[n-3]), # 5,7 should come close to top
           all(LO[c(2,9),2] <= sort(LO[-c(2,9),2])[2]),   # 2,9 near bottom 
           all(LO[c(2,7),1] <= sort(LO[-c(2,7),1])[2]),   # 2,7 toward left
           all(LO[c(5,9),1] >= sort(LO[-c(5,9),1])[n-3])  # 5,9 toward right
  ) 
  if (all(chk)>1 ) break      
}

[EDIT2]

仍在寻找某种方法来做到这一点。我找到了一个 d3 页面 Stick Force Layout ,这似乎是我想要的。问题是,一旦我对布局感到满意,我不确定是否可以导出坐标。我也可能希望能够保存中间体。所以这意味着我应该能够将坐标与属性一起设置节点,无论它们是否卡住。这些数据进出。如果这对于了解 JS 的人来说是微不足道的,请给我一个指导。如果没有,我尝试想出 json 输入/输出接口(interface)。

用户没有指定节点位置的图,由某种力布局算法确定

我选择了一些节点的位置,使图形像树一样。这只是一个示例,但我的意思是我希望能够粗略地确定布局形状,而不必确定每个节点的位置。

最佳答案

您没有给出任何图表示例数据或您试图实现的特定布局,因此我将以随机图表和简单配置为目标。这个想法是,您可以让任何算法布置所有点,然后调整您想要指定的点的位置。

## basic graph for illustration
library(igraph)
set.seed(1)
g = erdos.renyi.game(10, 0.3)
LO = layout_with_fr(g)
plot(g, layout=LO)

好的,现在假设我们要将节点 2、5、7 和 9 放置在一个没有任何边交叉的盒子中。我想要做的是采用基本的盒子布局并移动它,以便这四个节点及其边缘远离图形的其余部分。我将移动这四个节点,使它们略高于其他所有节点。

UB = max(LO[,2])
DesiredLO = matrix(c(0,0,0,1,1,0,1,1), nrow=4, ncol=2, byrow=TRUE)
LO[c(2,7,9,5), ]  = DesiredLO + matrix(rep(LO[2,], 4), ncol=2, byrow=TRUE)
LO[c(2,7,9,5), 2] = LO[c(2,7,9,5), 2] + UB - LO[2,2] + 1
plot(g, layout=LO)

也许您可以根据需要调整它。如果不是,请使用此示例或类似示例来更清楚地说明您 想要做什么。

关于javascript - 指定图中某些节点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241697/

有关javascript - 指定图中某些节点的位置的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  3. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  7. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  9. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  10. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

随机推荐