排斥网络边缘的文本

2023-11-25

在绘制网络时,如果节点的标签也能避开网络边缘就好了。例如。在下面的示例中,可以将所有标签移到网络之外。我已经尝试了几个软件包,但到目前为止还没有找到一种简单的方法来做到这一点。有办法吗?下面的例子:

library(ggraph)
library(tidygraph)
reprex <- tibble(to = sample(1:10, 100,replace=T),
                 from = sample(1:10, 100,replace=T)
                 ) %>%
  as_tbl_graph()
V(reprex)$label1 <- rep("label",10)

reprex_plot <- reprex %>%
  ggraph() +
  geom_node_point() +
  geom_edge_link(color="grey")+
  geom_node_text(aes(label=label1),repel=T,force=100)+
  theme_bw()

reprex_plot

enter image description here


据我了解这里的问题,ggrepel,这是使用的包geom_node_text,只能访问节点所在的层,而不能“看到”边缘。这使得ggrepel不太适合网络(或者我错过了一些东西)。

不幸的是,我也没有一个很好的解决方案来解决这个问题,尽管我已经寻找了一段时间了。这里有两个建议,您(或任何人)可以如何转向更好的标签方式ggraph():

1:文本作为节点

所以我的一个想法是让网络布局算法为我们完成工作。我制作了另一组仅包含标签的节点。标签节点仅连接到它们标记的网络中的一个相应节点。开始了:

library(dplyr)
library(ggraph)
library(tidygraph)

set.seed(123)

reprex <- tibble(from = sample(1:10, 100, replace = TRUE),
                 to = sample(1:10, 100, replace = TRUE)) %>%
  as_tbl_graph() %>% 
  activate(edges) %>% 
  mutate(color = "grey")

我在这里添加边缘颜色灰色,因为我们在最终图中将有两种不同的颜色。

nodes <- reprex %>% 
  activate(nodes) %>% 
  as_tibble() # extract data.frame of nodes

# create new graph with just the lables
labels <- tibble(from = 1:10,
                 to = 11:20) %>% 
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(label1 = "label",
         is_label = !name %in% nodes$name) %>% 
  activate(edges) %>% 
  mutate(color = "black")

# join graph and labels
new_graph <- graph_join(labels, reprex, by = "name")

现在我们有了带有标签节点的新图,我们可以进行绘图了。请注意,我添加了一个变量is_label到新图,以便我们可以使用不同的节点形状并确保仅标记标签节点:

reprex_plot <- new_graph %>% 
  ggraph() +
  geom_edge_link(aes(color = color)) +
  geom_node_point(aes(filter = !is_label, shape = "circle"), show.legend = FALSE) +
  scale_edge_color_identity() +
  geom_node_text(aes(filter = is_label, label = label1), hjust = -0.1) +
  theme_void()
reprex_plot

enter image description here

显然,还有很大的改进空间。标签现在距离节点非常远。它们仍然与自己的边缘重叠(尽管我认为这可以通过提供更好的 hjust 值来解决)。虽然这适用于自动布局,但其他布局可能会做奇怪的事情,具体取决于您的数据。我真的希望其他人能提出更好的解决方案。但我想我还是把它放在这里吧。也许有人感到受到启发。

2:用标签代替文字

解决该问题的另一种方法是在文本上使用白色背景。该解决方案的灵感来自于网络绘图 GUI 程序如何处理该问题。我们可以用ggplot2's geom_label为此,虽然geom_node_label()也会达到同样的效果。这个解决方案更加简单,但也有局限性。这是一个管道中的全部内容:

tibble(from = sample(1:10, 100, replace = TRUE),
       to = sample(1:10, 100, replace = TRUE))  %>%
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(label1 = "label") %>%
  ggraph() +
  geom_edge_link(color = "grey") +
  geom_node_point() +
  geom_label(aes(x = x, y = y, label = label1), nudge_y = 0.1, label.size = NA) +
  theme_void()

enter image description here

我删除了标签上的边框并将它们直接放置在节点上方(nudge_y = 0.1)。您的结果可能会有所不同,具体取决于图的大小,因此您可能需要更改该值。

在较大的网络上,标签的白框可能会覆盖其他节点。

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

排斥网络边缘的文本 的相关文章

  • mtext:使用布局时较小的标签描述

    使用 mtext 作为标签描述与使用 xlab 的作用不同 如何使 mtext 标签始终与使用 xlab 时的大小相同 无需始终定义 cex 参数 在下面的最小示例中 两个图的 cex cex lab 1 不过大小不同 layout mat
  • 导出绘图变量显示空白图像

    我正在使用 JRI 进行 java 和 R 集成 请找到下面的脚本 String path C Users hrpatel Desktop CSVs DataNVOCT csv rengine eval library tseries re
  • 词云中的空格

    我目前将 wordle 用于词云的许多艺术用途 我认为 R 的词云可能具有更好的控制能力 1 如何在词云中保持单词大写 解决了 2 如何将两个单词作为一个块保留在词云中 wordle 使用 运算符来完成此操作 R 的词云仅按原样打印 例如
  • 相对于时间求平均值

    我有以下带有日期时间和相应值的数据集 时间间隔为每10分钟一次 我需要以 15 分钟的间隔生成新行 例如 15 40 的值为 599 15 50 的值为 594 因此需要在两者之间生成一个新行 即 15 45 的平均值为 599 和 594
  • 将“dplyr::across”与具有多个参数的函数一起使用

    我想知道是否有办法使用dplyr across一个需要多个参数的函数 如果没有 如何执行以下操作dplyr tidyverse library dplyr create a dataframe df lt structure list x1
  • 如何将曲线拟合到直方图

    我已经探讨了有关该主题的类似问题 但在我的直方图上生成漂亮的曲线时遇到了一些麻烦 我知道有些人可能会认为这是重复的 但我目前还没有找到任何可以帮助解决我的问题的东西 尽管数据在此处不可见 但这里是我使用的一些变量 以便您可以在下面的代码中看
  • R 计算股票的 beta(使用 PerformanceAnalytics CAPM.beta() 函数或 lm() 函数产生意外结果)

    我正在尝试使用 PerformanceAnalytics CAPM beta 函数量化 R 中股票的 beta 基准测试与 SPY 结果甚至与我在 Yahoo Google Finance 在线看到的值不接近 代码 require Perf
  • 将数据帧单列中的值向上移动

    使用这样的示例数据 example data frame x c 1 2 3 4 5 6 7 8 y c 1 2 3 4 5 6 7 8 z c 1 2 3 4 5 6 7 8 看起来像这样 x y z 1 1 1 1 2 2 2 2 3
  • 如何从线性模型 (lm) 预测 x 值

    我有这个数据集 x lt c 0 40 80 120 160 200 y lt c 6 52 5 10 4 43 3 99 3 75 3 60 我使用计算了一个线性模型lm model lt lm y x 我想知道的预测值x如果我有新的y值
  • Databricks:如何从 R Dataframe 切换到 Pandas Dataframe(同一笔记本中的 R 到 python)

    我正在 Databricks 笔记本中编写 R 代码 该代码在 R 中执行多项操作 清理数据帧后 我想使用 python 在 python 单元中调用它 因此使用 python 代码继续对数据帧进行操作 因此 我想在 python 块内将我
  • 替换 R 中内置函数的定义?

    sparcl 包使用标准 stat 包中的 kmeans 函数 我想让它使用我自己的 kmeans 实现 一种方法是编辑 sparcl 包本身中的代码 我宁愿避免这种情况 因为它会很混乱 而且我不确定如何在 R 中安装编辑过的代码 不幸的是
  • 按列名称索引拆分数据框

    这是先前问题的变体 df lt data frame matrix rnorm 9 9 ncol 9 names df lt c c 1 d 1 e 1 a p b p c p 1 o1 2 o1 3 o1 我想按下划线 后面的column
  • 替换 gtable 中 ggplot 的元素:标签和网格线

    我正在学习操纵ggplot对象与gtable 这是我问的一个相关问题 用 grid 和 gtable 拆解 ggplot https stackoverflow com questions 27750737 dismantling a gg
  • merge.zoo 删除时区

    的结果merge zoo与其输入的时区不同 考虑下面的例子 library zoo zoo a zoo data frame a 1 5 seq as POSIXct 2014 01 01 00 00 01 tz UTC as POSIXc
  • 用 R 将矩阵划分为 N 个大小相等的块

    如何使用 R 将矩阵或数据帧划分为 N 个大小相等的块 我想水平切割矩阵或数据框 例如 给定 r 8 c 10 number of chunks 4 data matrix seq r c nrow r ncol c gt gt gt da
  • ggplot2极坐标图轴标签位置

    This is just a extension for a old question ggplot2 polar plot arrows https stackoverflow com questions 10515703 ggplot2
  • dplyr 中每组的 cumsum

    我开始享受dplyr但我陷入了一个用例 我希望能够申请cumsum数据框中的每个组与包 但我似乎无法正确处理 对于演示数据框 我生成了以下数据 set seed 123 len 10 dates as Date 2014 01 01 1 l
  • RStudio 服务器未启动

    过去几个月我一直在远程 RStudio 服务器上工作 没有任何问题 今天 我使用此命令重新启动了 rstudio 服务器 sudo rstudio server restart 此后 我无法通过浏览器访问服务器 它继续等待 我用这个检查了状
  • R 使用 dplyr 将列移动到最后

    对于 data frame 来说n列 我希望能够从任何列移动列1 n 1 位置 成为第 n 列 即非最后一列成为最后一列 我也想使用dplyr 我想这样做而不是简单地键入所有列的名称 例如 data lt data frame a 1 5
  • mutate rowSums 排除一列

    我有一个像这样的数据框 gt df Source local data frame 4 x 4 a x y z 1 name1 1 1 1 2 name2 1 1 1 3 name3 1 1 1 4 name4 1 1 1 想要通过添加 x

随机推荐

  • 需要归档CLLocation数据

    我有一个数组CLLocation我想要存档的数据 应该NSUserDefaults系统可以用吗 否则 如何最好地归档CLLocation data 要正确存储 CLLocation 而不会丢失信息 请使用 NSKeyedArchiver 如
  • 如何从同一模块中的类名字符串获取类对象?

    我有课 class Foo def some method pass 还有另一个班级在同一个模块中 class Bar def some other method class name Foo Can I access the class
  • 未解决的外部符号错误仅发生在 64 位模式中,而不是在 32 位构建中

    我有一个 VC 代码 使用 VS2008 构建 它使用了一些静态库 在编译时静态链接的 lib 文件 为了便于理解 我们将我的 EXE 代码称为 AAA EXE 并将 lib 文件称为 A lib b lib 等 AAA EXE代码和静态库
  • php 发送带有附件的电子邮件

    我似乎找不到我编写的这个应该发送带有附件的电子邮件的 php 函数的问题 我已经为此挣扎了很长一段时间 function myMail to subject mail msg filename contentType random hash
  • 由于用空格扩展变量而导致的 Grep 错误

    我有一个名为 physics 1b sh 在 bash 中 如果我尝试 x physics 1b grep string x sh grep 抱怨 grep physics 1b No such file or directory 然而 当
  • 使用 Ruby on Rails 安排发送电子邮件任务的最佳方式是什么?

    我想安排一项日常任务 每天早上 7 点 我希望发送一封电子邮件 无需人工干预 我正在研究 RoR 框架 我想知道最好的方法是什么 我听说过 BackgrounDRB OpenWFEru 调度程序或基于 Cron 的东西 但我是新手 不明白哪
  • Oracle SQL 在包含数据时将列类型从 number 更改为 varchar2

    我在 Oracle 11g 中有一个表 包含数据 我需要使用 Oracle SQLPlus 执行以下操作 目标 更改列的类型TEST1在表中UDA1 from number to varchar2 建议的方法 备份表 将列设置为空 改变数据
  • CKEditor 插入 HTML

    我有数据库中的数据 在我的 js 文件中 我想更改 CKEditor 文本编辑器的值 我的值是原始 html 我希望将此原始值写入空的 CKEditor 文本编辑器 我尝试了这些 但总是出现未定义的函数错误 CKEDITOR instanc
  • java编译中出现未检查或不安全操作错误? [复制]

    这个问题在这里已经有答案了 我正在完成学校的实验作业 并在编译时收到此错误 程序运行良好 有点想修复导致错误的原因 程序代码和完整错误如下 一如既往的感谢 错误 注意 F Java Lab 8 Lab8 java 使用未经检查或不安全的操作
  • Android 中 Activity 的服务回调

    我有一个正在运行的后台服务和一个与该服务交互的客户端 当客户端请求某些操作时 服务会执行该操作并将结果发送回活动 客户端 我知道如何调用活动中的服务方法 并使用回调我们可以实现我想要做的事情 但我无法理解Api demos remotese
  • 为什么Android模拟器的编号是5554

    这可能是一个完全开箱即用的问题 我只是想知道为什么Android模拟器的编号是5554 5556这样的 Android 模拟器使用网络与 Android SDK 工具进行通信 即使此通信仅限于本地主机 这允许安装应用程序 调试等 当您启动模
  • 以编程方式检索 Google Sheets 单元格边框样式

    有可能set the 范围边框样式和颜色 现在的问题是 我们怎样才能get以编程方式设置边框样式 我正在寻找类似的东西 var ss SpreadsheetApp getActiveSpreadsheet var sheet ss getS
  • Node.js 在断开连接事件时不发送套接字

    当有人连接到节点服务器时 我会保留一个包含所有套接字的数组 这样我就可以在需要时向每个人广播消息 或者循环用户来计算在线用户的数量等 所有这些工作正常 但是当触发断开连接事件时 我在参数中没有收到套接字 还有另一种方法可以知道哪个套接字刚刚
  • CSS 相当于 Photoshop 的 Justify-All

    我想采用 h2 元素并将其文本跨越其 div 的宽度 text align justify 仅当文本的宽度大于其容器的宽度时才展开文本 有点像 Photoshop 的 justify left CSS h2 text align justi
  • Swing,如何正确更新UI

    在 Swing 上进行一些操作后更新 UI 的正确方法是什么 例如 单击按钮后 调用的方法可能几乎是即时的 也可能需要几秒钟的时间 事实上 所有应用程序逻辑都是通过 Web 服务远程完成的 因此等待应用程序响应一段时间是正常的 我的按钮事件
  • opencv中的“InputArray”和“Mat”是否相同?

    例如 在文档中有 void cv absdiff InputArray src1 InputArray src2 OutputArray dst 是不是等同于 void cv absdiff Mat src1 Mat src2 Mat ds
  • C99 预处理器图灵完整吗?

    发现后增强预处理器的能力我发现自己在想 C99 预处理器图灵完整吗 如果没有的话 缺少什么才没有资格呢 宏不会直接递归扩展 但我们可以通过一些方法来解决这个问题 在预处理器中执行递归的最简单方法是使用延迟表达式 延迟表达式是需要更多扫描才能
  • Gradle 根据构建风格交换 jniLibs 资源

    我正在尝试交换一些资源res raw文件夹和jniLibs armeabi文件夹基于是否是release buildType or a debug buildType 我目前也有两种产品口味 build gradle 文件 apply pl
  • 如何在android中创建弯曲的底部边框矩形?

    如何使用 xml 创建具有完美弧形底部的 Android 可绘制对象 如下所示 我已经尝试过这个xml 但结果并不完美
  • 排斥网络边缘的文本

    在绘制网络时 如果节点的标签也能避开网络边缘就好了 例如 在下面的示例中 可以将所有标签移到网络之外 我已经尝试了几个软件包 但到目前为止还没有找到一种简单的方法来做到这一点 有办法吗 下面的例子 library ggraph librar