使用 ggplot2 绘制二部网络图

2023-11-27

我有以下数据框:

structure(list(X1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L
), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor"), 
    X2 = structure(c(1L, 6L, 8L, 10L, 12L, 13L, 3L, 4L, 1L, 6L, 
    7L, 9L, 10L, 12L, 13L, 3L, 4L, 5L, 10L, 12L, 13L, 4L, 1L, 
    6L, 12L, 13L, 3L, 1L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 2L, 
    3L, 11L, 12L, 13L), .Label = c("I1", "I10", "I11", "I12", 
    "I13", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9"), class = "factor")), .Names = c("X1", 
"X2"), row.names = c(NA, -40L), class = "data.frame")

其中 X1 是人员编号,X2 是人员所属的组。一个人可以属于不同的组。 现在我想从每个人到他所属的每个组画一条线。和plot()我是这样解决的:

plot(0, xlim=c(0,1), ylim=c(0,1), type="n", axes=FALSE, xlab="", ylab="")

factor.to.int <- function(f) {
  (as.integer(f) - 1) / (length(levels(f)) - 1)
}

segments(factor.to.int(data$X1), 0, factor.to.int(data$X2), 1, col=data$X1)
axis(1, at = seq(0, 1, by = 1 / (length(levels(data$X1)) - 1)), labels = levels(data$X1))
axis(3, at = seq(0, 1, by = 1 / (length(levels(data$X2)) - 1)), labels = levels(data$X2))

The result looks like this: bipartite graph

现在我想知道如何使用 ggplot2 做到这一点?

感谢您的帮助!


一个简单的ggplot2您的图表的版本可以通过使用geom_segment()并像对基本图形版本所做的那样转换数据。我还使用了 ggplot2 中一些更高级的自定义选项,提供了一个可以说更精致的版本。

# Using ggplot2 version 0.9.2.1
library(ggplot2)

dat$x1_norm = rangeTransform(as.integer(dat$X1))
dat$x2_norm = rangeTransform(as.integer(dat$X2))

dat$y1 = 0
dat$y2 = 1

# Simple version.
p1 = ggplot(dat, aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1)) +
     geom_segment(size=1.2) +
     scale_colour_brewer(palette="Set1", name="Person")

ggsave(plot=p1, filename="plot_1.png", height=3.5, width=6)

enter image description here

# Fancy version.
# Create separate data.frames to manually specify axis ticks and axis text.
axis_1 = data.frame(x=rangeTransform(as.integer(unique(dat$X1))),
                    y=0, label=as.character(unique(dat$X1)))

axis_2 = data.frame(x=rangeTransform(as.integer(unique(dat$X2))),
                    y=1, label=as.character(unique(dat$X2)))

p2 = ggplot(data=dat) +
     theme_bw() +
     theme(axis.title=element_blank()) +
     theme(axis.text=element_blank()) +
     theme(axis.ticks=element_blank()) +
     theme(panel.grid=element_blank()) +
     geom_segment(aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1),
                  size=1.2) +
     geom_segment(x=0, xend=1, y=0, yend=0, size=0.7) +
     geom_segment(x=0, xend=1, y=1, yend=1, size=0.7) +
     scale_colour_brewer(palette="Set1", name="Person") +
     scale_y_continuous(limits=c(-0.2, 1.2), expand=c(0, 0)) +
     geom_segment(data=axis_1, aes(x=x, xend=x, y=y, yend=y-0.025), size=0.7) +
     geom_segment(data=axis_2, aes(x=x, xend=x, y=y, yend=y+0.025), size=0.7) +
     geom_text(data=axis_1, aes(label=label, x=x, y=y - 0.075)) +
     geom_text(data=axis_2, aes(label=label, x=x, y=y + 0.075))

ggsave(plot=p2, filename="plot_2.png", height=3.5, width=6)

enter image description here

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

使用 ggplot2 绘制二部网络图 的相关文章

  • 将多个绘图合并为 gif

    我正在尝试使用 caTools 包将多个绘图组合成一个 gif 我的基本代码如下所示 for i in 1 100 plot plots few points and lines changes slightly with each i 我
  • 调整 R 图的边距

    我对调整 R 图的边距很感兴趣 我在 MacOS 上使用 R Studio 在 2013 intel CPU Macbook pro 上运行 这是我用于生成绘图的数据 spins lt runif 50 min 0 max 50 这是我用来
  • 绘制由 R 中的 caret 包训练的 SVM 线性模型

    Purpose 我试图通过可视化 SVM 线性分类模型plot 我正在使用中提供的示例代码和数据kernlab包注意到了caret实际上通过训练 svmksvm函数 参考这里的src代码 https github com topepo ca
  • data.table 对数字和文本变量分别进行分组

    我正在尝试简化这个data table作用于数字变量和字符变量的两阶段过程 例如 取第一个元素textvar and sum每个数值变量 考虑这个小例子 library data table dt lt data table grpvar
  • 提取数据框中值前后的 n 行

    我有一个数据框 其中包含某些值Mark柱子 我想提取n标记出现之前和之后的值 包括带有标记的行 我通过使用找到我需要的值indices lt which df Mark 1 where 1是我正在寻找的价值 现在我需要例如之前 5 行和之后
  • 渲染函数的反应性参数

    我在 Flexdashboard 中有一个表 其列数可以更改 我可以动态计算列的对齐方式 默认对齐方式 23 45作为字符向量 因此左对齐该值 尽管它是一个数字并且应该右对齐 问题是我无法将此对齐传递回renderTable作为一个值ali
  • 如何在Shiny中动态生成的条件面板中格式化条件?

    我正在尝试使用 for 循环在 Shiny 中创建小部件 每个块包含 label 复选框 选择选择器 两个数字输入 我想根据复选框的值和选择选择器的值来设置显示或隐藏两个数字输入的条件 在我创建的 for 循环中 我为每个小部件变量添加了一
  • R 是解释型编程语言还是编译型编程语言?

    R 是解释型编程语言还是编译型编程语言 The R FAQ https cran r project org doc FAQ R FAQ html What is R 003f说 R 的核心是一种解释型计算机语言
  • 如何在 R 中编写 csv 文件,其中我的输入作为行写入文件?

    这是一个非常简单的问题 令我惊讶的是网上没有例子 我有一个向量 vector lt c 1 1 1 1 1 我想将其写为 csv 作为一个简单的行 write csv vector file myfile csv row names FAL
  • R 中的闭包类似于 Python

    首先考虑以下 Python 代码 该代码计算函数被调用的次数 def counter fn count 0 def inner args kwargs nonlocal count count 1 print Function 0 was
  • 如何将管道链 (magrittr) 的结果提供给对象

    这是一个相当简单的问题 但我无法通过 google stackexchange 找到答案并查看 magrittr 的文档 如何提供通过 gt 连接的函数链的结果来创建向量 我看到大多数人做的是 a lt data frame x c 1 3
  • R中按字母顺序对每一行字符串进行排序

    我环顾四周 似乎找不到解决这个问题的好方法 我有一个包含行名称的列 我想按字母顺序对每一行进行排序 以便稍后可以识别具有相同名称但顺序不同的行 数据如下 names lt c John D Josh C Karl H John D Bob
  • Rstudio 更有意义的窗口标题

    我在 Ubuntu 16 04 下使用 R studio 版本 1 0 143 窗口标题仅显示一个非常无信息的 RStudio 我希望至少有当前选项卡的名称 或者最好是与此选项卡对应的文件的完整路径 在 Windows 下 完整路径似乎出现
  • 在 R 中提取模式/分隔符之间的字符串

    我的变量名称格式如下 PP Sample 12 GT or PP Sample 17 GT 我正在尝试使用字符串拆分来 grep 出中间部分 即Sample 12 or Sample 17 但是 当我这样做时 IDtmp lt sapply
  • 对列表中的每个数值列表求和

    我想将值附加到 R 中河图中的标签 我有一个值列表列表 需要它来显示节点之间的流 如下所示 edges lt list A list C 10 E 5 B list C 10 C list D 13 E 7 我知道有一个函数可以减少 或求和
  • 在 R 中将列表列表转换为数据帧:Tidyverse 方式

    我正在寻找将列表列表转换为 R 中的数据帧的 Tidyverse 方法 Create a list of lists a lt seq 1 10 1 b lt seq 1 20 2 Function to calculate the sum
  • 在 Ubuntu 上安装软件包需要很长时间

    我之前使用 Windows 作为操作系统 RStudio 用于 Windows 今天切换到 Ubuntu 并再次安装了 R 和 RStudio 当我尝试从 CRAN 安装一些软件包时 仅tidyverse 使用install package
  • sapply 函数从命名向量中的值填充数据帧的列,需要很长时间。有更快的方法吗?

    这是我正在做的一个例子 x lt c a 2 b 4 c 2 d 9 df lt data frame names c d c a b x是一个命名向量 其值的顺序与它们在中出现的顺序不同df names 我需要在数据框中形成一个新列 该列
  • ggplot:按组自动化的百分位线

    我找到了dplyr gt 运算符有助于简单的 ggplot2 转换 无需求助于ggproto 这是必需的ggplot2 扩展 http docs ggplot2 org dev vignettes extending ggplot2 htm
  • 反转默认比例梯度ggplot2

    我是新手 我正在尝试设计热图 这是我的代码 ggplot gd aes Qcountry Q6 1 Q6d order TRUE geom tile aes fill prob colour white theme minimal labs

随机推荐

  • OS X 产品签名错误:找不到适当的签名身份

    我正在尝试使用命令行实用程序签署 OS X 安装程序包产品标志 但出现错误 productsign sign Developer ID Installer XYZ input pkg output pkg productsign error
  • 如何在mysql中按年龄段对用户数量进行分组

    本质上我有一个 mysql 数据库 其中包含用户及其相应的出生日期 我还发现了以下代码 可以帮助我找到用户从出生日期算起的实际年龄 查找出生日期我需要做的是找到不同的 年龄段 并计算该年龄段的用户数量 我也发现了this示例准确地展示了如何
  • 有没有办法让不和谐机器人通过accept_invite或类似的东西加入服务器?

    注意 我使用的是discord py 0 16 12 我想知道是否有任何方法可以让机器人在代码中加入服务器 就像有一个命令是这样的 client command pass context True async def join ctx in
  • 如何在pygame中显示文本? [复制]

    这个问题在这里已经有答案了 我无法弄清楚如何在 pygame 中显示文本 我知道我不能像常规 Python IDLE 那样使 用 print 但我不知道如何使用 import pygame sys from pygame locals im
  • 带有 QAbstractListModel 的 QListView 显示空列表

    我创建了一个非常简单的例子QListView与定制QAbstractListModel The QListView显示但它是空的 我究竟做错了什么 Code include
  • Android:以编程方式从 Java 代码填充微调器

    如何以编程方式从 java 代码填充微调器 我的布局中有一个微调器 如下所示
  • GWT DataGrid 自动高度

    我正在尝试在我的应用程序中插入 gwt 数据网格 如果我设置静态高度 500px 一切都会很好 但我想让 dataGrid 自动调整到屏幕尺寸 当高度为 100 时 我得到一个空白屏幕 我还尝试将数据网格放入 resizeLayoutPan
  • 在沙箱中运行 .Net 应用程序

    几个月来 我开发了一个个人工具 用于在线编译 C 3 5 Xaml 项目 基本上 我使用 CodeDom 编译器进行编译 我正在考虑将其公开 但问题是使用此工具在服务器上执行任何操作都非常非常容易 我想保护我的服务器的原因是因为有一个 运行
  • 将php字符串分割成不同长度的块

    我正在寻找将字符串拆分为数组的方法 类似于str split 其中块的大小都不同 我可以通过用一堆循环遍历字符串来做到这一点substr 但这看起来既不优雅也不高效 是否有一个接受字符串和数组的函数 例如 1 18 32 41 108 12
  • 是否可以识别哈希类型?

    我知道您可以比较长度 但许多哈希类型具有相同的长度 有没有办法识别哈希的类型以及它是否已加盐 例如 hash 2bf231b0e98be99a969bd6724f42a691 hash 4ac5a4ff764807d6ef464e27e4d
  • 如何从 Laravel URL 中删除 /public/ [重复]

    这个问题在这里已经有答案了 我想删除 public 来自我的 Laravel 5 URL 的片段 我不想运行虚拟机 这在项目之间切换时看起来很尴尬 我不想将文档根目录设置为公共文件夹 这在项目之间切换时也很尴尬 我尝试过 htaccess
  • p:steps 但启用点击所有步骤

    我有使用标签的 primefaces 步骤
  • 如何解决 Java 泛型中由交集类型引起的不明确方法?

    我最近发现您可以在单个类型参数绑定中指定多个类型 请参阅示例 与任何新工具一样 我一直在尝试探索如何使用 和滥用 它的可能性 我精心设计了这个例子来帮助说明 在下面的示例中 编译器给我一个错误 调度 新 AlphabetSoup 方法dis
  • CSS 背景不透明度[重复]

    这个问题在这里已经有答案了 我正在使用类似于以下代码的东西 div style background image url div Text div div 我预计这将使背景的不透明度为 0 4 文本的不透明度为 100 相反 它们的不透明度
  • 使div边框的一部分透明html

    我可以使 div 边框的一部分 从 x1 到 x2 透明吗 如果没有 您可以建议什么方法 我的想法 非常糟糕 是在 canvas 元素中绘制边框并将其放置在 div 元素上 画布主体是透明的 由于 DIV 只有 4 个元素 上 下 左 右
  • 如何四舍五入到最接近的 10(或 100 或 X)?

    我正在编写一个函数来绘制数据 我想为 y 轴指定一个很好的整数max大于数据集的最大值 具体来说 我想要一个函数foo执行以下操作 foo 4 5 foo 6 1 10 maybe 7 would be better foo 30 1 40
  • Google OAuth 2.0 include_granted_scopes 不适用于已安装的应用程序

    我正在尝试使用新的增量授权对于已安装的应用程序 以便将范围添加到现有授权 同时保留现有范围 这是使用新的完成的include granted scopes true范围 但是 无论我尝试什么 重新授权总是会完全覆盖范围 这是我编写的用于演示
  • 删除我的 Rails 答案中不必要的 HTTP 标头

    我目前正在开发一个 API 其中大小很重要 我希望答案包含尽可能少的字节 我优化了 JSON 答案 但 Rails 仍然响应许多奇怪的标头 HTTP 1 1 200 OK Server nginx 0 7 67 Not from Rails
  • 创建一个运行程序的新任务

    我需要定义一个自定义任务来计算主类的名称然后运行它 我在想这样的事情 customTask mainClass compute main class name based on env runMain mainClass jvm args
  • 使用 ggplot2 绘制二部网络图

    我有以下数据框 structure list X1 structure c 1L 1L 1L 1L 1L 1L 1L 1L 2L 2L 2L 2L 2L 2L 2L 2L 2L 2L 3L 3L 3L 3L 4L 4L 4L 4L 4L 5