在R中绘制图形G=(V,E)

2023-12-23

我想通过 ggplot 或一些 R 内置函数在 R 中绘制标准 G=(V,E) 图。

我有一个包含顶点坐标的数据框:

> V
      x        y
1  589.3438 6422.883
2 8762.6921 7789.147
3 7973.0883 4552.745
4 4100.8408 8108.702
5 6049.3329 6547.239

以及表示边的零一对称矩阵:

> E
       [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    1    0
 [2,]    0    0    1    0    1
 [3,]    0    1    0    0    1
 [4,]    1    0    0    0    1
 [5,]    0    1    1    1    0

我使用以下方法绘制顶点:

plotGraph <- function() {
  qplot(x,
        y,
        data=V,
        xlim=c(0,SIZE),
        ylim=c(0,SIZE),
        main="Graph"
  )
}

如何在同一个图上绘制图形边缘?或者如何绘制从 (x1, y1) 到 (x2, y2) 的单边?

任何帮助,将不胜感激。


EDIT(2017 年 7 月 7 日):

由于我最初回答了这个问题,一个新的和改进的网络/图形绘图包,ggraph,已经发布,我认为它应该取代下面的选项,所以我正在编辑我的答案以添加ggraph option:

首先,进行一些操作以获取 igraph 图形对象的顶点和边:

library(igraph)
library(tidyverse)
library(ggraph)

V <- read.table(text = "x        y
                        589.3438 6422.883
                        8762.6921 7789.147
                        7973.0883 4552.745
                        4100.8408 8108.702
                        6049.3329 6547.239", 
    header = T) %>%
  rownames_to_column("name")

E <- matrix(c(0,    0,    0,    1,    0,
              0,    0,    1,    0,    1,
              0,    1,    0,    0,    1,
              1,    0,    0,    0,    1,
              0,    1,    1,    1,    0), nrow = 5, byrow = T) %>%
  data.frame() %>% 
  rename_all(list(function(x) 1:5)) %>% 
  rownames_to_column(var = "from") %>% 
  gather(to, val, 2:6) %>% 
  filter(val == 1) %>%
  select(from, to)

g <- graph_from_data_frame(E, vertices = V, directed = F)

现在来了ggraph魔法。为了说明它的威力,我混合并匹配了各种边缘和节点geom提供可能的样本ggraph.

ggraph(g) + 
  geom_edge_link() + 
  geom_node_label(aes(label = name))
#> Using `nicely` as default layout
ggraph(g) + 
  geom_edge_arc() + 
  geom_node_point()
#> Using `nicely` as default layout
ggraph(g) + 
  geom_edge_diagonal() + 
  geom_node_text(aes(label = name), color = "blue")
#> Using `nicely` as default layout

原答案:

如果使用igraph是一个选择,我会推荐它。在处理图表时这是一个非常有用的包。这是我使用 igraph 的方法:

library(igraph)

# convert V to a matrix and E to a graph
V <- data.matrix(V)
g <- graph_from_adjacency_matrix(E, mode="undirected")

plot.igraph(g, layout = V)

或者,如果您想要 ggplot 风格的方法,您可以使用ggnet2来自GGally包裹:

library(GGally)

V <- data.matrix(V)
# with ggnet2 you don't have to convert E to a graph

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

在R中绘制图形G=(V,E) 的相关文章

随机推荐

  • .NET System.Diagnostics.Stopwatch 问题(返回值太低)

    在我的计算机上 秒表返回的值太低 例如 当我指定时为 200 毫秒Thread Sleep 1000 该程序应该等待 1 秒 我也测试过ManualResetEvent WaitOne 1000 并得到相同的结果 框架 2 0 和 3 0
  • SQL 中的排除语句

    如何使用SQL语句从SQL数据库中排除数据 我的情况是 我有一个用户登录到他们的个人资料页面 他们可以在其中与人交友 我想显示在 SQL 数据库中找到的除他们自己之外的所有用户 也许只是 SELECT FROM Users WHERE Us
  • 如何创建一个迭代器来生成项目,其中没有项目的单个字符在 python 中表示超过 n 次?

    我创建了一个脚本 它使用以下代码来迭代 sCharacters 字符串中的所有字符组合 sCharacters abcdefghijklmnopqrstuvwxyz0123456789 iKeyLength len sCharacters
  • 如果 PostgreSQL 上不存在如何添加列?

    问题很简单 如何添加列x到餐桌y 但仅当x列不存在 我找到了唯一的解决方案here https stackoverflow com questions 9991043 how can i test if a column exists in
  • nginx代理通过Node,SSL?

    我的 nginx 服务器实际上是用一个简单的方法代理我的节点后端 监听端口 3000 location api proxy pass http upstream 1 其中upstream 1是我在nginx conf中定义的节点集群 在端口
  • 什么是跟踪分支?

    有人可以解释一下适用于 git 的 跟踪分支 吗 这是来自的定义git scm com https git scm com book en v2 Git Branching Remote Branches Git 中的 跟踪分支 是本地分支
  • 继承:选择继承哪些基类方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有课Base并想写一个类Derive它仅继承了部分成员函数Base 有什么方便的方法可以做到这一点吗 例如 class Base void
  • 在 C# 中访问简单的布尔标志时,是否需要锁定或标记为易失性?

    假设您有一个在后台线程上运行的简单操作 您希望提供一种方法来取消此操作 因此您创建一个布尔标志 并从取消按钮的单击事件处理程序将其设置为 true private bool cancelled private void CancelButt
  • 如何将 Material UI 中的组件居中并使其具有响应能力?

    我不太了解 Material UI 网格系统 如果我想使用表单组件进行登录 在所有设备 移动设备和桌面设备 上将其置于屏幕中央的最简单方法是什么 因为您将在登录页面上使用它 这是我在使用 Material UI 的登录页面中使用的代码 材质
  • Pyspark - 多列聚合

    我有如下数据 文件名 babynames csv year name percent sex 1880 John 0 081541 boy 1880 William 0 080511 boy 1880 James 0 050057 boy
  • 如何使用wait\notify处理器?

    我正在运行 nifi 实例 1 2 0 我只是尝试使用 Wait Notify 处理器并参考以下内容http ijokarumawak github io nifi 2017 02 02 nifi notify batch why merg
  • Go符文类型解释

    我在 Go 中找到了符文类型 并且有一个简单的问题但值得解释一下 我发现它是int32的别名 目的是区分数字和字符值 http golang org pkg builtin rune http golang org pkg builtin
  • 如何使用 Moq 模拟会话对象集合

    我在用shanselmann 的 MvcMockHelper http www hanselman com blog ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers aspx我正在使用 Moq 来模拟
  • Mysql 使用Where 进行选择,如果where 条件不存在则默认

    我有表 Product 和 ProductDetails 在 ProductDetails 中 我有包含多种语言的产品描述的行 按 lang 列区分 并非每个产品都有每种语言的描述 如何进行选择以选择指定语言的描述 通过Where prod
  • 如何根据用户输入的值创建验证范围?

    我想在单元格 A1 中创建一个验证范围 此验证允许用户输入从 1 到 x 的值 而 x 指的是用户在 B1 中输入的值 例如 如果用户在 B1 中输入值100 那么我们只能在单元格 A1 中输入1到100 我想知道如何在 C 中做到这一点
  • 访问 Angular Material 表中的输入字段

    几天来我一直在尝试从角度材质表内的输入字段获取数据 我基本上是用来自 API 的值填充表格 但是每当我们没有获得任何日期时 在我的情况下 课程没有设置预定日期 我会插入一个文本框 其中应显示该值这样用户就可以为该特定课程设置日期 Like
  • Orange Hrm 3.1-向选项卡添加新的菜单标题

    我是 symfony 框架的新手 我使用的是 Orangehrm 3 1 1 我在第二级选项卡中添加了一个新的菜单标题 但我不知道如何导航到特定的 href 链接 请帮我完成步骤 这是我通过数据库添加菜单项的方法 要在 Orangehrm
  • 如何在 Android CalendarView 上仅显示特定月份?

    我想在 CardView 上显示特定月份without下一个和上一个箭头用于导航日历 如果我想显示 2010 年 2 月 用户必须只能看到 2010 年 2 月 他们无法查看下个月或上个月 我跟着this https stackoverfl
  • 通过回溯分割字符串

    我正在尝试编写一个代码 将无空格的字符串分割成有意义的单词 但是当我给出像 arealways 这样的句子时 它返回 a real ways 而我想要的是 are 总是 我的字典包含所有这些词 我怎样才能编写一个不断回溯直到找到最佳匹配的代
  • 在R中绘制图形G=(V,E)

    我想通过 ggplot 或一些 R 内置函数在 R 中绘制标准 G V E 图 我有一个包含顶点坐标的数据框 gt V x y 1 589 3438 6422 883 2 8762 6921 7789 147 3 7973 0883 455