如何将 igraph 中的边标签与边分开?

2024-05-07

我想移动边缘标签的位置,使其不在其上方。 这是一个小例子:

 g <- graph.empty(n=3) 
 g <- graph(c(1,2,3,2,1,3), directed=T)
 E(g)$weight <- c(3,2,5) 
 plot(g, edge.label = E(g)$weight)

在我的示例中,标签位于边缘,我希望它们垂直于边缘移动一点。


igraph 绘图有参数edge.label.x and edge.label.y用于放置边缘标签,但必须在用于绘制绘图的坐标中指定这些标签。为了获得正确的坐标,您需要自己控制布局。 @GaborCsardi 在他的评论中提出了类似的建议,但实现这一点已经足够复杂,我认为它值得一个完整的答案。

## Setup - your example graph
library(igraph)
g <- graph.empty(n=3) 
g <- graph(c(1,2,3,2,1,3), directed=T)
E(g)$weight <- c(3,2,5) 

现在,我们不只是绘制,而是捕获顶点的布局以便我们可以使用它。我设置了随机种子以实现可重复性。

set.seed(1234)
LO = layout_nicely(g)

布局给出了我们可以用于绘图的顶点的 x-y 坐标。 我们想要使用这些位置来计算我们将在哪里写入边缘标签。我们将首先计算边缘的中心,然后调整垂直于边缘的位置。一个要点:如果一条边缘接近水平,则垂线的斜率接近无穷大,因此垂直位移的计算可能会出现问题。我们将对此进行测试并回避该问题。

## Start with the centers of the edges (on line)
ELx = rep(0, ecount(g))
ELy = rep(0, ecount(g))
for(i in 1:ecount(g)) {
    ELx[i] = (LO[ends(g,i)[1],1] + LO[ends(g,i)[2],1])/2
    ELy[i] = (LO[ends(g,i)[1],2] + LO[ends(g,i)[2],2])/2 }

## Adjust perpendicular to line
d = 0.03
for(i in 1:ecount(g)) {
    if(abs(LO[ends(g,i)[1],2] - LO[ends(g,i)[2],2]) < 0.1) {
        ## This avoids problems with horizontal edges
        ELy[i] = ELy[i] + shift 
    } else {
        S = (LO[ends(g,i)[2],1] - LO[ends(g,i)[1],1]) / 
            (LO[ends(g,i)[1],2] - LO[ends(g,i)[2],2])
        shift = d / sqrt(1 + S^2)
        ELx[i] = ELx[i] + shift
        ELy[i] = ELy[i] + S*shift
    }
}

现在我们可以绘制并指定边缘标签的更好位置。默认情况下,绘制 igraph 对象会将 x 轴和 y 轴的布局重新调整为 [-1,1] 范围。如果发生这种情况,布局中的值将不再对应于图表上的位置。所以我们将使用rescale=FALSE。但igraphstill想要在[-1,1]范围内绘图,所以我们还必须设置xlim和ylim。

plot(g, layout=LO, edge.label = E(g)$weight,
    rescale=FALSE, xlim=range(LO[,1]), ylim=range(LO[,2]), 
    edge.label.x=ELx, edge.label.y=ELy)

调节距离d = 0.03有点随意。我选择它是为了让这个图表看起来更漂亮。如果您有更复杂的图表,您可能需要调整该距离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 igraph 中的边标签与边分开? 的相关文章

随机推荐

  • 如何从命令行提供非 slurpy 数组或命名数组?

    首先 raku perl6 非常棒 克罗也是如此 只花了一个周末就坠入爱河 然而现在我偶然发现了一些非常简单的事情 如果我在多重调度 MAIN 中使用 slurpy 参数 则会被识别并完美运行 multi MAIN config add h
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • Python 3.7 Windows 不支持 dbm.gnu 吗?

    做的时候 import dbm gnu 在适用于 Windows 的标准 Python 3 7 6 64 上 我得到 文件 C Python37 lib dbm gnu py 第 3 行 位于从 gdbm 导入 ModuleNotFound
  • XSL。评估表达

    对不起我的英语不好 XSL 1 0 如何从元素或属性值计算表达式 例如 XML
  • 在 Protractor 测试中同步处理

    我正在尝试在量角器中编写一个我认为相当简单的测试 但似乎当您尝试同步执行任何操作时 量角器就会让您的生活变得困难 通常 处理定位器函数 返回 Promise 不是问题 因为任何 Expect 语句都会在测试断言之前自动解析传递给它的任何 P
  • 在 OS X 10.7.4 上安装 RSRuby 时找不到库

    我正在尝试在我的 Mac 上安装 RSRuby 调用后 sudo gem install rsruby 我收到此错误 ERROR Cannot find the R library aborting extconf rb failed Co
  • 插入标准模式文档中的动态 iframe 默认为怪异模式

    我有一份当前正在返回的父文档CSS1Compat from document compatMode 当我使用 jQuery 添加一个空白 iframe 时 如下所示 body append 并检查新 iframe 的 compatMode
  • 从java程序调用SVN命令

    我想从 java 程序调用 SVN 命令 update commit 有什么帮助吗 SVN 乌龟SVN 环境 java程序将在jBoss服务器内运行 从应用程序服务器内使用 GUI SVN 客户端是一个非常非常糟糕的主意 而Tortoise
  • 服务器端生成的 Excel 中出现 System.Runtime.InteropServices.COMException 错误

    我们有一个 Web 应用程序 可以生成 Excel 电子表格并在服务器端运行宏 然后它通过电子邮件将它们发送给不同的人 它是传统报告风格的一部分 我们正在对其进行转换 但仍然支持我们作为 IIS 中的网站提供的新应用程序 我知道进行 Off
  • 发布后忽略基本标签

    在 Chrome 上我收到错误Refused to execute a JavaScript script Source code of script found within request 在发布包含域名的数据后 另请注意任一页面上都缺
  • Openshift 上的自定义 Node.js 版本

    我在运行自定义节点版本时遇到问题node0 10您可以在开放班次中找到墨盒here https github com DavidReinberger openshift meteor leaderboard customNode 我可以很好
  • 视频回退到 Flash 在 Firefox 中不起作用

    我一直在审查有关开发人员向其 HTML5 网站添加 Flash 后备的不同方式的材料 我有这个带有虚拟视频的测试代码
  • 故事板中的 Xcode 6 UIVisualEffectView

    我正在 Xcode 6 中的对象库中查找 UIVisualEffectView 以在 Storyboard 中添加模糊效果 我知道如何以编程方式执行此操作 但我找不到在故事板中执行此操作的方法 这在当前的测试版中是否不可用 或者有没有一种不
  • Python 字符串到 SQL IN 参数的列表

    我在 python 中有这个查询 ssim group S1200 S1300 query select WIPMessageCnt from waferdata where recipename in s and equipment an
  • Django 全文搜索优化 - Postgres

    我正在尝试利用 Django v2 1 和 Postgres 9 5 创建一个地址自动完成功能的全文搜索 但性能目前不适合自动完成 我不明白逻辑我得到的绩效结果背后 就信息而言 该表相当大 有 1400 万行 我的型号 from djang
  • 将outer()应用于两个列表

    我有一个清单 说exm list elm1 c a b elm2 c b c d elm3 c b c d e 我想对以下两个元素的每个组合应用一个函数exm e g length intersect exm elm1 exm elm2 结
  • Android 开发应用程序密钥和应用程序秘密

    我正在尝试使用带氦气选项的城市飞艇为 Android 应用程序设置推送通知 但是 我需要为我的应用程序找到这些信息 但我不知道从哪里可以找到 任何意见或建议将不胜感激 谢谢你 For setting up Helium make sure
  • Tkinter - 打开一个窗口并关闭另一个窗口

    我想要一个登录屏幕 当登录成功时 屏幕将关闭并创建一个新屏幕 问题是 当我执行以下代码时 两个屏幕同时打开 如果您有任何改进代码的建议 请提出 from Tkinter import import mysql connector impor
  • Entity Framework Core 1.0 连接字符串

    我们正在开发一个非常大的 ASP NET Core MVC 1 0 应用程序 我们的每个应用程序都有 4 层 如下所示 DTO 存储库 实体框架 代码优先 服务 业务逻辑 MVC UI MVC 目前 在我们处理所有数据库操作的存储库中 我们
  • 如何将 igraph 中的边标签与边分开?

    我想移动边缘标签的位置 使其不在其上方 这是一个小例子 g lt graph empty n 3 g lt graph c 1 2 3 2 1 3 directed T E g weight lt c 3 2 5 plot g edge l